1. ホーム
  2. floating-point

Dの0.1 + 0.2 == 0.3はなぜか?

2023-12-05 05:28:30

疑問点

assert(0.1 + 0.2 != 0.3); // shall be true

は、言語がネイティブの浮動小数点演算を使用しているかどうかを確認する、私のお気に入りのチェックです。

C++

#include <cstdio>

int main()
{
   printf("%d\n", (0.1 + 0.2 != 0.3));
   return 0;
}

出力します。

1

http://ideone.com/ErBMd

パイソン

print(0.1 + 0.2 != 0.3)

出力します。

True

http://ideone.com/TuKsd

その他の例

なぜDには当てはまらないのでしょうか?Dはネイティブの浮動小数点数を使用していると理解しています。これはバグなのでしょうか?彼らは何か特定の数値表現を使用していますか?他の何か?かなり混乱しています。

D

import std.stdio;

void main()
{
   writeln(0.1 + 0.2 != 0.3);
}

出力します。

false

http://ideone.com/mX6zF


最新情報

感謝 LukeH . これは、浮動小数点定数折りたたみの効果です。 そこ .

コードです。

import std.stdio;

void main()
{
   writeln(0.1 + 0.2 != 0.3); // constant folding is done in real precision

   auto a = 0.1;
   auto b = 0.2;
   writeln(a + b != 0.3);     // standard calculation in double precision
}

出力します。

false
true

http://ideone.com/z6ZLk

どのように解決するのですか?

おそらく (0.3 != 0.3) に最適化されているのでしょう。これは明らかに間違っています。最適化の設定を確認し、それらがオフになっていることを確認して、もう一度試してみてください。