浮動小数点比較における Double.Epsilon
質問:
の MSDN ドキュメントDouble.Epsilon は、浮動小数点間の等しいかどうかを判断するために使用すべきではないと述べています。数字。ただし、一部のリソースでは、比較にこれを使用することを推奨しています。 Double.Epsilon を等価性やその他の比較 (大なり小なりなど) に使用できますか?
答え:
Epsilon 値は、表現可能な最小値を表します。 -denormal 0 以外の浮動小数点値。比較におけるイプシロンの自然な候補のように見えるかもしれませんが、十分な精度ではありません。
Double.Epsilon は、表現可能な最小の切り捨て誤差を反映していますが、比較される数値の大きさによって大きく異なります。たとえば、1 に近い 2 つの数値の場合、Double.Epsilon は 0.0000000000000002220446 になる可能性がありますが、1,000,000,000,000,000 に近い 2 つの数値の場合、それは 222,044,604,925,093,800 になる可能性があります。これは、等価性やその他の比較に Double.Epsilon に依存すると、一貫した結果が得られないことを意味します。
等価性に関する代替イプシロン推定:
浮動小数点を比較するための 1 つの推奨アプローチ-等価性のポイント値は、定数 * 1E-15 のイプシロンを使用することです。これは、Double 型が値を 15 桁まで正確に表現できることと近似します。例:
public static bool AboutEqual(double x, double y) { double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; return Math.Abs(x - y) <= epsilon; }
比較演算子:
Double.Epsilon は比較に直接使用できませんが、AboutEqual メソッドは、より大きい、より小さいに対して適用できます。 、以下、および以上:
追加の考慮事項:
特に計算値を扱う場合、切り捨てエラーが蓄積する可能性があることに注意することが重要です。したがって、適切な精度を実現するには、イプシロン値を適宜調整する必要がある場合があります。
以上が浮動小数点比較には Double.Epsilon を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。