Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
#1

Как из числа double 4.056 извлечь число 1000? - C++

12.06.2012, 14:50. Просмотров 674. Ответов 12
Метки нет (Все метки)

То есть число это читается так: 4 целых 56 тысячных, вот мне нужно тысячу извлечь программно. Функции, предлагаемые math.h извлекают либо целую часть 4 либо дробную 0.056

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int main () {
 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 double x= 4.056;
 double y;
 double* ipart= new double;
 y= modf (x, ipart);
 
 printf ("y= %f\n", y);
 printf ("*ipart= %f\n", *ipart);
 getchar ();
}
Вот максимум, на что я сподобился. Спасибо, кто откликнется!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 14:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как из числа double 4.056 извлечь число 1000? (C++):

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

Извлечь значения из std::vector<char>, трактуя каждый символ, как разряд числа, сформировать это число - C++
Доброго времени суток. Есть вектор char std::vector &lt; char &gt; VECT; Его содержимое, например VECT == 43 '+' VECT ==...

Даны числа от 1 до 1000 и число m. Вывести результат умножение куба нечетных сотен на число m - C++
как записать?

Извлечь 3 бита целого числа A с позиции n и перенести в число B на позицию m - C++
Доброго времени суток.Дана вот такая задача : извлечь 3 бита числа А, начиная с позиции n, и вставить их в число В, начиная с позиции...

Разбить число типа double на 2 числа - C++
Добрый день! Попалась мне такая задача - есть 2 интовые переменные, есть число double. Их нужно сложить таким образом : к 1-му интовому...

Как из 4-х байт, составляющих число типа double, получить это число? - C++
Как из 4-х байт, составляющих число типа double, получить это число? Пример: unsigned char tmp={63,128,0,0}; // значение double=1.0

12
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.06.2012, 16:21 #2
Если учесть особенности представления чисел с плавающей точкой, то надеяться на надёжную работу таких алгоритмов не приходится. Тем не менее, если не погнушаться грязью, можно тупо умножать число на 10 до тех пор, пока дробная часть не станет достаточно малой:
C++
1
2
3
4
5
6
7
int Silly(double x)  // возвращает количество нулей (для 1000 вернёт 3, для целого аргумента 0), работает только для положительных аргументов
{
    int silly = 0;
    const double eps = 1e-6;
    for(; x - floor(x) > eps; x *= 10);
    return silly;
}
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
12.06.2012, 16:39  [ТС] #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
можно тупо умножать число на 10
мне в голову такое не пришло, тогда так попробую:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <windows.h>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int main () {
 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 double x= 4.056;
 double x_0= x;
 double* ipart= new double;
 
 
 int i= 0;
 while (modf (x_0, ipart)) {
  x_0*= 10;
  i++;
 }
 
 printf ("i= %d\n", i);
 
 getchar ();
}
множу на 10 и просто сравниваю дробную часть с нолём и всё.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
28.06.2012, 20:06  [ТС] #4
Опровергаю тык скыть своё решение. методом научного тыка я выяснил, что дробная часть числа 4.056 совсем необязательно 0.056

То есть сперва она такова: (так выглядит по крайней мере)
C++
1
4.056000
Так, а при у множении на 10 картина получается такой:
C++
1
40.560000
Или (к примеру) такой
C++
1
40.560002
...Второй вариант многовероятен и оттого грустен. Ибо мне уже в самом лучшем случае умножая число на 10 и сравнивая дробную часть с нолём, 1000 никак не получить, а в лучшем случае получить 10000000
0
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
28.06.2012, 20:22 #5
Может быть вот так?:
C++
1
2
3
4
5
    double x;
 
    cout << "Введите число: ";
    cin >> x;
    cout << "Тысячная часть равна " << (x - int(x)) * 1000 << endl;
0
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
28.06.2012, 20:35 #6
Еще скриншот сделал.
0
Миниатюры
Как из числа double 4.056 извлечь число 1000?  
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
28.06.2012, 20:56  [ТС] #7
У тебя получилось случайно. У меня тоже иногда получался такой результат, а иногда нет.
0
grizlik78
Эксперт С++
1956 / 1449 / 115
Регистрация: 29.05.2011
Сообщений: 3,007
28.06.2012, 21:05 #8
Из-за упомянутых уже особенностей представления дробных чисел задача практически нерешаемая. Без округлений тут ничего не выйдет. А с ними результат может и не быть похожим на ожидаемый.
Можно через строковое представление что-то получить, но этот метод тоже ограничен.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <math.h>
#include <string.h>
 
int main () {
    double x = 4.056;
    int n;
    char *ptr, str[20];
 
    sprintf(str, "%f", x);
    for (ptr = str; *ptr && *ptr != '.'; ++ptr)
        ;
 
    n = strlen(ptr);
    while (n > 0 && ptr[--n] == '0')
        ptr[n] = '\0';
 
    if (*ptr)
        *(ptr++) = '\0';
 
    for (; *ptr && *ptr == '0'; ++ptr)
        ;
 
    if (n > 0)
        printf("%f = %s + %s / %.0f\n", x, str, ptr, pow(10, n));
    else
        printf("%f is integer\n", x);
 
    return 0;
}
http://liveworkspace.org/code/740f41...1b1fc35f047f4f
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
29.03.2013, 12:37  [ТС] #9
пожалуй, самый надёжный способ
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
29.03.2013, 14:10 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main () 
{
 
 double x = 4.056;
 double y = x  -  int(x)  ;
 for (; y / 1.0 > 0;)
  y = y * 10;
 cout << y;
 
 return 0;
}
вот можно попробовать, правда есть проблема в строчке
C++
1
 double y = x  -  int(x)  ;
цепляется мусор в конец
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
29.03.2013, 14:18  [ТС] #11
Так в том и дело, а цепляется потому, что 0.056 находится в памяти в шестнадцатеричном виде, и в шестнадцатиричном виде оно там с хвостом. Ну то есть 0.75 будет без хвоста, а 0.056 с хвостом. И никуда от этого хвоста не деться. Способ grizlik78, лучший поэтому.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.03.2013, 14:38 #12
kravam, а в связи с чем возникла задача извлекать тысячные из double? Может имеет смысл изначально работать с типами (создать свой класс например), которые не допустят появления "хвоста"?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
29.03.2013, 14:41  [ТС] #13
Я забыл уже, это давно было.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 14:41
Привет! Вот еще темы с ответами:

Вывести long double число без перевода в double - C++
Надо вывести long double число без перевода в double. Пишу: printf(&quot;%Lf&quot;,S); и выводится неверно. Компилятор -- MinGW, та же фишка на...

Работа цикла - считывание 1000 элементов (double) - C++
Народ помогите с циклом, считаю 1000 элементов (double) и на последнем ходе происходит какой-то сбой, при этом 999 считает нормально....

Как извлечь корень из числа? - C++
Как извлечь корень из числа?

Как извлечь числа из строки - C++
Предположим что есть такое выражение и оно записано в блокноте (100;200) , Как извлечь из текстового документа 2 числа 100 и 200? понимаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
29.03.2013, 14:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru