Javaの次の式では、
new Double(1.0E22) + new Double(3.0E22) = 4.0E22
しかし
new Double(1.0E22) + new Double(4.0E22) = 4.9999999999999996E22
私はそれを期待していました5.0E22
。ダブルリミットは1.7976931348623157E308
です。あなたの助けに感謝。私のマシンのアーキテクチャは x64 で、JVM も 64 ビットです。
浮動小数点ユニットの惑星へようこそ。残念ながら、現実の世界では、速度と表現の幅を広げるために、ある程度の精度を犠牲にする必要があります。それを避けることはできません:double
はおおよその表現にすぎません。実際には、数値を表現することはできませんが、有限の精度で表現できます。それでも、これは適切な近似値です。0.00000000001% 未満の誤差です。double
これは上限とは関係ありません。CPU の制限とは関係ありません。Python でさらに計算してみてください。
>>> 4.9999999999999996 / 5.
1.0
>>> 5. - 4.9999999999999996
0.0
見る?補足として、 の等価性を決してチェックしないでくださいdouble
。近似等価性を使用してください。
if ((a - b) < EPSILON)
は非常EPSILON
に小さい値です。おそらくJavaライブラリにはもっと適切なものがありますが、アイデアはわかります。
いくつかの理論に興味がある場合、浮動小数点演算の標準は IEEE754 です。