繁体   English   中英

std :: partial_sum和Kahan算法

[英]std::partial_sum and Kahan algorithm

在C ++ 11中,我想使用std :: partial_sum计算向量的部分和。

std::vector<double> vec = {-1.0, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1};
std::partial_sum(vec.begin(), vec.end(), vec.begin());

不幸的是,由于双精度的舍入误差以及0.1没有精确表示为double的事实,得到的向量的最后一个条目是1.38778E-16。

vec = {-1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 1.38778E-16};

是否有机会在std :: partial_sum中使用Kahan算法来减少舍入误差并获得更小的误差 - 类似于

std::partial_sum(vec.begin(), vec.end(), vec.begin(), KahanSum);

您可以在std::partial_sum (基于Wikipedia伪代码 )的基础上实现Kahan求和:

double c = 0.0;
std::partial_sum(vec.begin(), vec.end(), vec.begin(),
        [c](double sum, double elem) mutable -> double {
            double y = elem - c;
            double t = sum + y;
            c = (t - sum) - y;
            return t;
        });

这仍然不会让你为零,因为(double)0.1恰好等于0.1000000000000000055511151231257827021181583404541015625 ,因此你的数组的确切总和约为5.5511151231E-17 (假设标准为double )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM