You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:39:00