这是一个二分根法
double p1::root(double (*pf)(double k), int a, int b, double e) {
// void nrerror(char error_text[]);
double left = (double)a;
double right = (double)b;
double midpoint;
do
{
midpoint = ((right+left)/2);
if(pf(left) *pf(midpoint) <0){
right = midpoint;
}
else if(pf(right) * pf(midpoint) <0){
left = midpoint;
}
else{
break;
}
}while(abs(right-left) >2*e && abs(left-right)>e);
return midpoint;
}
答案 0 :(得分:2)
我看到多个独占关系 <
,<
和>
我希望其中至少有一个 包容性(>=
或<=
)
这是一个很好的一般经验法则(可能会出现异常,例如比较值的中间增量......所以你需要保持清醒,这是第一个经验法则)
答案 1 :(得分:1)
我建议把一些printfs放在跟踪你的位置。
答案 2 :(得分:0)
编译程序,提供-g
开关进行调试,并按gdb运行。这样你就会知道你的do-while
条件错误地成为了什么值。