簡體   English   中英

在雙精度列表中找到最大數,是否需要關注精度?

[英]find the max one number in a list of double, need to care about precision?

假設有一個向量,並且需要找出最大數。 我的同事告訴我,必須以特殊方式處理雙數,他的代碼如下:

double max = v[0];
for (int i = 0; i < v.size(); ++i) {
   if (compare(max, v[i]) < 0) max = v[i];
}

int compare(double a, double b) {
    double z = a - b;
    if (z < -0.000001) return -1;
    if (z > 0.000001) return 1;
    return 0;
}

我認為它不需要那么復雜,只需使用'<'或'>'就可以完成工作,它不必關心相等。 但是我的同事堅持認為,與epsilon比較必須找出最大數量。 真的嗎?

為了找到最大的數字,您是對的,簡單的<就足夠了。

您的同事在想(無論如何,我們希望)正在處理浮點數的相等性。 例如,如果您以兩種不同的方式計算應為相同值的值,則可能會輕易看到兩者之間的微小差異-即使(a+b)+ca+(b+c)也會改變a結果(即使從數學角度來看,兩者應相同)。

但是,執行此操作時,通常需要根據數字的大小來縮放數字之間允許的差異。

例如,讓我們考慮一個可以代表大約15個有效數字的double精度數。

如果您的數字在1e + 200左右,則可以表示的這兩個數字之間的最小差約為1e + 185。 問差是否小於0.000001小是沒有意義的-無論結果是相同的,否則差比大得多

相反,如果您的數字在1e-200左右,則可以表示的數字之間的最小差約為1e-215。 再次考慮到0.000001的差異是完全荒謬的-僅在兩個計算之一的錯誤程度約為196個數量級1時才會發生。

因此,要執行此操作,請在小數點后選擇一些需要匹配的位置,以使您認為這兩個位置相等,然后將其乘以數字即可得到最大增量。 例如,如果您決定他們需要同意小數點后7位,並且數字在1eN的范圍內,則最大差值為1e(N-7)。 如果N為100,則最大增量為1e93。 如果N為-150,則最大增量為1e-157。

仍然需要非常小心地使用它,尤其是在處理數字組時。 問題是這樣的近似相等不再具有傳遞性。 即使數字處於0.000001的Epsilon可能有意義的范圍內,也可以說A == B,並且B == C,但是A!=C。這可能會導致非常令人驚訝的結果輕度(在某些情況下,例如排序,可能會導致完全失敗,因為您違反了嚴格的弱排序要求)。

就查找在向量中找到最大值的原始問題而言,這基本上意味着僅使用<找到實際上最大的值。 根據舍入誤差,但是,有可能是較小的其他值,但理論上應該是較大的。 根據這些結果的計算方式和您要完成的工作,您可能要考慮不僅查找最大的單個值,而且查找選定的最大錯誤最大值內的所有其他值。 其他的值雖然不那么大,但足夠接近,可以代表最大的度量值(或您正在使用的任何精確值)。

還有一點可能值得一提:一些浮點格式包括“不是數字”的表示形式。 這對於每次可能的比較都會產生false (實際上,檢測NaN的常見方法是if (x != x) /* it's a NaN */ )。 因此,如果您的輸入值可能包含NaN,則看似相同的比較可能會得出完全不同的結果。 例如, if x < y並且if not y >= x通常應該是相同的,但是如果xy是NaN,則它們不會相同。


  1. 為了嘗試將196個數量級視為透視圖,讓我們假設您正在進行計算,試圖將中子的大小與質子的大小進行比較。 然后,您決定檢查這兩個大小之間的差異是否大於銀河系的直徑。

    哦,但這不是196個數量級。 大約只有36個數量級。 因此,讓我們檢查一下我們得到的差值是否大於(當前認為的)宇宙直徑。 這使我們上升到大約50個數量級。

    我想我雖然未能正確地將其放到視野中,即使我們將弦論歸因於“弦”的最小尺寸與宇宙的(通常被接受的)尺寸進行比較,兩者仍然存在。相差196個數量級。 更糟糕的是,我懷疑字符串的大小或已知宇宙的大小是否是任何人都可以真正有意義地可視化的東西。 一個太小了,另一個太大了,任何人都無法真正掌握,兩者之間的差異仍然遠遠小於我們在談論的差異。

您的同事是錯誤的,在這種情況下,操作<結果就足夠了。 如果您需要找出容器等中有多少個最大元素,則有必要與epsilon進行比較。只需找到一個簡單元素即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM