Я обнаружил на своей x86 VM (32 бит) следующую программу:
#include <stdio.h>
void foo (long double x) {
int y = x;
printf("(int)%Lf = %d\n", x, y);
}
int main () {
foo(.9999999999999999999728949456878623891498136799780L);
foo(.999999999999999999972894945687862389149813679978L);
return 0;
}
Производит следующий вывод:
(int)1.000000 = 1
(int)1.000000 = 0
Идеал также производит такое поведение.
Что делает компилятор, чтобы это произошло?
Я нашел эту константу, поскольку я отслеживал, почему следующая программа не произвела 0
как я ожидал (используя 19 9
вызвал 0
я ожидал):
int main () {
long double x = .99999999999999999999L; /* 20 9 */
int y = x;
printf("%d\n", y);
return 0;
}
Когда я попытался вычислить значение, при котором результат переключается с ожидаемого на неожиданное, я пришел к константе, о которой идет речь.