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. сколько из них до точки, а сколько после роли не играет — на то он и тип с плавающей точкой
если нужна точная арифметика в диапазоне от 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 |
|