我在我的 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
s 产生了0
我的预期):
int main () {
long double x = .99999999999999999999L; /* 20 9's */
int y = x;
printf("%d\n", y);
return 0;
}
当我试图计算结果从预期切换到意外时的值时,我得出了这个问题所涉及的常数。