首頁 >後端開發 >C++ >我應該如何比較浮點數的相等和不相等?

我應該如何比較浮點數的相等和不相等?

DDD
DDD原創
2025-01-06 01:09:38390瀏覽

How Should I Compare Floating-Point Numbers for Equality and Inequality?

使用Double.Epsilon 決定浮點數的相等性

MSDN 文件建議使用大於Double.Epsilon 數量的值來建立決定兩個常數浮點數是否相等時可接受的絕對差。然而,這個建議引起了一些混亂。

Double.Epsilon 在比較上有實際用途嗎?

MSDN 的措詞導致了對 Double 實際用途的誤解。埃普西隆。如提供的答案所述,Double.Epsilon 表示最小的可表示非非正規浮點數值,不為 0。它僅表示截斷誤差的最小大小,而不是可接受的比較餘裕。

計算適合相等比較的 Epsilon

對於相等比較,更實用的方法是使用 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;
}

此方法使用兩個數字的絕對值中較大的一個乘以一個小常數 (1E-15) 來確定可接受的比較餘裕。

考慮大於和小於比較

對於大於或小於等比較,原理相同適用。 epsilon 應根據比較數字的大小來計算,以考慮潛在的截斷錯誤。

相等和不等式比較的最佳實現

總之,Double .Epsilon 不能直接用作浮點比較的可接受的相等、大於、小於、小於或等於或大於或等於比較的餘量數字。相反,應該計算特定於上下文的 epsilon 以確保準確的比較。

以上是我應該如何比較浮點數的相等和不相等?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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