为什么Python sum()与np.sum()对整数求和会返回不同结果?
NumPy求和结果异常原因解答
核心原因:固定宽度整数溢出
- Python原生
int是任意精度类型,运算过程中会自动扩容,不存在溢出限制,所以functools.reduce和原生sum不管计算多大的整数累加,都能返回正确结果。 - NumPy的数值类型为固定宽度,你的测试中
arr_big的dtype是int32(32位有符号整数),取值范围仅为[-2147483648, 2147483647]。
0到99999的累加和为(99999 * 100000) / 2 = 4999950000,远大于int32的最大值2147483647,就会触发溢出。有符号int32溢出后会按照模2^32的规则回绕,4999950000对2^32(4294967296)取余的结果正好是704982704,和你得到的错误结果完全一致。
小数组求和正常的原因是0到999的累加和仅为499500,远小于int32的上限,不会触发溢出。
你直接调用np.sum(big_l)也得到错误结果的原因是:NumPy会先将传入的range对象转换为默认的int32类型数组再求和,同样触发了溢出规则。
修复方案
- 创建数组时指定更大的整数类型:
arr_big = np.array(big_l, dtype=np.int64),int64的取值范围可达[-9e18, 9e18],完全可以容纳普通场景的整数累加结果。 - 调用求和方法时指定累加精度:
np.sum(arr_big, dtype=np.int64),即使原数组是int32类型,累加过程会用int64计算,也能避免溢出。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

