等価演算と比較演算のための 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 サイトの他の関連記事を参照してください。