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

倍精度浮動小数点数の比較に Double.Epsilon をいつどのように使用する必要がありますか?

DDD
DDDオリジナル
2025-01-05 17:04:43290ブラウズ

When and How Should Double.Epsilon Be Used for Comparing Double-Precision Floating-Point Numbers?

等価演算と比較演算のための Double.Epsilon

Double.Epsilon 定数は、最小の正の浮動小数点を保持しますゼロに丸めずに double として表現できる数値。これは浮動小数点比較のガイドとして意図されていますが、ドキュメントがわかりにくい場合があります。

Can Double.Epsilon Be Used for Direct Comparison?

いいえ。 Double.Epsilon は、可能な最小の切り捨て誤差を定義します。これは、数学演算を実行する場合、丸めにより浮動小数点数が Double.Epsilon を超える差が生じる可能性があることを意味します。したがって、直接比較に Double.Epsilon を使用すると、数学的等価性が正確に反映されない可能性があります。

正確な比較のための代替案

次の代替案を検討してください:

  • 単純なイプシロンの計算:単純な等価比較の場合、比較される値の大きさに基づいて小さなイプシロンを使用できます。例:
public static bool ApproximatelyEqual(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}
  • 相対許容差: 相対許容差を使用して、大きさの違いを考慮します。例:
public static bool ApproximatelyEqualRelative(double x, double y, double tolerance) {
    return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance;
}

その他の比較演算の実装

より大きい (>) と未満 (<) の比較を実装するには、反転します。に使用されるロジック等しい:

  • より大きい:

    public static bool GreaterThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) > 0;
    }
  • 小さい以下:

    public static bool LessThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0;
    }

以上 (>=) および以下 (<=) の比較の場合は、上記の実装をそれに応じて変更します。

public static bool GreaterThanOrEqual(double x, double y) {
    return ApproximatelyEqualRelative(x - y, y, 1E-15) >= 0;
}

public static bool LessThanOrEqual(double x, double y) {
    return ApproximatelyEqualRelative(x - y, y, 1E-15) <= 0;
}

これらの実装は単なる近似であり、正確な比較が必要な状況では注意して使用する必要があることに注意してください。重要です。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。