Нулевой внутренний продукт при использовании std:: inner_product

Программа на С++ ниже должна возвращать строго положительное значение. Однако он возвращает 0.

Что происходит? Я подозреваю, что это двойное преобразование, но я не могу понять, почему и как.

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

    vector<double> coordinates;
    coordinates.push_back(0.5);
    coordinates.push_back(0.5);
    coordinates.push_back(0.5);

     cout<<inner_product(coordinates.begin(), coordinates.end(), coordinates.begin(), 0)<<endl;

    return 0;
}

Ответ 1

Поскольку вы указали начальное значение 0, int. Ваш код внутренне эквивалентен:

int result = 0;

result = result + 0.5 * 0.5; // first iteration
result = result + 0.5 * 0.5; // second iteration
result = result + 0.5 * 0.5; // third iteration

return result;

Пока result + 0.5 * 0.5 выводит правильное значение (result в этом выражении выражается до double), когда это значение присваивается обратно в result, оно усекается (это выражение отливается от int). Вы никогда не превышаете 1, поэтому вы видите 0.

Вместо этого укажите начальное значение 0.0.

Ответ 2

Это потому, что вы указали нуль в качестве целочисленной константы. Результирующие операции все находятся в целых числах, поэтому окончательное значение (0.75) усекается также с помощью int.

Измените ноль на 0.0, чтобы он работал:

cout << inner_product(coord.begin(), coord.end(),coord.begin(), 0.0) << endl;

Это создает 0.75 в ideone.