Python 对于大型阵列,numpy.dot是否有精度限制?

Python 对于大型阵列,numpy.dot是否有精度限制?,python,numpy,vectorization,Python,Numpy,Vectorization,对于大型阵列,numpy.dot是否会出错?我使用的iMac带有4 GHz Intel Core i7和32 GB 1600 MHz DDR3。我做了一个简单的实验,用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

对于大型阵列,numpy.dot是否会出错?我使用的iMac带有4 GHz Intel Core i7和32 GB 1600 MHz DDR3。我做了一个简单的实验,用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。

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位整数忠实地表示该和。

可能会溢出
np.dot
,使
x=np.arange(1,i,dtype=object)
与Python和匹配。它也比
np.int64
版本慢很多。如果不使用dtype=np.int64,也会发生同样的情况