gpt4 book ai didi

floating-point - 浮点值的数值稳定移动平均值

转载 作者:行者123 更新时间:2023-12-02 19:41:53 26 4
gpt4 key购买 nike

使用 32 位浮点值,计算平均值的最佳(数值最准确)方法是什么,如果 - 开始计算时 - 我还不知道我将有多少个值(在下面的示例中,我只是迭代一个向量,所以我会知道结果,但假设我只知道最后的元素计数)?

例如我可以这样做

float result = 0.f;
for(float num: numbers) {
result += num;
}
num /= numbers.size();

但随着结果变大,精度也会变大。对于较小的值,在某些时候 result += num; 实际上不会再改变结果。

我可以做到

float result = numbers[0]
for(int i=1, i<numbers.size(); i++) {
float frac = (i/float(i+1));
result = result * frac + numbers[i] * (1.0f-frac);
}

但看来我会应用累积误差来得到这样的结果。

有没有更好的方法而不使用 64 位 double ?

最佳答案

解决此类问题最著名的方法是卡汉求和。参见这里:https://en.wikipedia.org/wiki/Kahan_summation_algorithm 。假设总和仍然可以表示为单精度 float ,请在最后进行直接除法以求平均值。

另请参阅此答案以进行一些额外的讨论,其要求或多或少相同:How to compute the average of doubles, so that the total error is minimal?

关于floating-point - 浮点值的数值稳定移动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59951711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com