Приветствую. Столкнулся с невполне понятной ситуацией - изменение точности рассчетов с числами с плавающей точкой. Простейший пример:
$ cat test.c
#include <stdio.h>
int main()
{
double x = 1.23523999932567346;
double y;
unsigned int i;
for (i = 1; i < 100000; i *= 10)
{
y = x*i;
printf("%.32f * %d = %.32f\n", x, i, y);
}
return 0;
}
Результат исполнения:
$ ./a.out |column -t
1.23523999932567352111334457731573 * 1 = 1.23523999932567352111334457731573
1.23523999932567352111334457731573 * 10 = 12.35239999325673565522265562321991
1.23523999932567352111334457731573 * 100 = 123.52399993256734944679919863119721
1.23523999932567352111334457731573 * 1000 = 1235.23999932567357973312027752399445
1.23523999932567352111334457731573 * 10000 = 12352.39999325673488783650100231170654
С 17 символа результата умножения идут существенные различия. Т.е. результат умножения отличен от того, что бы получил я, сделав это руками.
С чем это связано(с принципом хранения чисел с п.т. или ...)? Как этого избежать(long double также не спасает). Что почитать? Спасибо