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在两个值之间波动。m=8n=4

2.750000 1.750000
1.750000 2.750000
2.750000 1.750000
...

那么这里有什么问题呢?

4

1 回答 1

2

派生函数返回一个双精度但操作 int 变量。即使在函数调用中您提供 int,您也可以在函数原型中放置双精度数以获得适当的精度:

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

或者至少为非 pow 用途声明局部双变量:

 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));
 }

考虑到这一点,您可能应该审查您的整个实施。也就是说,在需要“实数”数字时使用双精度数,在使用“整数”数字时使用“int”。

于 2013-10-24T02:15:16.593 回答