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
Python
print(0.1 + 0.2 != 0.3)
出力:
True
その他の例
- Java: http: //ideone.com/EPO6X
- C#: http: //ideone.com/s14tV
なぜこれはDには当てはまらないのですか?理解しているように、Dはネイティブの浮動小数点数を使用します。これはバグですか?特定の数値表現を使用していますか?他に何かありますか?かなり紛らわしい。
D
import std.stdio;
void main()
{
writeln(0.1 + 0.2 != 0.3);
}
出力:
false
アップデート
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