use*_*931 2 floating-point numerical-methods
使用 32 位浮点值,如果 - 在开始计算时 - 我不知道我将拥有多少个值(在以下示例中,我只是遍历一个向量,那么计算平均值的最佳(数字最准确)方法是什么)我会知道 coult,但让我们假设我最后只知道元素计数)?
我可以做例如
float result = 0.f;
for(float num: numbers) {
result += num;
}
num /= numbers.size();
Run Code Online (Sandbox Code Playgroud)
但随着结果变大,精度也会变大。对于较小的值,在某些时候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);
}
Run Code Online (Sandbox Code Playgroud)
但似乎我会应用累积错误来产生这种结果。
有没有更好的方法而不去 64bit double?
此类问题最著名的方法是 Kahan 求和法。请参阅此处:https : //en.wikipedia.org/wiki/Kahan_summation_algorithm。假设总和仍然可以表示为单精度浮点数,请在最后进行直接除法以找到平均值。
另请参阅此答案以进行一些额外的讨论,它或多或少地要求相同:如何计算双打的平均值,以便总误差最小?
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |