這個問題在這里已經有了答案: 加減法后的浮點數小于等于比較 1 個回答 昨天關門。
我已經通過不同的執行緒來比較較小或較大的浮點值不等于比較但不清楚我們是否需要 epsilon 值邏輯來比較較小或較大的浮點值?
例如->
float a, b;
if (a < b) // is this correct way to compare two float value or we need epsilon value for lesser comparator
{
}
if (a > b) // is this correct way to compare two float value for greater comparator
{
}
我知道為了比較浮點數的相等性,我們需要一些 epsilon 值
bool AreSame(double a, double b)
{
return fabs(a - b) < EPSILON;
}
uj5u.com熱心網友回復:
這實際上取決于當兩個值足夠接近以被視為相等時應該發生什么,意思是fabs(a - b) < EPSILON。在某些用例中(例如用于計算統計資料),兩個接近值之間的比較是否相等并不重要。
如果重要,您應該首先確定值的不確定性。這實際上取決于用例(輸入值來自何處以及如何處理它們),然后 2 個值的差異小于該不確定性應被視為相等。但是這種相等不再是真正的數學等價關系:您可以很容易地想象如何在 2 個真正不同的值之間建立一個緊密的值鏈。在數學單詞中,關系不是及物的(或者幾乎是當前語言單詞的及物關系)。
很抱歉,一旦您必須處理近似值,就不可能有任何精確和一致的方法:您必須考慮現實世界的用例來確定應該如何處理近似值。
uj5u.com熱心網友回復:
當您使用浮點數時,不可避免地會遇到精度錯誤。
為了緩解這種情況,在檢查兩個浮點數是否相等時,我們經常檢查它們的差異是否足夠小。
然而,對于更小和更大的情況,沒有辦法完全確定哪個浮動更大。areSame最好的(可能是你的意圖)方法是首先使用函式檢查兩個浮點數是否相同。如果是這樣,則回傳 false(這a = b意味著a < b和a > b都是 false)。
否則,回傳a < b或的值a > b。
uj5u.com熱心網友回復:
答案取決于應用程式。
如果您確定 a 和 b 足夠不同以至于數值錯誤不會顛倒順序,那么 a < b 就足夠了。
但是如果 a 和 b 非常接近,您可能需要 a < b EPSILON。在這種情況下,您應該清楚 < 和 ≤ 是不可區分的。
不用說,選擇 EPSILON 時應格外小心(這通常非常困難)。
uj5u.com熱心網友回復:
這最終取決于您的應用程式,但我通常會說不。
問題非常簡單,如果您計算:(1/3) * 3并得到答案0.999999,那么您希望它比較等于1。這就是我們使用 epsilon 值進行相等比較的原因(應該根據應用和預期精度選擇 epsilon)。
另一方面,如果要對浮點數串列進行排序,則默認情況下該0.999999值將排序 before 1。但話又說回來,正確的行為是什么?如果它們都被排序為1,那么實際上哪個首先排序將有點隨機(取決于串列的初始順序和您使用的排序演算法)。
浮點數的問題不在于它們是“隨機的”,并且不可能預測它們的確切值。問題是 base-10 分數不能干凈地轉換為 base-2 分數,并且一個系統中的非重復小數可以轉換為另一個系統中的重復 - 然后在截斷為有限數量時導致舍入錯誤小數點。我們使用 epsilon 值進行相等比較,以處理由這些來回轉換產生的舍入誤差。
但請注意,整數的良好關系==并不<總是<=準確地轉換為浮點數,因為涉及到 epsilon。例子:
- a = x
- b = a epsilon/2
- c = b epsilon/2
- d = c epsilon/2
現在:a == b, b == c, c == d, 但是a != d, a < d. 事實上,您可以繼續保持序列,同時在序列中的最后一個數字num(n) == num(n 1)之間獲得任意大的差異。a
uj5u.com熱心網友回復:
正如其他人所說,處理浮點數時總會出現精度錯誤。
因此,即使比較小于/大于,您也應該有一個 epsilon 值。
我們知道,為了a小于b,首先,a必須不同于b。檢查這是一個簡單的不等于,它使用 epsilon。那么,一旦你已經知道a != b了,運營商<就足夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478408.html
上一篇:```lo==0,hi==len(cards)-1```和```lo,hi=0,len(cards)-1```有什么區別
