c函数返回nan而不是double

时间:2013-08-17 13:50:49

标签: c methods recursion nan bisection

我们在编程类中使用了数值方法,引入我们的第一个算法是根寻找的二分法。这是我尝试使用递归实现它:

#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。我很难过。我做错了什么?

2 个答案:

答案 0 :(得分:4)

您没有从递归调用返回。将bisection中的最后一个语句更改为

return bisection(my_function, a, b);

答案 1 :(得分:0)

我的第一个猜测:

中的

部分

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

您返回的是一个而不是root。尝试返回root,看看是否有帮助。