计算算术均值时,哪种求和方式更精确?

When computing arithmetic means, what way of summing is more precise?

给定计算 n IEEE 754 双精度浮点数 x0 的算术平均值的任务, x1, ..., xn - 1,做

是不是更精确

(ksumi xi) / n

(即首先对所有 xi 进行 Kahan 求和,然后除法通过 n) 或

ksumi (xi / n)

(即首先将 xi 除以 n 然后 Kahan-summing)?

我自己的测试(在 [0, 1] 中均匀分布的随机数和在以 0 为中心且 σ = 1 的整个浮点数范围内的正态分布数)没有定论,表明两者都非常精确,但我选择的测试数据可能特别差。

先求和,再除法。如果在一般情况下先除法然后求和,则会引入与最大幅度被加数成比例的舍入误差,这主要会破坏 Kahan 求和点(在灾难性取消的情况下,这是你要防止的,你的结果是除法的舍入误差)。

首先求和确实有更大的过度溢出风险;要正确处理 that,您可以根据需要按精确的二次方重新缩放以防止溢出。但是,这种情况很少见,对于缩放比例良好的数据,您无需担心。

仅提供一个具体示例:考虑对值 4503599627370496、-4503599627370498 和 2 进行双精度平均。即使使用简单的求和,如果先求和再除,也会得到完全正确的结果 (0)。如果先除后求和,求和是准确的(根据 Sterbenz 引理),但误差仍然很大;计算结果为 -0.08333333333333337(这仅来自 4503599627370496/3 中的舍入误差;-4503599627370498/3 是准确的)。