有限の浮動小数点値の場合、x -x == 0が保証されていますか?
-
02-10-2019 - |
質問
フローティングポイント 値は不正確であるため、比較で厳格な数値等式を使用することはめったにありません。たとえば、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 浮動小数点値、its 加法逆 常に正確に計算可能です。例えば float
と double
もっている サインのためだけに1つの専用ビット, 、これは事実のようです。なぜなら、添加剤を見つけるためにサインビットをひっくり返すだけであるため(つまり、 重要です そのままにしておく必要があります)。
関連する質問
解決
それでも x - x
あなたに与えるかもしれません -0
真ではなく 0
, -0
に等しいと比較されます 0
, 、したがって、有限数のマイナス自体がゼロと等しくなるという仮定で安全になります。
見る xx == 0がfalseであるxの浮動小数点値はありますか? 詳細については。
他のヒント
両方の結果は、両方の結果が x-x
と x * -1
同じ精度の浮動小数点数とまったく同じように表現可能です x
. 。この場合、丸めモードに関係なく、準拠の実装によって正確な値を返す必要があります。
編集:比較 .1 + .2
例。
追加できません .1
と .2
IEEE754であなたはそれらを表現することができないので、 +
. 。追加、減算、乗算、分割、および平方根は、丸めモードに応じて、すぐに、ネクタイを処理するためのルールで最も近い一意の浮動小数点値を返します...同じ議論 r. 。したがって、結果が(in r)たまたま浮動小数点数として表現可能であるため、この数値は丸めモードに関係なく自動的に結果になります。
あなたのコンパイラがあなたに書くことができるという事実 0.1
警告なしの別の、表現可能な数字の速記として、これらの操作の定義に直交することです。あなたが書くとき - (0.1)
たとえば、 -
正確です:それはその議論の正反対を返します。一方、その議論はそうではありません 0.1
, 、 しかし double
コンパイラがその代わりに使用すること。
要するに、操作が x * (-1)
正確です -1
として表すことができます double
.