我使用std::accumulate与测试代码得到了意外的结果。我试图加一个大的double vector ,但由于某种原因,该值溢出了:
#include <iostream>
#include <vector>
#include <functional>
#include <numeric>
using namespace std;
double sum(double x, double y)
{
// slows things down but shows the problem:
//cout << x << " + " << y << endl;
return (x+y);
}
double mean(const vector<double> & vec)
{
double result = 0.0;
// works:
//vector<double>::const_iterator it;
//for (it = vec.begin(); it != vec.end(); ++it){
// result += (*it);
//}
// broken:
result = accumulate(vec.begin(), vec.end(), 0, sum);
result /= vec.size();
return result;
}
int main(int argc, char ** argv)
{
const unsigned int num_pts = 100000;
vector<double> vec(num_pts, 0.0);
for (unsigned int i = 0; i < num_pts; ++i){
vec[i] = (double)i;
}
cout << "mean = " << mean(vec) << endl;
return 0;
}
来自cout的部分输出之和:
正确的输出(迭代):
错误的输出(使用累加):
我可能犯了一个疲倦的错误?我以前已经成功使用累加...
谢谢
最佳答案
您需要将double
传递给accumulate
:
result = accumulate(vec.begin(), vec.end(), 0.0, sum);
^^^
否则,使用
int
进行累加,然后将结果转换为double。关于c++ - std::accumulate行为不符合预期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16950289/