Mic*_*hen 11 c++ gcc mingw cmath pow
所以我参加了计算竞赛,我发现了一个奇怪的错误.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;
}
Run Code Online (Sandbox Code Playgroud)
双打的结果很奇怪.
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
Run Code Online (Sandbox Code Playgroud)
Lin*_*cer 11
该函数pow对两个浮点值进行操作,并且可以相互升高.这是通过近似算法完成的,因为它需要能够处理从最小到最大的值.
由于这是一个近似算法,它有时会使值有点错误.在大多数情况下,这没关系.但是,如果您对获得确切结果感兴趣,请不要使用它.
我强烈建议不要将它用于整数.如果第二个操作数是已知的(2,在这种情况下),用更快的代码替换它并返回正确的值是微不足道的.例如:
int square(int x)
{
return x * x;
}
Run Code Online (Sandbox Code Playgroud)
回答实际问题:pow当一个或两个参数已知时,一些编译器可以用其他代码替换调用,或者将它们全部消除.这解释了为什么你得到不同的结果.
| 归档时间: |
|
| 查看次数: |
1748 次 |
| 最近记录: |