我的二分法C代码为何输出根为0.000000而非实际根?(新手求助)
二分法C代码无法输出正确根的问题排查与修复
核心问题分析
- 循环条件逻辑错误:原代码的循环条件
fabs(F(avg)) < 0.001完全颠倒。二分法需要在函数值的绝对值大于精度阈值(0.001)时继续迭代,直到满足精度要求才停止,正确条件应为fabs(F(avg)) > 0.001。 - 变量未初始化引发未定义行为:
avg在进入循环前未赋值,第一次判断循环条件时调用F(avg)会使用内存中的随机垃圾值,大概率直接跳出循环,最终输出的avg是未初始化的垃圾值(恰好显示为0.000000)。 - 缺失初始区间有效性检查:二分法的前提是初始猜测值
guess_1和guess_2必须满足F(guess_1)*F(guess_2) < 0(区间两端函数值异号,确保区间内存在根),原代码未做此检查,若用户输入不合法的初始值,算法根本无法收敛。 - 关于
fabs函数:这里确实需要fabs,用来判断函数值的绝对值是否小于精度阈值,你的这个思路是正确的。
修复后的代码
// C program for bisection method #include<stdio.h> #include<math.h> #define F(x) (x*x*x - 9*x + 1) int main(int argc, char const *argv[]) { double guess_1, guess_2, avg; printf("Enter values of 1st guess and 2nd guess : "); scanf("%lf%lf", &guess_1, &guess_2); // 检查初始区间是否合法,确保两端函数值异号 if (F(guess_1) * F(guess_2) >= 0) { printf("Error: Initial guesses must bracket a root (F(guess1)*F(guess2) < 0)\n"); return 1; } // 先计算初始avg,避免未初始化问题 avg = (guess_1 + guess_2) / 2; // 使用do-while循环,保证先执行迭代再判断终止条件 do { if (F(guess_1) * F(avg) < 0) { guess_2 = avg; } else { guess_1 = avg; } avg = (guess_1 + guess_2) / 2; } while (fabs(F(avg)) > 0.001); printf("approximate root is : %.6lf", avg); return 0; }
内容的提问来源于stack exchange,提问作者Tejas Aggarwal
相关产品推荐
相关产品推荐

