C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
вопрос по типу double, вопрос по типу double
noname
Отправлено: 08.08.2004, 18:14


Не зарегистрирован







Пожайлуста объясните сколько знаков после запятой хранит тип double.
И почему следующий код

double a=31676767.1;
double b=5232323.1212;
double c=0;
c=a+b;
printf("%22.17f",c);
getch();
return 0;

выводит на экран

36909090.22120000420000000

Что это за 42 ? Также лишние цифры появлялись и при делении 31.1 на 5

6.22000000000000064

Возможно это из-за компилятора? Использую bcc 3.0 и BC++Builder 6.
Георгий
Отправлено: 08.08.2004, 22:35


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



double хранит 15-16 десятичных разрядов в диапазоне 5.0 x 10^–324 .. 1.7 x 10^308. сколько из них до точки, а сколько после роли не играет — на то он и тип с плавающей точкой smile.gif

если нужна точная арифметика в диапазоне от 922337203685477.5808 до 922337203685477.5807 то используйте тип Currency — от считает без ошибок.

а по поводу double — возможно printf не корректно обрабатывает — диапазона должно хватать (гарантируется 15-16 разрядов). может это изза того, что формат в printf не правильно задан: если написать 17.4 то всё будет нормально.

кстати у вас было написано 22.17 это означает 21 значащая десятичная цифра, а точность в 21 десятичный разряд ни один из базовых типов не даст. если действительно необходима такая высокая точность значений в таком большом диапазоне, то ищите классы арифметики с произвольной точностью.

Отредактировано Георгий — 08/08/2004, 23:39
noname
Отправлено: 09.08.2004, 07:11


Не зарегистрирован







Сомневаюсь, что это из-за длины точности printf'a т.к. всякие "побочные разряды" действительно есть в памяти (эксперементирвал с арифметическими операторами — например *100000000 последний прмер(с 6,22)- выдает целую часть и в дробной 64 сохраняется)
Спасибо за предложение типа Currency. Но это не совсем то, что надо.
Мне необходимо 5 знаков до запятой и 10-15 после(причем никаких странных чисел!).Есть идея хранить число в двух переменных int : в одной все значащие цифры — в другой степень 10-ти, отвечающая за кол-во знаков после запятой(например 6.22 — 622 и 2 ).
Что за классы орифметики с произвольной точностью?
Георгий
Отправлено: 09.08.2004, 08:17


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



5 до 14-15 после должен обеспечивать тип long double

Вернуться в Вопросы программирования в C++Builder