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

时间:2015-05-10 14:19:18

标签: 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(range(1,35))等于零? 为什么np.prod(range(1,34))是负值?

2 个答案:

答案 0 :(得分:3)

Python的内置整数用于存储无限大的数字。但是,随着数量的增加,对它们进行数学运算的成本也会增加。

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

你正在溢出numpy允许的最大值。

public class DropDownList : Attribute
{
    public Type EnumType { get; set; }

    public DropDownList(Type type)
    {
        this.EnumType = type;
    }
}

答案 1 :(得分:1)

算术在使用整数类型时是模块化的,并且在溢出时不会引发错误。查看docs

>>> x = np.array([536870910, 536870910, 536870910, 536870910])
>>> np.prod(x) #random
16