Почему функция std :: аккумулирует неправильную сумму вектора & lt; double & gt ;?

Рассмотрим следующий код для добавления всех элементов 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;
}

Когда я компилирую это на Cygwin под Windows и запускаю его, я получаю вывод в терминале как

Сумма элементов вектора V равна 9

accumulate Кажется, функция округляет все числа и складывает их, что и объясняет ответ.

Это что-то не так с компилятором Cygwin G ++, или мое неверное истолкование accumulate функция для сложения vector из doubles?

18

Решение

std::accumulate объявлен как таковой:

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

Второй аргумент шаблона для std::accumulate выводится как int так как 0 имеет тип int, Передайте двойной вместо этого, как 0.0,

32

Другие решения

+ Изменить 0 в 0.0, Затем он получает 10.4 для меня. В то время как контейнер является двойным, вычет типа int из-за начального аргумента, переданного std::accumulate, Поэтому контейнер назначен int ценности.

6

Значение, возвращаемое функцией std :: аккумулировать, является целым числом, а не двойным из-за этого:

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

Вывод параметра шаблона, сделанный компилятором C ++, делает тип возвращаемого значения accumulate функционировать так же, как init параметр, который в вашем случае является целым числом. Поэтому возвращаемое значение округляется до ближайшего целого числа. Возвращаемое значение затем неявно приводится в двойное число, когда оно присваивается sum,

Чтобы это исправить, вы можете просто передать ноль как двойное значение (т.е. 0.0) вместо

5

Последний аргумент std::accumulate Вызов определяет тип внутренней суммы, а также тип возвращаемого значения. поскольку 0 является int во время сложения все округляется, и результат также является целым числом.

3
По вопросам рекламы [email protected]