2011-03-01 135 views
5

對於真正簡單而愚蠢的問題,我表示歉意;但是,爲什麼這兩種情況顯示的精度有差異?Python數組中的浮點精度

1)

>> test = numpy.array([0.22]) 
>> test2 = test[0] * 2 
>> test2 
0.44 

2)

>> test = numpy.array([0.24]) 
>> test2 = test[0] * 2 
>> test2 
0.47999999999999998 

我使用64位Linux python2.6.6。 非常感謝您的幫助。

這也持似乎憋了列表蟒蛇

>>> t = [0.22] 
>>> t 
[0.22] 

>>> t = [0.24] 
>>> t 
[0.23999999999999999] 
+2

那怎麼彩車工作 - 「以神祕的方式」)。很多問題都是我無法解決的問題。 – delnan 2011-03-01 21:07:38

+1

我不會稱之爲任何東西的重複,因爲答案是非常具體的Python(加上它是我的答案:))。 – Zooba 2011-03-01 21:45:50

回答

6

因爲它們是不同的號碼和不同的數字有不同的舍入的效果。

(幾乎所有的相關的問題上下右側會解釋的舍入影響自己的事業。)


好了,更嚴重的答案。似乎numpy的在陣列中對所述數字的一些轉化或計算:

>>> t = numpy.array([0.22]) 
>>> t[0] 
0.22 


>>> t = numpy.array([0.24]) 
>>> t[0] 
0.23999999999999999 

而Python不自動執行此操作:

>>> t = 0.22 
>>> t 
0.22 

>>> t = 0.24 
>>> t 
0.24 

舍入誤差小於numpy的的「EPS」值對於float,這意味着它應等於被處理(事實上,它是):

>>> abs(numpy.array([0.24])[0] - 0.24) < numpy.finfo(float).eps 
True 

>>> numpy.array([0.24])[0] == 0.24 
True 

但原因的Python將其顯示爲「0.24」和NU MPY不會是因爲Python的默認float.__repr__方法使用低精度(其中,IIRC,是一個相當最近的變化):

>>> str(numpy.array([0.24])[0]) 
0.24 

>>> '%0.17f' % 0.24 
'0.23999999999999999' 
+0

奇怪... Python浮動是C雙打,所以應該沒有任何區別。除非NumPy使用單精度(C浮點數)出於某種奇怪的原因。 – delnan 2011-03-01 21:14:20

+1

即使沒有Numpy,如果該值在列表中'>>> t = [0.22]''>>> t''[0.22]''>>> t = [0.24]',Python似乎也會執行相同的操作'>>> t''[0.239999999]' – Eric 2011-03-01 21:16:56

+2

@Eric我在試過時沒有看到這種效果,但答案肯定是'numpy.float64 .__ repr__'在'%0中使用高精度。# f''比Python的'float .__ repr__'。 (現在在我的答案中) – Zooba 2011-03-01 21:22:37