私たちはプログラミングの授業で数値計算法を取り上げていますが、最初に紹介されたアルゴリズムは、根を見つけるための二分法でした。再帰を使用して実装する私の試みは次のとおりです。
#include <math.h>
#include <stdio.h>
#define tolerance 0.00001
double my_function(double z){
double answer = 5*pow(z,2) + 5*z - 2;
return answer;
}
double bisection(double (*fxn)(double),double a, double b){
double m = ((a+b)/2);
if (fabs(b-a) < tolerance){
double root = a;
printf("value of a is %lf\n",root);
return a;
}
else if (fxn(m) > 0){
b = m;
}
else if (fxn(m) < 0){
a = m;
}
bisection(my_function, a, b);
}
int main(){
double g = 0.01;
double z = 1;
double x = bisection(my_function,g,z);
printf("root is %lf\n",x);
return 0;
}
出力は次のとおりです。
value of a is 0.306225
root is nan
ルートは正しい (わずかにずれているが、許容範囲内) が、値を返してから出力するまでのどこかで、どういうわけか NaN に変わってしまう。私は困惑しています。私は何を間違っていますか?