我正在编写一款路径追踪器,需要对每个像素采集大量样本并取平均值。在1024次和16384次采样中,我发现视觉效果存在显著差异;16384次采样的图像颜色较暗。我猜测这是因为16384次采样的图像出现了浮点精度误差。我通过将每个值除以16384来计算颜色值的平均值,然后将它们相加。
有没有办法在最小化舍入误差的同时,对一个已知数量级的大量难以计算的数字进行平均?最好不需要非恒定的内存,并且绝对不会丢失任何样本。
有没有办法在最小化舍入误差的同时,对一个已知数量级的大量难以计算的数字进行平均?最好不需要非恒定的内存,并且绝对不会丢失任何样本。
由于您正在除以2的幂,并且您的数字不是超小型的,因此此步骤不应对结果的准确性产生任何影响。您只是从指数中减去14。
重要的是样本中的位数。
浮点数给您24位精度。如果您有2 ^ 14 = 16384个样本,则当您将它们全部加起来时,您将逐渐失去精度,直到某个时刻在第24-14 = 10位之后的任何内容都会丢失。换句话说:在那一点上,您只保留了约3个小数位。
是否可能使用int作为累加器,甚至是uint?这样,您将保留8个额外的位,比1024和16384个样本之间的差异多两倍。
还有第二种完全不同的选择。我不知道您的样本范围是什么,但如果它们大小相似,您可以从每个值中减去近似平均值,平均差异,并在最后再添加近似平均值。
通过此方法获得的收益取决于您对平均值的初始估计有多好,以及值与平均值的接近程度。因此,我认为在您的情况下它可能不太可靠。