首頁 >後端開發 >C++ >如何使用 Double.Epsilon 進行精確的浮點比較?

如何使用 Double.Epsilon 進行精確的浮點比較?

Patricia Arquette
Patricia Arquette原創
2025-01-06 03:28:43920瀏覽

How Should Double.Epsilon Be Used for Accurate Floating-Point Comparisons?

用於浮點和雙精度比較的Double.Epsilon

問題:

System.Double.Epsilon 的MSDN 文件指出不應將其用作確定平等的差異幅度。如何使用 Double.Epsilon 進行浮點比較?

答案:

MSDN 的聲明具有誤導性。 Double.Epsilon 表示可表示的最小非零浮點數值。因此,它可以用作Stack Overflow 主題“What is the most effective way for float and double Comparison?”中提供的示例中的epsilon

為了相等,可以將合適的epsilon 估計為Math. Max( Math.Abs​​(x), Math.Abs​​(y)) * 1E-15,其中x 和 y是要比較的雙精度值。但是,請務必注意,截斷錯誤可能會累積,因此在比較計算值時可能需要更大的 epsilon。

要實現相等、大於、小於、小於或等於、大於或等於,可以使用以下程式碼:

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;
}

public static bool GreaterThan(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x > y + epsilon;
}

public static bool LessThan(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x < y - epsilon;
}

public static bool LessThanOrEqualTo(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x <= y + epsilon;
}

public static bool GreaterThanOrEqualTo(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x >= y - epsilon;
}

以上是如何使用 Double.Epsilon 進行精確的浮點比較?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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