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

为什么numpy.cumsum的最后一个元素不一定等于numpy.sum的结果

两者结果差异核心是累加算法不同

  • np.cumsum采用的是顺序累加逻辑:从数组第一个元素开始,逐个向后累加,每一步累加都会保留当前的中间结果。由于浮点数本身的精度限制,当累加的基数(中间结果)已经变得很大时,再累加远小于基数的浮点数,每一步都会产生不可避免的舍入误差,这些误差会随着累加过程持续累积,最终导致cumsum()[-1]的误差更大。
    你给出的示例里,数组包含大量1和纳秒级的极小值,当累计到上万个1之后,再加2e-9、3e-9这类数值,双精度浮点数已经无法完整保留所有有效位,误差会一步步累积放大。

  • np.sum默认采用**成对求和(Pairwise Summation)**算法:不会按数组顺序逐个累加,而是会把数组拆分成多个大小相近的子块,先计算每个子块内部的和,再把所有子块的和汇总得到最终结果。这种算法的优势是大部分求和步骤都是量级接近的数相加,大幅降低了大数加小数带来的舍入误差,最终结果的精度远高于顺序累加。
    示例里的所有极小值会优先在子块内累加求和,再和所有1的总计数相加,误差累积的程度会小很多。当数组长度很短时,np.sum也会降级为顺序累加,此时两者的结果不会有差异。

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:54:02