如何正确计算32位浮点数的大数组的运行平均值?

时间:2011-09-09 12:30:58

标签: math floating-point average

我正在编写路径跟踪器,并且必须收集每个像素的大量样本的平均值。我在1024个样本运行和16384个样本运行之间得到了显着的视觉差异; 16384样本运行较暗。我猜想这是因为16384样本图像遇到了浮点精度误差。我通过将每个值除以16384来平均颜色值,然后将它们加在一起。

有没有办法平衡一个具有已知幅度的大型,难以计算的数字集,同时最小化舍入误差?最好不要求非恒定存储器,绝对不丢弃任何样品?

2 个答案:

答案 0 :(得分:5)

你可能想要Kahan summation algorithm。当使用有限精度浮点运算对大量点求和时,这是一种简单有效的最小化累积舍入误差的方法。

答案 1 :(得分:1)

由于你除以2的幂并且你的数字不是超小的,所以这一步不应该对结果的准确性产生任何影响。你只是从指数中减去14。

样本中的位数是多少。

Floats为您提供24位精度。如果您有2 ^ 14 = 16384个样本,那么当您将它们全部添加时,您将逐渐失去精度,直到在24-14 =第10位丢失之后的某个时刻。换句话说:那时你只保留大约3位小数。

是否可以使用int作为累加器,甚至是uint?这样你就可以保留8个额外的位,是1024和16384个样本之间差异的两倍。

还有第二个完全不同的选择。我不知道您的样本范围是多少,但如果它们大小相同,您可以从每个值中减去近似平均值,平均差异,并在最后添加近似平均值。

这种方法获得多少取决于平均值的初始近似值有多好,以及这些值与平均值的接近程度。所以我认为你的情况可能不太可靠。