1

Newton Raphson 法を使用して N ルートを見つけようとしています。これが私の実装です...

double derive(int guess, int m, int n) {
  return guess - (pow(guess, n)-m)/(n*pow(guess, n-1));
}

double getNRoot(int m, int n) {
  double guess = 1;
  double nextGuess = derive(guess, m, n);
  while (fabs(guess-nextGuess) >= 0.0001) {
    guess = nextGuess;
    nextGuess = derive(guess, m, n);
    printf ("%f %f\n", guess, nextGuess);
  }
  return nextGuess;
}

多くの値で機能しますが、m=8n=4. guessとの場合、 とnextGuessは 2 つの値の間で変動します。m=8n=4

2.750000 1.750000
1.750000 2.750000
2.750000 1.750000
...

ここで何が問題なのですか?

4

1 に答える 1

2

派生関数は double を返しますが、int 変数を操作します。関数呼び出しで int を指定した場合でも、適切な精度を得るために関数プロトタイプに double を入れることができます。

 double derive(double guess, double m, double n) {
   return guess - (pow(guess, n)-m)/(n*pow(guess, n-1));
 }

または、少なくとも非 pow の使用のためにローカル double 変数を宣言します。

 double derive(int guess, int m, int n) {
   double d_guess = guess;
   double d_n = n;
   double d_m = m
   return d_guess - (pow(d_guess, n)-d_m)/(d_n*pow(d_guess, n-1));
 }

それを考慮して、おそらく実装全体を見直す必要があります。つまり、「実数」が必要な場合は double を使用し、「整数」数が使用される場合は「int」を使用します。

于 2013-10-24T02:15:16.593 に答える