在我的 c++ 应用程序中,我有一个在 (0,1) 范围内的双精度向量,我必须尽可能准确地计算它的总数。感觉这个问题之前应该已经解决了,但我找不到任何东西。
显然,如果向量大小很大并且有些项目明显小于其他项目,则遍历向量上的每个项目并执行 sum+=vect[i] 会累积显着错误。
我目前的解决方案是这个功能:
double sumDoubles(vector<double> arg)// pass by copy
{
sort(arg.rbegin(),arg.rend()); // sort in reverse order
for(int i=1;i<=arg.size();i*=2)
for(int j=0;j<arg.size()-i;j+=(2*i))
arg[j]+=arg[j+i];
return arg[0];
}
基本上它按升序对输入进行排序并计算成对和:
a+b+c+d+e+f+g+h=((a+b)+(c+d))+((e+f)+(g+h))
就像构建二叉树一样,但要在原地进行。排序应确保在每一步这两个加数具有可比性。
上面的代码确实比具有累积和的单个循环执行得更好。但是我很好奇是否可以在不降低性能的同时进一步提高精度。