2301_81607383 2024-04-29 20:25 采纳率: 100%
浏览 3
已结题

为什么这个程序用float行得通,double行不通?(语言-c语言)

题目是:求方程ax^2+bx+c,用3个函数分别求b^2-4ac大于0,等于0,小于0的根并输出结果,主函数输入a,b,c的值。
double和float的区别难道不是double的指数范围更广吗?那这样比程序用double也是可以的,但为什么将此程序的float变化成double后就运营不出来了,编译没错,但运营不了。

img

  • 写回答

4条回答 默认 最新

  • 专家-皆知 2024-04-29 20:25
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    在C语言中,floatdouble的主要区别不仅仅在于指数范围的广度,还在于精度。float提供大约6-7位小数的精度,而double则提供大约15位小数的精度。这在处理非常大或非常小的数字,或者在计算中需要高度精确的情况下变得重要。

    你提到的程序,如果在使用float时运行正常,但在改用double后出现问题,通常有几个可能的原因:

    1. 数值溢出或下溢:尽管double有更大的范围和精度,但在某些情况下,如果计算结果超出了即使是double也能表示的范围,或者由于精度差异导致表达式的结果为非预期的极小值,可能会出现意料之外的行为。不过,对于方程求根的基本运算来说,这种情况不太常见,因为这些运算在数学上是定义良好的,并且通常不会直接导致溢出或下溢。

    2. 比较问题:在C语言中,浮点数的相等比较(==)是敏感的,因为浮点运算存在舍入误差。当从float改为double时,原本接近但不完全等于零的值,可能因为更高的精度而不再被精确地判断为零,这可能导致条件判断(if(d==0))不按预期工作。应该使用一个很小的正数(如epsilon)来比较是否足够接近零,而不是直接用==

    3. 代码修改错误:在尝试从float转换到double时,如果忘记修改所有相关的类型声明和函数参数,也会导致编译或运行时错误。但你提供的代码片段显示,除了类型声明从float变为double外,其他部分没有明显错误。不过,代码中确实存在一些格式问题和逻辑上的遗漏,例如缺少大括号来正确包围条件块。

    修正后的代码示例,确保了正确的类型匹配,并使用了一个小的容差值来比较是否接近零,避免直接使用==进行浮点比较:

    #include <stdio.h>
    #include <math.h>
    
    void f1(double a, double b, double c) {
        printf("%lf %lf\n", (-b + sqrt(b * b - 4 * a * c)) / (2 * a), (-b - sqrt(b * b - 4 * a * c)) / (2 * a));
    }
    
    void f2(double a, double b, double c) {
        printf("%lf\n", (-b / (2 * a)));
    }
    
    void f3() {
        printf("无根\n");
    }
    
    int main() {
        double a, b, c, d;
        const double epsilon = 1e-9; // 定义一个很小的数来比较接近零的情况
        scanf("%lf %lf %lf", &a, &b, &c);
        d = b * b - 4 * a * c;
    
        if (d > epsilon) {
            f1(a, b, c);
        } else if (fabs(d) < epsilon) { // 使用fabs确保正负零都视为接近零
            f2(a, b, c);
        } else {
            f3();
        }
    
        return 0;
    }
    

    这段代码应该能正确处理double类型的输入,同时避免了直接用==比较浮点数可能导致的问题。请确保在编译和运行时,你的编译器支持并正确处理了double类型的运算。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月18日
  • 已采纳回答 5月10日
  • 创建了问题 4月29日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析