Skip to main content
 首页 » 编程设计

python之Python multiply() 和 prod() 的错误结果

2025年05月04日11wayfarer

谁能解释一下?我正在使用 Python 2.5

考虑 1*3*5*7*9*11 ... *49。如果您在 IPython(x,y) 交互式控制台中键入所有这些内容,您将得到 58435841445947272053455474390625L,这是正确的。 (为什么是奇数:就像我最初做的那样)

Python multiply.reduce() 或 prod() 应该在等效范围内产生相同的结果。在一定程度上确实如此。这里,已经错了:

: k = range(1, 50, 2) 
: multiply.reduce(k) 
: -108792223 

使用 prod(k) 也会生成 -108792223 作为结果。对于长度为 12 的等效范围(即 k = 范围 (1,24,2)),开始出现其他不正确的结果。

我不确定为什么。谁能帮忙?

请您参考如下方法:

这是因为numpy.multiply.reduce()将范围列表转换为类型为numpy.int32的数组,reduce操作溢出了可以存储的内容在某些时候是 32 位:

>>> type(numpy.multiply.reduce(range(1, 50, 2))) 
<type 'numpy.int32'> 

正如 Mike Graham 所说,您可以使用 dtype 参数来使用 Python 整数而不是默认值:

>>> res = numpy.multiply.reduce(range(1, 50, 2), dtype=object) 
>>> res 
58435841445947272053455474390625L 
>>> type(res) 
<type 'long'> 

但是在这种情况下使用 numpy 来处理 python 对象是没有意义的,最好的解决方案是 KennyTM 的:

>>> import functools, operator 
>>> functools.reduce(operator.mul, range(1, 50, 2)) 
58435841445947272053455474390625L