GCC中cmath的pow()的正确性

时间:2012-07-12 16:12:15

标签: c++ math gcc g++

代码 [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。

2 个答案:

答案 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获得所需的结果。