Нулевой внутренний продукт при использовании 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.