GCC C ++战队准确性

时间:2012-12-08 05:49:21

标签: c++ gcc mingw pow cmath

所以我参加了计算竞赛,我发现了一个奇怪的错误。 pow(26,2)将总是返回675,有时是674?即使正确的答案是676.这些错误也发生在pow(26,3),pow(26,4)等 在比赛结束后进行了一些调试之后我相信答案与int事实有关。有趣的是,此类错误以前从未发生过。我用的电脑正在Windows 8上运行.GCC版本相当新,我相信2-3个月大。但我发现如果我在这些错误上转动o1 / o2 / o3优化标志会奇迹般地消失。 pow(26,2)总会得到676也就是正确的答案谁能解释为什么?

#include <cmath> 
#include <iostream> 

using namespace std; 
int main() { 
    cout<<pow(26,2)<<endl; 
    cout<<int(pow(26,2))<<endl; 
}

双打的结果很奇怪。

double a=26; 
double b=2; 
cout<<int(pow(a,b))<<endl; #outputs 675 
cout<<int(pow(26.0,2.0))<<endl; # outputs 676 
cout<<int(pow(26*1.00,2*1.00))<<endl; # outputs 676

1 个答案:

答案 0 :(得分:11)

函数pow对两个浮点值进行操作,并且可以将一个浮点值相加。这是通过近似算法完成的,因为它需要能够处理从最小到最大的值。

由于这是一种近似算法,它有时会使值有点错误。在大多数情况下,这没关系。但是,如果您对获得确切结果感兴趣,请不要使用它。

我强烈反对将其用于整数。如果第二个操作数是已知的(2,在这种情况下),用更快的代码替换它并返回正确的值是微不足道的。例如:

int square(int x)
{
  return x * x;
}

回答实际问题:当一个或两个参数已知时,某些编译器可以用其他代码替换对pow的调用,或者将它们全部消除。这就解释了为什么你会得到不同的结果。