浮動小数点値は不正確です。そのため、比較で厳密な数値の等式を使用することはめったにありません。たとえば、Javaでは、これは次のように出力されますfalse
(ideone.comで見られるように)。
System.out.println(.1 + .2 == .3);
// false
通常、浮動小数点計算の結果を比較する正しい方法は、ある期待値に対する絶対差が、許容されるイプシロンよりも小さいかどうかを確認することです。
System.out.println(Math.abs(.1 + .2 - .3) < .00000000000001);
// true
問題は、いくつかの操作が正確な結果をもたらすことができるかどうかについてです。有限でない浮動小数点値x
(つまり、NaN
または無限大)の場合、x - x
は常に NaN
です。
しかし、x
が有限である場合、これのいずれかが保証されますか?
x * -1 == -x
x - x == 0
(特に私はJavaの動作に最も興味がありますが、他の言語についての議論も歓迎します。)
それが価値があることについては、私は(そして私はここで間違っているかもしれませんが)答えはイエスだと思います!有限のIEEE-754浮動小数点値に対して、その反数が常に正確に計算可能であるかどうかに要約すると思います。たとえば、符号専用のビットが1つあるのでfloat
、これdouble
が当てはまるようです。これは、反数を見つけるために符号ビットを反転するだけでよいためです(つまり、仮数はそのままにしておく必要があります)。