1

私たちはプログラミングの授業で数値計算法を取り上げていますが、最初に紹介されたアルゴリズムは、根を見つけるための二分法でした。再帰を使用して実装する私の試みは次のとおりです。

#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 に変わってしまう。私は困惑しています。私は何を間違っていますか?

4

2 に答える 2

0

私の最初の推測:

セクションで

if (fabs(b-a) < tolerance){
    double root = a;
    printf("value of a is %lf\n",root);
    return a;
}

root の代わりに a を返します。ルートを返してみて、それが役立つかどうかを確認してください。

于 2013-08-17T14:04:56.390 に答える