ホームページ > バックエンド開発 > C++ > 浮動小数点比較には Double.Epsilon を使用する必要がありますか?

浮動小数点比較には Double.Epsilon を使用する必要がありますか?

Linda Hamilton
リリース: 2025-01-05 04:58:42
オリジナル
488 人が閲覧しました

Should I Use Double.Epsilon for Floating-Point Comparisons?

浮動小数点比較における 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 メソッドは、より大きい、より小さいに対して適用できます。 、以下、および以上:

  • より大きい: ×> y && !AboutEqual(x, y)
  • 未満: x
  • 以下: AboutEqual(x, y) || ×< y
  • 以上: AboutEqual(x, y) || ×> y

追加の考慮事項:

特に計算値を扱う場合、切り捨てエラーが蓄積する可能性があることに注意することが重要です。したがって、適切な精度を実現するには、イプシロン値を適宜調整する必要がある場合があります。

以上が浮動小数点比較には Double.Epsilon を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート