您在問如何計算來自錯誤輸入(某些值中有錯誤的值)的正確結果(是否一個值大於另一個值)。很顯然,這是不可能的:不正確的輸入會產生不正確的輸出。但是,在某些特定情況下,我們可以挽回一些東西。以下討論一種情況。
讓我們假設你已經計算出了一些a
和b
近似於理想值一個和b,其中一個和b是,如果計算是用精確的數學做,你將有結果。另外,假定我們知道誤差範圍Ë一個和Ë b這樣一個 - Ë一個≤a
≤一個 + Ë一個和一個 - e b≤b
≤b + e b。換句話說,計算出的a
和b
分別位於a和b附近的一些區間內。 (根據所執行的操作,有可能是錯誤可能導致a
或b
趴在一些無關的間隔,甚至可能不包含一個或b。但我們會假設你已經「表現良好」的錯誤。)
在這種情況下,如果a
- Ë一個>b
+ è b,那麼可以肯定的是一個>b。
但是,假設您測試此條件並返回true
(如果它成立)。然後,只要這返回true
,您將知道a>b。但是,當它返回false
時,您將無法確定a>b是否爲假。所以,如果你想執行一些動作只有當你一定是一個>b這個測試是好的。但是這會導致您錯過在某些情況下執行此操作時a>b。
假設您不想錯過任何這些情況。再考慮條件a
+ Ë一個>b
- Ë b。如果a>b,則該條件必須爲真。因此,如果您測試此條件並在其執行時執行所需操作,則執行總是時將執行a>b。但是,如果不是這樣的話,也可以執行一些操作a>b。
這表明你有選擇。如果你的計算有錯誤,有時你的應用程序會做錯誤的事情。你必須選擇:
- 它是如何接受的是應用程序執行的操作,當它是假的是一個>b。它總是可接受/不可接受的,還是取決於如何接近a是b?
- 對於您的應用程序而言,如果它確實無法執行該操作,那麼該接受程度如何?a>b。它總是可接受/不可接受的,還是取決於如何接近a是b?
如果你能找到一些令人滿意的妥協,那麼你設置你的病情一些中等水平,和你測試的條件a-b > e
,對於一些e
是介於 - Ë一個 - Ë b和+ Ë一個 + è b,包括端值。如果您找不到令人滿意的折中方案,那麼您需要改進a
和b
的計算以減少錯誤,或者您需要以某種方式重新設計您的程序。
注意:在這種情況下的最終測試是a-b > e
而不是a > b+e
,因爲可能會有一個小的舍入誤差計算b+e
。還可以有一個舍入誤差計算a-b
,但僅當a
和b
並不彼此靠近,在這種情況下的差,即使有舍入,比e
大得多(除非你的錯誤間隔是惡劣)。在我們所關心的精確度,當a
靠近b
的情況下,a-b
計算是準確的。
「我知道,而不是簡單地檢查== B,我通常要挑一些少量的每股收益」你應該知道的是,你要了解你的程序的邏輯,並利用這些知識來選擇一個合適的ε- ,**如果有需要的話**。相同的理解會導致你對'a> b'做出正確的決定。沒有爲'一== B'沒有通用的解決方案(您可以投訴給誰就給誰告訴你有),並有對'一> B'沒有通用的解決方案。 –
這是不可能回答這樣的問題,不知道更多的應用程序。例如,用'如果(A> B - EPS)',這相當於你的第二個'if'聲明,你會得到一些誤報。如果沒有進一步的信息,那麼這些誤報是否適用於您的特定應用是無法衡量的。 –
使用'epsilon'可能不夠,因爲正確選擇epsilon取決於所涉及的相對大小。深入研究這些問題絕對值得。 [Goldberg的論文](http://www.validlab.com/goldberg/paper.pdf)是一個經典的,重要的理論。還有一系列的文章[這裏](http://randomascii.wordpress.com/category/floating-point/)。 –