首先,我不是一個數學家,所以大量的精度很少過濾到我的日常工作中。請溫柔。 )Python 32/64位機器浮點移位矩陣求和不正確?
使用NumPy的,以產生具有從值1相等地劃分的矩陣:
>>> m = numpy.matrix([(1.0/1000) for x in xrange(1000)]).T
>>> m
matrix[[ 0.001 ],
[ 0.001 ],
...
[ 0.001 ]])
在64位的Windows與Python 2.6,求和很少工程以1.0。 math.fsum()對這個矩陣有影響,但如果我改變矩陣使用更小的數字,則不會。
>>> numpy.sum(m)
1.0000000000000007
>>> math.fsum(m)
1.0
>>> sum(m)
matrix([[ 1.]])
>>> float(sum(m))
1.0000000000000007
在帶有Python 2.6的32位Linux(Ubuntu)上,求和總是可以達到1.0。
>>> numpy.sum(m)
1.0
>>> math.fsum(m)
1.0
>>> sum(m)
matrix([[ 1.]])
>>> float(sum(m))
1.0000000000000007
我可以評估時的埃普西隆添加到我的代碼,如果矩陣款項1(例如-epsilon <總和(M)< +小量),但我想先了解一下該差異的原因是內Python,以及是否有更好的方法來正確確定總和。
我的理解是,總和正在處理數字(浮點數)的機器表示方式與它們的顯示方式不同,並且在求和時使用內部表達式。但是,看看我用來計算總和的3種方法,不清楚它們爲什麼不同,或者平臺之間是相同的。
什麼是正確計算矩陣總和的最佳方法?
如果你正在尋找一個更有趣的矩陣,這個簡單的變化將有較小的矩陣編號:
>>> m = numpy.matrix([(1.0/999) for x in xrange(999)]).T
在此先感謝您的幫助!
更新 我想我想出了一些東西。如果我將存儲的值更正爲32位浮點值,則結果與32位Linux求和值相匹配。
>>> m = numpy.matrix([(numpy.float32(1.0)/1000) for x in xrange(1000)]).T
>>> m
matrix[[ 0.001 ],
[ 0.001 ],
...
[ 0.001 ]])
>>> numpy.sum(m)
1.0
這將設置矩陣機數來表示在我的Windows測試32位浮點,不64位,並且將正確總結。爲什麼0.001浮點數不等於32位和64位系統上的機器編號?如果我試圖存儲具有許多小數位的非常小的數字,我希望它們會有所不同。
有沒有人對此有任何想法?在這種情況下,我應該明確地切換到32位浮點數,還是有64位求和方法?或者我回到添加一個epsilon?對不起,如果我聽起來很愚蠢,我對意見很感興趣。謝謝!
您*必須*使用ε,因爲你必須永遠* *比較浮點數的確切平等。 *特別*你知道的數字是算術的結果,而不是例如。常量或配置值,例如。 – unwind 2012-01-12 16:55:52
@unwind:永遠不要說永遠。精確的相等測試有時在浮點上是合適和必要的。但是,這不是其中之一。 – 2012-01-12 16:57:46
您可能想了解[浮點數](http://en.wikipedia.org/wiki/Floating_point)是如何工作的。知道什麼時候做什麼是很有用的。 – murgatroid99 2012-01-12 17:03:22