代码 [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 Ultimate x64。不确定 GCC 版本,它带有 Code::Blocks 10.05。
最佳答案
因为浮点运算并不完美,当你这样做的时候
int s = pow(ff, matrixa.size());
pow
的结果实际上更像 390624.99999
,当您将它截断为 int
时,它实际上被扁平化为 390624。如果你期望那里有一个整数值(一个带有 .0 小数部分的 float ),你应该四舍五入 pow
的结果。
关于c++ - GCC 中 cmath 的 pow() 的正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456104/