0
我寫牛頓方法的簡單的遞歸版本:牛頓方法返回NaN
#include <cmath>
using namespace std;
double DeriveAt(double (*f)(double), double x){
return((f(x+0.001)-f(x-0.001))/0.002);
};
double FindRoot(double (*f)(double), double x0){
double corr=f(x0)/DeriveAt(f,x0);
if(abs(corr) > 1.E-7)
FindRoot(f, x0-corr);
else return(x0);
};
如果我把我的功能,例如返回FindRoot(sin, 4)
,NaN
。我在每一步之後通過打印x0
的值來檢查函數,並且一切似乎都在最後一次迭代中工作。出於某種原因,函數調用本身的次數超過了實際應用,可能在計算最後的corr
時會創建類似0/0
的東西。
你錯過了'FindRoot'的'return'。這是問題嗎? – Rook
謝謝!我知道這是愚蠢的。使用'return FindRoot(...)'它可以工作。 – einbandi
如果你在海灣合作委員會的土地上,你應該更多地使用像'-Wall'這樣的東西,它會給你_「test.cpp:16:warning:控制達到非void函數的結束_ – Rook