Почему функция std:: accumulate показывает неверную сумму вектора <double>?
Рассмотрим следующий код для добавления всех элементов a 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
из double
s?
Ответы
Ответ 1
std::accumulate
объявляется как таковой:
template <typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);
Второй аргумент шаблона std::accumulate
выводится как int
, потому что 0
имеет тип int
. Пропустите двойной вместо этого, например 0.0
.
Ответ 2
Измените 0
на 0.0
. Затем он получает 10.4
для меня. В то время как контейнер двойной, вывод типа int
из-за начального аргумента, переданного в std::accumulate
. Поэтому контейнеру присваиваются значения int
.
Ответ 3
Значение, возвращаемое из функции std:: accumulate, является целым числом, а не двойным из-за этого:
double sum = accumulate(V.begin(), V.end(), 0);
// ^-- Integer!
Вывод параметра шаблона, выполняемый компилятором С++, делает возвращаемый тип функции accumulate
такой же, как параметр init
, который в вашем случае является целым числом. Поэтому возвращаемое значение округляется до ближайшего целого числа. Возвращаемое значение затем неявно возвращается обратно в double, когда оно назначается в sum
.
Чтобы исправить это, вы можете просто передать нуль как двойной (то есть 0.0
).
Ответ 4
Последний аргумент вызова std::accumulate
определяет тип внутренней суммы, а также возврат тип. Поскольку 0
является int
, все округляется во время добавления, а результат также является целым числом.