C 当系数可能为0时,求解二次方程

C 当系数可能为0时,求解二次方程,c,floating-point,double,C,Floating Point,Double,我遇到了一个问题,需要编写一个C程序来求解方程ax2+bx+C=0,其中a、b和C是双类型的系数。任何系数都可以是零。在这个问题中,我不清楚如何处理double变量 这是我的密码。至于现在,我知道我的程序不能区分两个根和无限多个根。它也不检测“线性方程情况”。我怎样才能让它检测到无限多的解决方案?我在评论中也被建议,如果b>0,在判别式之前用减号计算根,然后使用越南定理。我明白这是因为两个数字相加总是更准确。我也猜我应该做与b

我遇到了一个问题,需要编写一个C程序来求解方程ax2+bx+C=0,其中abC是双
类型的系数。任何系数都可以是零。在这个问题中,我不清楚如何处理
double
变量

这是我的密码。至于现在,我知道我的程序不能区分两个根和无限多个根。它也不检测“线性方程情况”。我怎样才能让它检测到无限多的解决方案?我在评论中也被建议,如果b>0,在判别式之前用减号计算根,然后使用越南定理。我明白这是因为两个数字相加总是更准确。我也猜我应该做与b<0完全相反的事情。但是如果b==0呢?在这种情况下,程序将不会执行任何操作。或者我应该在b<0中包含b==0,并且有b DBL_EPSILON)&(fabs((a*x2*x2+b*x2+c))>DBL_EPSILON))//如果两个插入根都不满足方程 printf(“否”); } } 返回0; }
由于不允许被零除,您必须将问题分为4种情况:

  • a!=0: 这是您在代码中处理的情况

  • a==0&&b!=0 : 这是一个线性方程,其中解为x=-c/b

  • a==0&&b==0&&c!=0:x没有可能的值

  • 在最后一种情况下,a,b和c等于0:x有无穷多个解


  • 编辑:与删除的epsilon进行比较,因为它们似乎没有用

    由于不允许被零除,您必须将问题分为4种情况:

  • a!=0: 这是您在代码中处理的情况

  • a==0&&b!=0 : 这是一个线性方程,其中解为x=-c/b

  • a==0&&b==0&&c!=0:x没有可能的值

  • 在最后一种情况下,a,b和c等于0:x有无穷多个解


  • 编辑:与epsilon的比较已删除,因为它们似乎无用

    代码中存在一些问题:

    • 您应该检查
      scanf()
      的返回值,以避免在无效输入上出现未定义的行为
    • 您应该为中间结果使用局部变量,以提高代码可读性
    • 您的
      printf
      语句不正确:您应该传递双变量的值,而不是它们的地址:
      printf(“%lf”,&x1)应为:

      printf("%f", x1);
      
    关于退化情况,在尝试求解二次方程之前,应该先测试这些情况

    以下是更正的版本:

    #include <stdio.h>
    #include <math.h>
    
    int main() {
        double a, b, c, delta, x1, x2;
    
        if (scanf("%lf%lf%lf", &a, &b, &c) != 3) {
            printf("invalid input\n");
            return 1;
        }
        if (a == 0) {
            // not a quadratic equation
            if (b != 0) {
                printf("one solution: %g\n", -c / b);
            } else {
                if (c != 0) {
                    printf("no solution\n");
                } else {
                    printf("all real values are solutions\n");
                }
            }
        } else {
            delta = b * b - 4 * a * c;
    
            if (delta < 0) {
                printf("no real solution\n");
            } else
            if (delta == 0) {
                printf("one double solution: %g\n", -b / (2 * a));
            } else {
                x1 = (-b + sqrt(delta)) / (2 * a);
                x2 = (-b - sqrt(delta)) / (2 * a);
                printf("two solutions: %g, %g\n", x1, x2);
            }
        }
        return 0;
    }
    
    #包括
    #包括
    int main(){
    双a,b,c,δ,x1,x2;
    如果(扫描频率(“%lf%lf%lf”、&a、&b和&c)!=3){
    printf(“无效输入\n”);
    返回1;
    }
    如果(a==0){
    //不是二次方程
    如果(b!=0){
    printf(“一个解决方案:%g\n”,-c/b);
    }否则{
    如果(c!=0){
    printf(“无解决方案”);
    }否则{
    printf(“所有实际值都是解决方案\n”);
    }
    }
    }否则{
    δ=b*b-4*a*c;
    if(δ<0){
    printf(“没有真正的解决方案”\n);
    }否则
    如果(增量==0){
    printf(“一个双溶液:%g\n”,-b/(2*a));
    }否则{
    x1=(-b+sqrt(δ))/(2*a);
    x2=(-b-平方比(δ))/(2*a);
    printf(“两种解决方案:%g,%g\n”,x1,x2);
    }
    }
    返回0;
    }
    
    您的代码中存在一些问题:

    • 您应该检查
      scanf()
      的返回值,以避免在无效输入上出现未定义的行为
    • 您应该为中间结果使用局部变量,以提高代码可读性
    • 您的
      printf
      语句不正确:您应该传递双变量的值,而不是它们的地址:
      printf(“%lf”,&x1)应为:

      printf("%f", x1);
      
    关于退化情况,在尝试求解二次方程之前,应该先测试这些情况

    以下是更正的版本:

    #include <stdio.h>
    #include <math.h>
    
    int main() {
        double a, b, c, delta, x1, x2;
    
        if (scanf("%lf%lf%lf", &a, &b, &c) != 3) {
            printf("invalid input\n");
            return 1;
        }
        if (a == 0) {
            // not a quadratic equation
            if (b != 0) {
                printf("one solution: %g\n", -c / b);
            } else {
                if (c != 0) {
                    printf("no solution\n");
                } else {
                    printf("all real values are solutions\n");
                }
            }
        } else {
            delta = b * b - 4 * a * c;
    
            if (delta < 0) {
                printf("no real solution\n");
            } else
            if (delta == 0) {
                printf("one double solution: %g\n", -b / (2 * a));
            } else {
                x1 = (-b + sqrt(delta)) / (2 * a);
                x2 = (-b - sqrt(delta)) / (2 * a);
                printf("two solutions: %g, %g\n", x1, x2);
            }
        }
        return 0;
    }
    
    #包括
    #包括
    int main(){
    双a,b,c,δ,x1,x2;
    如果(扫描频率(“%lf%lf%lf”、&a、&b和&c)!=3){
    printf(“无效输入\n”);
    返回1;
    }
    如果(a==0){
    //不是二次方程
    如果(b!=0){
    printf(“一个解决方案:%g\n”,-c/b);
    }否则{
    如果(c!=0){
    printf(“无解决方案”);
    }否则{
    printf(“所有实际值都是解决方案\n”);
    }
    }
    }否则{
    δ=b*b-4*a*c;
    if(δ<0){
    printf(“没有真正的解决方案”\n);
    }否则
    如果(增量==0){
    printf(“一个双溶液:%g\n”,-b/(2*a));
    }否则{
    x1=(-b+sqrt(δ))/(2*a);
    x2=(-b-平方比(δ))/(2*a);
    printf(“两种解决方案:%g,%g\n”,x1,x2);
    }
    }
    返回0;
    }
    
    当系数可能为0时,求解二次方程

    我怎样才能让它检测到无限多的解决方案

    a==0&&b==0&&c==0

    在这段代码的任何地方都不需要DBL_EPSILON。另见

    但是如果b==0呢


    或者我应该在b<0中包含b==0,当系数可能为0时,让b解二次方程吗

    我如何才能使它检测到无限数量的解

    a==0&&b==0&&c==0

    在这段代码的任何地方都不需要DBL_EPSILON。另见

    但是如果b==0呢

    或者我应该在b<0和
    if (a==0) {
      if (b == 0) {
    
    if ((b * b - 4 * a * c) < 0)
    // 
    if (b * b < 4 * a * c) 
    
    //if ((b * b - 4 * a * c) < 0) {
    //    printf("no"); 
    //} else {
    //    x1 = (-b + sqrt(b * b - 4 * a * c))
    
    double discriminate = b * b - 4 * a * c;
    if (discriminate < 0) {
        printf("no"); 
    } else {
        double d = sqrt(discriminate);  
        x1 = (-b + d)
    
        double d = sqrt(discriminate);
    
        // Note x1*x2 = c/a
        if (b < 0) {
          x2 = (-b + d)/(2*a);
          x1 = c/a/x2;
        } else {
          x1 = (-b - d)/(2*a);
          x2 = c/a/x1;
        } 
        printf_roots("2 roots", x1, x2);
    
    printf("%g\n", some_double);
    // or better
    printf("%.*e\n", DBL_DECIMAL_DIG -1, some_double);