8

浮動小数点値は不正確です。そのため、比較で厳密な数値の等式を使用することはめったにありません。たとえば、Javaでは、これは次のように出力されますfalseideone.comで見られるように)。

System.out.println(.1 + .2 == .3);
// false

通常、浮動小数点計算の結果を比較する正しい方法は、ある期待値に対する絶対差が、許容されるイプシロンよりも小さいかどうかを確認することです。

System.out.println(Math.abs(.1 + .2 - .3) < .00000000000001);
// true

問題は、いくつかの操作が正確な結果をもたらすことができるかどうかについてです。有限でない浮動小数点値x(つまり、NaNまたは無限大)の場合、x - x常に NaNです。

しかし、xが有限である場合、これのいずれかが保証されますか?

  1. x * -1 == -x
  2. x - x == 0

(特に私はJavaの動作に最も興味がありますが、他の言語についての議論も歓迎します。)


それが価値があることについては、私は(そして私はここで間違っているかもしれませんが)答えはイエスだと思います!有限のIEEE-754浮動小数点値に対して、その反数が常に正確に計算可能であるかどうかに要約すると思います。たとえば、符号専用のビットが1つあるのでfloatこれdoubleが当てはまるようです。これは、反数を見つけるために符号ビットを反転するだけでよいためです(つまり、仮数はそのままにしておく必要があります)

関連する質問

4

2 に答える 2

3

x-x両方の結果は、とx * -1同じ精度の浮動小数点数として正確に表現できるため、IEEE754浮動小数点では両方の同等性が保証されxます。この場合、丸めモードに関係なく、準拠する実装によって正確な値が返される必要があります。

編集:例との比較.1 + .2

IEEE 754では、に渡すためにそれらを表すことができないため、を.1追加することはできません。加算、減算、乗算、除算、および平方根は、丸めモードに応じて、タイを処理するルールに最も近い、すぐ下、すぐ上にある一意の浮動小数点値を返します。Rの同じ引数。したがって、結果(R)が浮動小数点数として表現できる場合、この数値は丸めモードに関係なく自動的に結果になります。.2+

0.1コンパイラーで、警告なしに別の表現可能な数値の省略形として記述できるという事実は、これらの操作の定義と直交しています。- (0.1)たとえば、あなたが書くとき、-それは正確です:それはその引数の正反対を返します。一方、その引数はではなく0.1doubleコンパイラが代わりに使用する引数です。

x * (-1)要するに、操作が正確である理由の別の部分は、-1として表すことができるということdoubleです。

于 2010-08-30T10:38:37.983 に答える
2

真ではなくx - xあなたに与えるかもしれませんが、に等しいと比較するので、有限数からそれ自体を引いたものはゼロに等しいと比較するという仮定で安全になります。-00-00

xx == 0がfalseであるxの浮動小数点値はありますか?を参照してください。詳細については。

于 2010-08-30T12:32:04.593 に答える