求解Project Euler #8时numpy.prod计算子列表乘积返回负值原因
Numpy.prod与math.prod计算结果不一致问题原因
核心问题为numpy固定位宽整数类型溢出,具体逻辑如下:
- Python原生int为任意精度类型,不存在溢出限制,
math.prod基于原生int计算,结果始终准确。 - numpy数组默认使用32位有符号整数(
int32)存储数值,该类型最大可表示值为2147483647,远小于本题13个数字的最大乘积9^13=2541865828329。 - 乘积计算超出
int32取值范围时会触发溢出截断,有符号整数的最高符号位被截断为1时,就会返回错误的负值,也就是你观察到的索引88之后输出异常的原因。
修复方案
如果要让np.prod输出和math.prod一致的结果,创建数组时指定更高位宽的整数类型,或者直接使用Python原生对象类型即可:
# 方法1:使用64位有符号整数,可覆盖本题的乘积范围 num_arr = np.array(整数列表, dtype=np.int64) # 方法2:使用Python原生int类型,完全避免溢出 num_arr = np.array(整数列表, dtype=object)
内容的提问来源于stack exchange,提问作者antrak19
相关产品推荐
相关产品推荐

