numpy.dot对大型数组是否有精度限制?

时间:2019-02-07 03:53:31

标签: python numpy vectorization

对于大型数组,numpy.dot是否会出错?我正在使用具有4 GHz Intel Core i7和32 GB 1600 MHz DDR3的iMac。我进行了一个简单的实验,使用for循环与矢量化比较从1到大量的平方和。当总和足够大时,矢量化方法是错误的。参见下面的实验:

i = 3024617
sum([j**2 for j in range(1,i)]) - np.dot(np.arange(1,i,dtype=np.int64), np.arange(1,i, dtype=np.int64))

i = 3024618
sum([j**2 for j in range(1,i)]) - np.dot(np.arange(1,i,dtype=np.int64), np.arange(1,i, dtype=np.int64))

第一个差异-任何i <3024617的差异为0

第二个差异-任何i> = 3024618的差异都是一个大整数

我希望所有整数i的差值都为0。

1 个答案:

答案 0 :(得分:1)

Python整数是无界的。 int64限于有符号的64位整数可以表示的内容:

>>> i = 3024617
>>> x = sum([j**2 for j in range(1,i)])
>>> x
9223371388520336796
>>> hex(x)
'0x7fffff690c418d9c'
>>> x.bit_length()
63

因此,该和仅适合带符号的64位整数。也添加i**2,它将不再起作用:

>>> x += i**2
>>> hex(x)
'0x800007bb0de78dad'
>>> x.bit_length()
64

不可能用有符号的64位整数来表示该和。