为什么std :: accumulate函数显示向量<double>的错误总和?</double>

时间:2013-12-23 01:21:44

标签: c++ vector accumulate

考虑使用以下代码添加vector的所有元素:

#include<iostream>
#include<algorithm>
#include<numeric>
#include<vector>
using namespace std;
int main(void)
{

   std::vector<double> V;
   V.push_back(1.2);
   V.push_back(3.6);
   V.push_back(5.6);
   double sum = accumulate(V.begin(),V.end(),0);

   cout << "The sum of the elements of the vector V is " << sum << endl;
   return 0;
}

当我在Windows上的Cygwin上编译并运行它时,我在终端输出

  

向量V的元素之和为9

accumulate函数似乎将所有数字四舍五入并加起来,这可以解释答案。

Cygwin g ++编译器出了什么问题,或者我accumulate函数误解了vector double个问题?

4 个答案:

答案 0 :(得分:32)

std::accumulate声明为:

template <typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);

std::accumulate的第二个模板参数推断为int,因为0的类型为int。传递一个双倍,如0.0

答案 1 :(得分:6)

0更改为0.0。然后我得到10.4。虽然容器是double,但类型推导是int,因为传递给std::accumulate的初始参数。因此,容器被分配了int个值。

答案 2 :(得分:5)

从std :: accumulate函数返回的值是一个整数,而不是双精度因为:

double sum = accumulate(V.begin(), V.end(), 0);
//                                          ^-- Integer!

C ++编译器完成的模板参数推断使accumulate函数的返回类型与init参数相同,在您的情况下是一个整数。因此,返回值将四舍五入为最接近的整数。然后,当返回值被分配到sum时,它将被隐式地转换回double。

要解决此问题,您可以简单地将零作为双精度(即0.0)传递。

答案 3 :(得分:3)

std::accumulate调用的最后一个参数决定了内部和的类型以及返回类型。由于0int,因此在添加过程中所有内容都会向下舍入,结果也是整数。