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)。発生した