5

一般公式如下:

D平均,k = a * D平均,k – 1 + (1 – a) * D k – 1

但是在实现它时,如果我这样做,只是为了保存一个浮点运算,

D平均, k = a * ( D平均, k – 1 - D k – 1 ) + D k – 1

它对精度有多大影响?或者这样做是完全错误的。我知道我可能对只保存一个 FP 操作感到偏执,我准备以理论上的方式实现它,但我仍然想理解这一点。无论细节如何,您可以提供的示例都很棒。谢谢。

编辑:当然我明白,在第二种方式中,如果我在 FP 中减去两个非常接近的数字,我会失去精度,但这是第一种方式实现它的唯一原因吗?

4

1 回答 1

8

这不成问题。

首先,请注意 0 ≤ a < 1,因此平均值中的误差往往会减少,而不是累积。传入的新数据取代了旧的错误。

减去相似大小(和相同符号)的浮点数不会失去绝对精度。(您写了“精度”,但精度是表示值的精细度,例如double类型的宽度,并且不会随着减法而改变。)减去相似数量的数字可能会导致相对误差的增加:因为结果越小,误差相对它就越大。但是,中间值的相对误差无关紧要。

事实上,减去两个数字,每个数字都等于或超过另一个的一半,没有错误:正确的数学结果是完全可表示的(Sterbenz'引理)。

因此,后一个操作序列中的减法可能是精确的或低误差的,具体取决于值的波动程度。那么乘法和加法就有通常的舍入误差,除非有正值和负值,否则不会特别令人担忧,当平均值接近于零时会导致较大的相对误差。如果可以使用融合乘加操作(参见 参考资料fma<tgmath.h>,那么您可以消除乘法中的错误。

在前一个操作序列中,如果至少为 ½ ,则 的评估1-a将是准确的。a剩下两次乘法和一次加法。与后一个序列相比,这往往会产生非常轻微的错误,但可能不足以引起注意。和以前一样,旧的错误会逐渐减少。

于 2013-05-31T20:35:28.713 回答