使用std :: inner_product时零内部产品

时间:2012-08-22 00:55:37

标签: c++ type-conversion standard-library

下面的C ++程序应该返回一个严格正值。但是,它会返回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;
}

2 个答案:

答案 0 :(得分:14)

因为您提供的初始值为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

答案 1 :(得分:3)

这是因为你提供了零作为整数常量。结果操作都是整数,因此最终值(0.75)也被截断为int

将零更改为0.0以使其正常工作:

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

这会在ideone上生成0.75