You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的二分法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:55:25