代码 [GCC,使用-O2标志编译]
int main()
{
vector< vector<int> > matrixa(8);
int ff = 5;
int s = pow(ff, matrixa.size());
int ss = pow(double(ff), int(matrixa.size()));
vector< vector<int> > comb(s);
cout << ff << "^" << matrixa.size() << " = " << s << endl;
cout << ss << endl;
return 0;
}
输出
5^8 = 390624
390625
我想知道为什么s = 390624
应该是390625
。如果我编译没有-O2标志的代码,那么s = 390625
。此外,ss
的投射似乎可以解决问题。
发生了什么事?
我的操作系统是Windows 7旗舰版x64。不确定GCC版本,它附带Code :: Blocks 10.05。
答案 0 :(得分:6)
因为浮点运算并不完美,所以
int s = pow(ff, matrixa.size());
pow
的结果实际上更像是390624.99999
,当你将其截断为int
时,它实际上被展平为390624.如果你期望有一个整数值(浮动) -point with .0 fractional part),你可能应该舍入pow
的结果。
答案 1 :(得分:5)
尝试将结果分配给double
并输出(可能更大的std::setprecision
)设置。您将看到由于舍入错误,该值将类似于390624.99999999999
(或类似)。
转换为int会截断小数部分,从而为您留下390624
。使用std::round
获得所需的结果。