下面的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;
}
答案 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
。