私が理解していることから、有名な
(0.1 + 0.2) !== 0.3
gotchaは実際にはJavascriptのせいではありません。これがIEEE754の動作方法です。同様の出力がPythonでも発生します。これも、IEEE754ルールに従います。
それでは、なぜこの特定の例がCで期待どおりに機能するのでしょうか。直接比較すると
printf("%d\n", (0.1+0.2) == 0.3);
(予期しない)出力0
が得られますが、値を変数に入れたり、出力したりすると、適切に丸められた回答が得られます。
IEEE 754のC実装は何か特別なことをしていますか?それとも、私が見逃しているのはまったく別のことですか。
アップデート
私が投稿したコードサンプルは、タイプミスのために壊れていました。これを試してください FixedCRunnable Example
しかし、元の質問はまだ残っています。
double d1, d2, d3;
d1 = 0.1; d2 = 0.2; d3 = d1 + d2;
printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));
printf ("%.17f\n", d1+d2);
printf ("%d\n", ((d1+d2) == d3));
出力は
1
0.30000000000000004
1
言い換えられた質問は次のとおりです。
なぜ(そしていつ、そしてどのように)Cコンパイラは自由にそれを言うのですか?
0.3 == 0.30000000000000004
すべての事実を考えると、JavascriptではなくCの実装が壊れているというのは本当ではありませんか?