1

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 ビットです。

4

2 に答える 2

4

浮動小数点ユニットの惑星へようこそ。残念ながら、現実の世界では、速度と表現の幅を広げるために、ある程度の精度を犠牲にする必要があります。それを避けることはできません:doubleおおよその表現にすぎません。実際には、数値を表現することはできませんが、有限の精度で表現できます。それでも、これは適切な近似値です。0.00000000001% 未満の誤差です。doubleこれは上限とは関係ありません。CPU の制限とは関係ありません。Python でさらに計算してみてください。

>>> 4.9999999999999996 / 5.
1.0
>>> 5. - 4.9999999999999996
0.0

見る?補足として、 の等価性を決してチェックしないでくださいdouble。近似等価性を使用してください。

if ((a - b) < EPSILON)

は非常EPSILONに小さい値です。おそらくJavaライブラリにはもっと適切なものがありますが、アイデアはわかります。

いくつかの理論に興味がある場合、浮動小数点演算の標準は IEEE754 です

于 2013-05-08T13:26:48.317 に答える