首頁 >後端開發 >C++ >我應該使用 Double.Epsilon 進行浮點比較嗎?

我應該使用 Double.Epsilon 進行浮點比較嗎?

Linda Hamilton
Linda Hamilton原創
2025-01-05 04:58:42489瀏覽

Should I Use Double.Epsilon for Floating-Point Comparisons?

浮點比較中的Double.Epsilon

問題:

答案:

Epsilon 值表示最小的可表示非- 除 0 以外的非正規浮點值。雖然在比較中它似乎是 epsilon 的自然候選者,但它不夠精確目的。

Double.Epsilon 反映了最小的可表示截斷誤差,但它根據所比較的數字的大小而變化很大。例如,對於兩個接近 1 的數字,Double.Epsilon 可能是 0.0000000000000002220446,而對於兩個接近 1,000,000,000,000,000 的數字,它可能是 222,044,604,925,093,800。這表示依賴 Double.Epsilon 進行相等或其他比較不會提供一致的結果。

相等的替代 Epsilon 估計:

比較浮動的一種建議方法 -相等的點值是使用常數 * 1E-15 的 epsilon。這近似表示 Double 類型可以精確地表示 15 位元數字的值。例如:

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

比較運算子:

雖然Double.Epsilon不能直接用於比較,但AboutEqual方法可以適配大於、小於、小於或等於、大於或等於:

  • 大於:x > y && !AboutEqual(x, y)
  • 小於:x
  • 小於或等於:AboutEqual(x, y) || x 小於或等於:AboutEqual(x, y) || x
  • 大於或等於:AboutEqual(x, y) || x> y

其他注意事項:

需要注意的是,截斷錯誤可能會累積,尤其是在處理計算值時。因此,您可能需要相應地調整 epsilon 值以達到合適的精度。

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

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