web-dev-qa-db-ja.com

C ++のpow()関数は、関数内に置くと動作を変更します

私はしばらくの間C++でプログラミングしています。精度の問題により、べき乗関数がより大きな累乗に対して誤った答えを返すことを以前に見ましたが、今日、コーディングの問題を解決しているときに、pow()関数が関数内に配置された場合と直接評価された場合とで、異なる値を与えることがわかりました。

 #include <iostream>
 #include <math.h>
 using namespace std;

 long long n,d;

 long long power(long long x)
 {
    return pow(100,x);
 }

 long long powersecond(long long x)
 {
    return pow(100,(int)x);
 }

 int main()
 {
    n = 68; d = 2;
    cout << n*power(d) <<endl;        // outputs 679932
    cout << n*pow(100,d) <<endl;      // outputs 680000
    cout << n*powersecond(d) <<endl;  // outputs 679932
    cout << n*pow(100,(int)d) <<endl; // outputs 680000
    return 0;
 }

Powersecond()関数でxを整数に変換した後でも、答えが変化しないことに注意してください。dがlong long intではなくintであっても、答えは679932のままです。私が使用したコンパイラは、VS Codeのgnu gccコンパイラです。

7

必要に応じて、常に独自のパワー関数を記述してください。必要に応じて戻り値の型を変更し、混乱を回避してください。

long long int power(long long int a, long long int x) {
  static long long int ans = 1;
  if (x < 0)
    return 1 / power(a, (-1 * x));
  if (x == 1)
    return a;
  if (x == 0 or a == 1)
    return 1;
  if (x & 1)
    ans = a * power((a * a), x / 2);
  else
    ans = power((a * a), x / 2);
  return ans;
}

これは再帰バージョンです。反復バージョンを書くこともできます。

0
Nurav