0

私が理解していることから、有名な

 (0.1 + 0.2) !== 0.3

gotchaは実際にはJavascriptのせいではありません。これがIEEE754の動作方法です。同様の出力がPythonでも発生します。これも、IEEE754ルールに従います。

それでは、なぜこの特定の例がCで期待どおりに機能するのでしょう。直接比較すると

printf("%d\n", (0.1+0.2) == 0.3);

(予期しない)出力0が得られますが、値を変数に入れたり、出力したりすると、適切に丸められた回答が得られます。

C実行可能な例

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

言い換えられた質問は次のとおりです。

  1. なぜ(そしていつ、そしてどのように)Cコンパイラは自由にそれを言うのですか?

    0.3 == 0.30000000000000004

  2. すべての事実を考えると、JavascriptではなくCの実装が壊れているというのは本当ではありませんか?

4

3 に答える 3

4

なぜ(そしていつ、そしてどのように)Cコンパイラは自由にそれを言うのですか?

    0.3 == 0.30000000000000004

すべての事実を考えると、JavascriptではなくCの実装が壊れているというのは本当ではありませんか?

そうではありません。

与えられた出力はこのコードからのものです:

printf ("%d\n", ((((double)0.1)+((double)0.2)) == ((double)d3)));

しかし、あなたは書いた:

d1 = 0.1;    d2 = 0.2;    d3 = d1 + d2;

そうd3ではありません 0.3、それは0.30000000000000004

于 2012-07-03T10:04:37.737 に答える
1
`printf("%d\n", (0.1+0.2) == 0.3);`

これらはFLOATではなくDOUBLEです。

行う:

printf("%d\n", (0.1+0.2) == 0.3);
printf("%d\n", (0.1f+0.2f) == 0.3f);

そして出来上がり!

http://codepad.org/VF9svjxY

Output:
0
1

この質問をチェックしてください。それは他のsmthについてですが、GCCを使用したpplは、MSVCを使用したpplとは異なる結果を取得しました。 浮動小数点数の整数部分を印刷する

于 2012-07-03T09:58:21.510 に答える
0

サンプルコードでは、1、2、および(1 + 2)を使用しています。これらはすべて、倍精度浮動小数点で正確に表現できます。一方、0.1は浮動小数点で正確に表現できないため、この数値の近似値が得られます。約0.1から約0.2を追加すると、約0.3になりますが、それが0.3を表すときにコンパイラが選択するのとまったく同じ近似になるかどうかは、誰にわかりますか。

表現はバイナリを使用しています。つまり、1 / 2、1 / 4、1 / 8、1 / 16、1 / 32を使用します(さまざまな精度で....など)。これは、0.5、0.25などを正確に表現できることを意味します。2進数の分数の正確な合計ではない数値は、非常に厳密に概算できます。

解決策:浮動小数点数を互いに比較しないでください。それらの違いを、気にしない少数の数と比較してください。

#define EPSILON 0.000001
printf("%d", fabs((0.1+0.2) - 0.3 ) < EPSILON );

Cコードが機能し、python/javascriptが機能しない理由がわかりません。魔法です。しかし、うまくいけば、これはとにかくあなたの質問に答えます。

于 2012-07-03T09:53:30.890 に答える