4

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

4

2 回答 2

6

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

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

的结果pow实际上更像是390624.99999,当您int有效地将其截断为 390624 pow

于 2012-07-12T16:18:07.007 回答
5

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

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

于 2012-07-12T16:18:48.157 回答