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's */
int y = x;
printf("%d\n", y);
return 0;
}
結果が予期されたものから予期しないものに切り替わる値を計算しようとしたときに、この質問の定数にたどり着きました。