11

これは浮動小数点値の等価性のテストのフォローアップです: 「精度」定数の標準名はありますか? . 等しい、より大きい、より小さい、より小さいか等しい、より大きいか等しい
という非常によく似た質問があります。Double.Epsilon


2 つの浮動小数点値xyの等価性テストは、(単純な = ではなく) 次のように見える必要があることはよく知られています。

abs( x - y ) < epsilon   、ここでepsilonは非常に小さな値です。

epsilonの値を選択する方法は?

等値チェックで可能な限り最高の精度を得るために、イプシロンにできるだけ小さい値を選択することが明らかに望ましいでしょう。

例として、.NET フレームワークは定数System.Double.Epsilon(= 4.94066 × 10 -324System.Double ) を提供します。これは、ゼロより大きい最小の正の値を表します。

ただし、次の理由から、この特定の値をepsilonとして確実に使用できないことが判明しました。

0 + System.Double.Epsilon≠  0

1 + System.Double.Epsilon= 1 (!)

これは、私が正しく理解していれば、その定数はマシンの epsilonより小さいためです。

→これでいいの?

→ これは、イプシロン := マシン イプシロンを等価テストに 確実に使用できるという意味でもありますか?

これらの 2 つの質問は、上記のリンク先の 2 番目の SO 質問で既に適切に回答されているため、削除しました。


リンク先のウィキペディアの記事では、64 ビット浮動小数点数 (つまりdouble、多くの言語の型) の場合、マシンのイプシロンは次のようになります。

2 -53、または約。0.000000000000000111 (小数点以下ゼロ15個の数値)

→ このことから、すべての 64 ビット浮動小数点値は (15 ではないにしても) 14 桁まで正確であることが保証されるということになりますか?

4

4 に答える 4

11

イプシロンの値を選択するには?

簡単な答え:アプリケーションのニーズに合った小さな値を使用します。

長い答え:アプリケーションがどのような計算を行い、結果がどれほど正確であるかを知ることは誰にもできません。丸め誤差が合計されるため、マシンのイプシロンはほとんど常に大きすぎるため、独自の値を選択する必要があります。必要に応じて、0.01 で十分な場合もあれば、0.00000000000001 以下で十分な場合もあります。

問題は、浮動小数点値の等値テストを本当にしたい/する必要があるかということです。おそらく、アルゴリズムを再設計する必要があります。

于 2010-07-19T13:21:49.570 に答える
5

過去にイプシロン値を使用しなければならなかったとき、マシンのイプシロン値よりもはるかに大きくなりました。

(64 ビット double ではなく) 32 ビット double の場合でしたが、特定のアプリケーションで計算された値のほとんど (すべてではないにしても) には 10 -6のイプシロン値が必要であることがわかりました。

選択するイプシロンの値は、数値のスケールによって異なります。非常に大きなもの(10 +10など)を扱っている場合は、有効桁数が小数部まであまり伸びないため (仮にあったとしても)、イプシロンの値を大きくする必要があるかもしれません。非常に小さいもの(10 -10など)を扱っている場合は、明らかにこれよりも小さいイプシロン値が必要です。

実験を行い、計算を実行し、出力値の違いを確認する必要があります。潜在的な答えの範囲を知っている場合にのみ、アプリケーションに適した値を決定できます。

于 2010-07-19T13:20:10.577 に答える