给定计算n IEEE 754双精度浮点数x 0,x 1,...,x n - 1的算术平均值的任务,是否更精确
(ksum i x i)/ n
(即首先进行所有x i的Kahan和,然后除以n)或
ksum i(x i/n)
(即首先将x i除以n然后进行Kahan求和)?
我自己的测试(在[0,1)中均匀分布的随机数和在0以σ= 1为中心的整个浮点数范围内的正态分布数字)是不确定的,表明两者都非常精确,但我选择的测试数据可能特别差.
首先求和,然后除.如果你先划分,然后在一般情况下求和,你会引入一个与最大幅度加法成比例的舍入误差,这大部分都会失去卡汉求和点(在灾难性取消的情况下,这是你要防范的,你的结果是除法的舍入误差.
首先总结确实存在过度溢出的风险; 处理是正确的,你会被重新调整的确切幂的两成需要防止溢出.然而,这是非常罕见的,从来没有你需要担心的数据规模.
仅提供一个具体示例:考虑以双精度平均值4503599627370496,-4503599627370498和2.即使使用朴素求和,如果求和,则得到完全正确的结果(0).如果你除以然后求和,求和是完全的(通过Sterbenz'引理)然而错误仍然很大; 计算结果为-0.08333333333333337(这仅来自4503599627370496/3中的舍入误差;准确地说是-4503599627370498/3).