2016-02-10 167 views
3

值正如我們所知,由於數字的二進制表示,該表達式的計算結果爲False(至少在Python):使用math.isclose功能與接近0

0.2 + 0.4 == 0.6 

爲了能夠檢查數值誤差範圍內的平等,模塊math提供isclose

import math 
math.isclose(0.2 + 0.4 , 0.6) 

這最後一個表達式產生True預期。

現在爲什麼下面的表達式再次是False

math.isclose(0.2 + 0.4 - 0.6 , 0.0) 

看來,一切都比較0.0False

math.isclose(1.0e-100 , 0.0) 

回答

8

答案可以通過讀取documentation制定。

math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) 

返回真,如果值A和B是相互靠近,否則爲假。

根據給定的絕對和相對容差確定兩個值是否被認爲是接近的。

rel_tol是相對公差 - 它是a和b之間允許的最大差值,相對於a或b的絕對值較大。例如,要將公差設置爲5%,請傳遞rel_tol = 0.05。默認容差是1e-09,這可以確保這兩個值在約9個十進制數字內相同。 rel_tol必須大於零。

abs_tol是最小絕對公差 - 用於接近零的比較。 abs_tol必須至少爲零。

如果沒有出現錯誤,結果將是:

abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) 

您可以使用默認的公差,這意味着一個相對寬容檢查使用。上面的等式清楚地說明了爲什麼你的表達式評估爲false。

考慮問題的最後表達:

math.isclose(1.0e-100 , 0.0) 

插入這些值從文檔的表達,我們有

1.0e-100 <= max(1.0e-9 * 1.0e-100, 0.0) 

我認爲這應該是顯而易見的執行相對公差時比較,使用默認容差,不認爲非零值接近零。

對於非常小的值,您應該使用絕對容差。

或者您應該重新編寫測試以避免與零比較。

+0

mmph。我確實閱讀了文檔,並指出我可以設置相對和絕對容差。但我不知何故錯過了默認的絕對容差爲0.0。也許我應該去睡覺......謝謝大衛 – steffen

+2

爲了完整性,[原始PEP](https://www.python.org/dev/peps/pep-0485/#absolute-tolerance-default)解釋了爲什麼絕對公差爲0:*「確定值是否」接近「爲零所需的絕對容差完全取決於用例。」* –