1

Web で見た他の再帰ニュートン平方根関数と非常によく似たプログラムを作成しました。何らかの理由で、これは完全な正方形でのみ機能し、その理由を見つけることができないようです. 3 つの変数 (イプシロン) を渡し、x=a を設定し、a = を 9 行目に渡された方程式に設定してから、abs(a*ax) を渡してみました。私はそれをできる限り説明しようとしましたが、それは私にとって少し新しいトピックであり、これが完全な根を見つけることしかできないのか、それとも私のコード/方程式が間違っているのかわかりません.

 1  #include <cmath>
 2  #include <iostream>
 3  using namespace std;
 4
 5  double newtroot(double x, double a) {
 6      if (fabs(a*a - x) <= DBL_EPSILON)
 7          return a;
 8      else 
 9          return newtroot(x, fabs(a*a + x)/(2*a));
10  }
11
12  int main() {
13      cout << newtroot(9, 1) << endl;
14      system("pause");
15      return 0;
16  }

編集:関数は完全な正方形に対してのみ機能するのではなく、完全な正方形に対してのみ正しく返されます。それが完全な正方形でない場合a、最終的に正しい値になります (デバッガーでチェックされます) が、再帰は決して停止しません。6行目の比較で何かに違いないと思ったので、DBL_EPSILONを置き換えてみましaたが、間違った値が返されました。
このエラーは、完全でない正方形が入力された場合にも 6 行目に表示されます。

RecursionProgrammingExcercisesMurphyT.exe の 0x00007FFE8E9C06F0 (ucrtbased.dll) で未処理の例外: 0xC00000FD: スタック オーバーフロー (パラメーター: 0x0000000000000001、0x00000013B2603FE8)。発生した

4

1 に答える 1