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
パイソン
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
どのように解決するのですか?
おそらく (0.3 != 0.3) に最適化されているのでしょう。これは明らかに間違っています。最適化の設定を確認し、それらがオフになっていることを確認して、もう一度試してみてください。
関連
-
[解決済み] コアOCamlにおける浮動小数点数の絶対値
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] 通貨を表すのにDoubleやFloatを使ってはいけないのですか?
-
[解決済み】IEEE754のNaN値に対して、すべての比較がfalseを返す根拠は何ですか?
-
[解決済み] 単精度浮動小数点演算と倍精度浮動小数点演算はどう違うのですか?
-
[解決済み] Python 3 で浮動小数点値 4*0.1 はきれいに見えるのに、3*0.1 はそう見えないのはなぜですか?
-
[解決済み] なぜNaNはNaNと等しくないのですか?[重複あり]
-
[解決済み] quiet NaNとsignaling NaNの違いは何ですか?
-
[解決済み] 2つの不等な浮動小数点数の引き算で0を得ることは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Lisp: なぜ (- 1e16 1) は 999999999999 ではなく 1000000000000 になるのでしょうか?
-
[解決済み] コアOCamlにおける浮動小数点数の絶対値
-
[解決済み】IEEE754のNaN値に対して、すべての比較がfalseを返す根拠は何ですか?
-
[解決済み] 単精度浮動小数点演算と倍精度浮動小数点演算はどう違うのですか?
-
[解決済み] なぜNaNはNaNと等しくないのですか?[重複あり]
-
[解決済み] quiet NaNとsignaling NaNの違いは何ですか?
-
[解決済み] 2つの不等な浮動小数点数の引き算で0を得ることは可能ですか?
-
[解決済み] 16ビット、32ビット、64ビットのIEEE-754システムで表現できる数値の範囲は?