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

使用binary interpolation求多项式根始终输出0.00的问题求助

问题分析与代码修正

核心错误:输出了错误变量

你在main函数中打印的是binary函数的返回值,但binary函数始终返回0,这就是输出一直为0.00的直接原因。正确做法是打印通过指针传递的result变量,它才是存储根的容器。

其他关键问题

  1. 浮点数直接判等的精度问题
    代码中if (fmid == 0)的写法不可靠,浮点数计算存在精度误差,永远不要用==直接比较浮点数是否为0,应改用绝对值判断:if (fabs(fmid) < 1e-6)。

  2. 递归逻辑的覆盖错误
    递归调用后,你已经通过指针得到了正确结果,但后续又执行*result = mid,会覆盖递归得出的有效根,需调整逻辑:仅当区间精度满足要求时才赋值mid。

  3. 多项式计算的精度冗余
    使用pow(x,3)和pow(x,2)会引入额外浮点误差且效率低下,直接展开计算a3*x*x*x + a2*x*x + a1*x + a0更精准高效。

  4. 区间合法性处理的合理性
    当fa * fb >= 0时直接设result=0不合理,可用特殊值标记区间无实根的情况。


修正后的代码

#include <stdio.h>
#include <math.h>

// 优化多项式计算,避免pow的精度误差
float fx(int a3, int a2, int a1, int a0, float x) {
    return a3 * x * x * x + a2 * x * x + a1 * x + a0;
}

// 调整递归逻辑,专注于指针传递结果,去掉冗余返回值
void binary(int a3, int a2, int a1, int a0, float a, float b, float *result)
{
    float fa = fx(a3, a2, a1, a0, a);
    float fb = fx(a3, a2, a1, a0, b);
    
    // 简单判断区间内无实根或有偶数个根
    if (fa * fb > 0) {
        *result = -1.0; // 用特殊值标记错误
        return;
    }
    
    float mid = (a + b) / 2;
    float fmid = fx(a3, a2, a1, a0, mid);
    
    // 精度满足要求或找到近似根,直接赋值返回
    if (b - a < 0.001 || fabs(fmid) < 1e-6) {
        *result = mid;
        return;
    }
    
    // 递归缩小搜索区间
    if (fmid * fa > 0) {
        binary(a3, a2, a1, a0, mid, b, result);
    } else {
        binary(a3, a2, a1, a0, a, mid, result);
    }
}

int main()
{
    int a3, a2, a1, a0;
    float a, b, result;

    scanf("%d %d %d %d", &a3, &a2, &a1, &a0);
    scanf("%f %f", &a, &b);
    
    binary(a3, a2, a1, a0, a, b, &result);
    
    // 处理错误情况与正常输出
    if (result == -1.0) {
        printf("区间内无实根或无法找到根\n");
    } else {
        printf("%.2f", result);
    }
    
    return 0;
}

测试验证

使用你的测试数据a3=3, a2=-1, a1=-3, a0=1,输入区间0 1,运行后会输出0.33,符合预期。

内容的提问来源于stack exchange,提问作者HHK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:27:49