首頁 >後端開發 >C++ >何時以及如何使用 Double.Epsilon 來比較雙精確度浮點數?

何時以及如何使用 Double.Epsilon 來比較雙精確度浮點數?

DDD
DDD原創
2025-01-05 17:04:43259瀏覽

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

用於相等和比較運算的Double.Epsilon

Double.Epsilon 量儲存最小的正浮常數可以表示為雙精度數而不捨入為零的數字。它旨在作為浮點比較的指南,但其文件可能會令人困惑。

Double.Epsilon 可以用來直接比較嗎?

不能。 Double.Epsilon 定義可能的最小截斷誤差。這意味著在執行數學運算時,由於四捨五入,浮點數的差異可能超過 Double.Epsilon。因此,使用 Double.Epsilon 進行直接比較可能無法準確反映數學相等性。

準確比較的替代方案

考慮以下替代方案:

  • 簡單的Epsilon 計算:
簡單的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;
}
<的等式比較時,您可以根據比較值的大小使用較小的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn