Python 为什么范围(1,35)的乘积等于零?

Python 为什么范围(1,35)的乘积等于零?,python,numpy,Python,Numpy,我正在努力学习python,numpy软件包。我正在评估以下代码 import numpy as np >>> np.prod(range(1,33)) -2147483648 >>> np.prod(range(1,34)) -2147483648 >>> np.prod(range(1,35)) 0 为什么np.prod(范围(1,35))等于零? 为什么np.prod(范围(1,34))是一个负值?Python的内置整数用于存储无限大

我正在努力学习python,numpy软件包。我正在评估以下代码

import numpy as np
>>> np.prod(range(1,33))
-2147483648
>>> np.prod(range(1,34))
-2147483648
>>> np.prod(range(1,35))
0
为什么
np.prod(范围(1,35))
等于零?
为什么
np.prod(范围(1,34))
是一个负值?

Python的内置整数用于存储无限大的数字。然而,随着数字的增长,对它们进行数学运算的成本也在增长

另一方面,Numpy使用一组固定大小的整数。这些数字具有与计算机上可用硬件相关的最大大小(通常为
2**31
2**63
)。这使得numpy可以实现非常快速的数学运算,但代价是要存储最大值

您正在溢出numpy允许的最大值

>>> int(np.prod(range(1,21))) * 22
53523844179886080000L

>>> np.prod(range(1,21)) * 22
-1816388041242574848

>>> int(np.prod(range(1,21))) * 22 > 2**64
True

使用整数类型时,算术是模块化的,溢出时不会出现错误。检查


您使用的是什么版本的numpy和python
-2147483648
看起来像一个签名的32位长度,你在windows上运行这个吗?
Python 2.7.9(默认,2014年12月10日,12:24:55)[MSC v.1500 32位(英特尔)]在win32上
numpy verion
1.8.2
好的,这就是问题所在,你有一个溢出错误,签名的32位长度的最大值是
2147483647
np.prod(范围(1,34))->3400198294675128320
`
>>> x = np.array([536870910, 536870910, 536870910, 536870910])
>>> np.prod(x) #random
16