2011-03-01 138 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