それで、私はコンピューティングコンテストに参加していて、奇妙なバグに気づきました. pow(26,2) は常に 675 を返し、時には 674 を返しますか? 正解は 676 ですが、これらのエラーは pow(26,3) や pow(26,4) などでも発生します。興味深いことに、この種のエラーはこれまでに発生したことがありません。私が持っていたコンピューターは、Windows 8 で mingw を実行していました。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