cmath's pow() 在 GCC 中的正确性

Correctness of cmath's pow() in GCC

本文关键字:GCC 正确性 pow cmath      更新时间:2023-10-16

Code [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 版本,它带有代码::块 10.05。

因为浮点运算并不完美,当你这样做时

int s = pow(ff, matrixa.size());

pow的结果实际上更像是390624.99999,当你截断它以int它有效地扁平化为390624。如果你期望那里有一个整数值(一个带有 .0 小数部分的浮点数(,你可能应该对 pow 的结果四舍五入。

尝试将结果分配给double并输出它(可能具有更大的std::setprecision(设置。您将看到,由于舍入误差,该值将类似于390624.99999999999(或类似(。

转换为 int 会截断小数部分,从而留下390624 .使用std::round获得所需的结果。