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

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

Patricia Arquette
發布: 2025-01-06 03:28:43
原創
923 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板