LINUX.ORG.RU

помогите прояснить ситуацию с обычным double-ом


0

0

не вдаваясь в подробности пришли к следующей проблеме: код: double S, D, *iptr;

S = 163.70 * 100; printf("S - %f\n",S);

D = modf(S, iptr);

printf("*iptr - %f\n D - %f\n", *iptr, D);

выводиться на экран: S - 16370.000000 *iptr - 16369.000000 D - 1.000000

причем если заменить вторую строку на S = 16370; все работает корректно, как впрочем и на многих других числах.


уточнение

код написан на Си компилятор - gcc version 3.2 (Mandrake Linux 9.0 3.2-1mdk)

say
() автор топика
Ответ на: комментарий от Murr

байда не в printf-е

все это дело родилось из следующего. Был написан драйвер к устройству, в котором сумма чека передается устройству хитрым образом: число разбивается на пары цифирь, каждая пара перекодируется и отправляется устройству. Все это дело происходит в цикле, где в завершающей итерации при делении 70 на 10 в нулевой степени, то бишь на единицу, результатом почаму-то оказывается 69, а не 70. Такое поведение обнаружено только для конкретной суммы в 163.70, другой такой суммы пока не нашли... Попытка использовать библиотечную функцию, описанная выше привела к аналогичным результатам, и что делать с этим не понятно.

инициализайию iptr просто пропустила, случайно, в компилируемом коде она присутствует.

say
() автор топика
Ответ на: комментарий от anonymous

вот зараза!!!

например с 0.10 оно копейку добавляет, и вообще таких грабельных чисел оказалось много

say
() автор топика
Ответ на: вот зараза!!! от say

Как дети, чес слово. Если мы не работаем с целыми числами, то не факт, что 2*2 будет равно 4, пора бы запомнить. Умножая 163.70 на 100 мы получаем не 16370, как хотелось бы, а 16369.9999... и т.д., что и демонстрирует modf. Проверить это легко - double преобразуется к целым значениям отбрасыванием дробной части, так что пишем printf("S - %ld\n",long(S)); и таращимся в монитор до просветления.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.