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