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

升序/降序求和单精度浮点数为何误差结果与直觉相反?

为什么0-1单精度浮点数降序求和比升序求和误差更小?

你的直觉误区在于混淆了两种不同的求和场景:大量极小值+单个大值的场景下升序求和更优,但在0-1均匀分布的大量随机数场景中,降序求和的误差反而更小,核心原因在于单精度浮点数的精度限制和数据分布特性:

1. 单精度浮点数的精度瓶颈

单精度(32位)浮点数的尾数仅有23位,对应约6-7位十进制有效数字。当累加值x与当前总和S的比值小于2^-23(≈1.19×10^-7)时,x无法被S的尾数精确表示,会被舍入甚至完全丢弃。

2. 升序求和的误差放大逻辑

升序求和时,先累加最小的一批数(0到0.5左右),随着总和S逐渐增大到数百万量级:

  • 后续累加的大数(0.5到1之间)与S的比值会接近甚至低于2^-23,比如当S=5e6时,S*2^-23≈0.595,意味着小于0.595的数都会被舍入,0.595到1的数也会产生±0.5左右的绝对误差。
  • 这类大数的数量占总数据的一半以上(均匀分布特性),每个大数的绝对误差会不断累积,最终导致总误差急剧放大——你的实验中1e7个数的升序误差达到58020,就是这个原因。

3. 降序求和的误差控制逻辑

降序求和时,先累加最大的一批数(0.5到1之间):

  • 此时总和S较小,大数能被精确累加(或仅产生极小的相对误差),因为S的量级还没达到会吞噬大数的程度。
  • 当S增大到数百万量级时,剩下的都是小数(0到0.5左右),这些小数与S的比值远小于2^-23,虽然会被舍入或丢弃,但小数的绝对总和本身很小(仅占总总和的约1/4),单个小数的舍入误差也极小,总误差自然远低于升序求和——实验中1e7个数的降序误差仅为406。

实验验证代码与结果

测试代码

import numpy as np

def sum_increasing_magnitude(array):
    increasing_array = np.sort(array)
    increasing_sum = np.single(0)
    
    for i in increasing_array:
        increasing_sum += np.single(i)
        
    return increasing_sum
    
def sum_decreasing_magnitude(array):
    increasing_array = np.sort(array)
    decreasing_array = increasing_array[::-1]
    decreasing_sum = np.single(0)
    
    for i in decreasing_array:
        decreasing_sum += np.single(i)
        
    return decreasing_sum

values = np.logspace(1,7,7)

decreasing = []
increasing = []
double = []

for val in values:
    array = np.single(np.random.random(int(val)))
    decreasing.append(sum_decreasing_magnitude(array))
    increasing.append(sum_increasing_magnitude(array))
    double.append(sum(np.double(array)))

print([abs(decreasing[i] - double[i]) for i in range(len(double))])
print([abs(increasing[i] - double[i]) for i in range(len(double))])

误差输出

降序求和误差:

[3.5390257835388184e-07, 4.4330954551696777e-07, 0.00010590511374175549, 0.006269174667977495, 0.12608919621561654, 12.35097292996943, 406.54364286363125]

升序求和误差:

[3.5390257835388184e-07, 3.3713877201080322e-06, 7.720035500824451e-05, 0.006757455917977495, 0.02625455378438346, 1.88222292996943, 58020.04364286363]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:45:46