gpt4 book ai didi

c - 计算总和时使用比所需精度更高的精度

转载 作者:行者123 更新时间:2023-12-01 13:19:11 24 4
gpt4 key购买 nike

在计算总和时使用较大的精度并在算法结束时降低精度是否是一种好的做法?喜欢

float average(const float* begin, const float* end)
{
double sum=0;
size_t N=end-begin;
while(begin!=end)
{
sum+=(double)(*begin);
++begin;
}

return (float)( sum/N); //Assume range is not empty
}

可能是吧,因为积累的时候误差比较少。另一方面,在数据类型之间进行转换时可能会出错。

最佳答案

这取决于您要避免什么,但可能不是。

如果您试图避免灾难性的取消(其中 10^100 + 1 - 10^100 导致 0 而不是 1),使用更宽的 FP 类型会有所帮助但不是非常喜欢。

如果数字在数量级上靠得更近,但您仍然担心 LSB 会随着总和的增长而下降(例如 1e-8 + 1e-8 + (1e8 copies) != 1 ),较宽的类型可以有所帮助,但同样,也只是在一定程度上。

真正有用的是更聪明的浮点求和方法。最简单的方法称为“成对求和”,您可以将数字数组视为二叉树的叶子,然后递归地对它们对求和,直到只剩下一个数字。对于在那里进行的迭代求和,您还可以先对数字进行排序,这往往会减少错误。还有更复杂、更精确的方法可用……谷歌“补偿求和”了解详细信息。

综上所述,如果您怀疑舍入误差对您来说是个问题,double sum 会有所帮助,但可能还不够。

哦,关于“在数据类型之间转换时可能会出错”:事情可能会出错(特别是双舍入错误),但您可能不精确与执行求和本身的错误相比,从中看到的错误并不重要。

关于c - 计算总和时使用比所需精度更高的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30621791/

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