无法在二次方程的代码中找到错误

时间:2014-05-08 09:47:04

标签: c runtime-error

我的朋友要求找到错误,我将复杂解决方案的真实部分视为零。 任何人都可以告诉我为什么以及如何解决它, 谢谢你的帮助

#include<stdio.h>
#include<math.h>
main()
{
    int i,a,b,c,d;
    float x,y;
    printf("ener the values for a,b,c");
    scanf("%d%d%d",&a,&b,&c);
    if(a==0)
    {
        printf("not a quadratc equation");
    }
    else
    {
        d=(b*b-4*a*c);
        if(d==0)
        {
            printf("roots are equal");
            x=-b/(2*a);
            printf("\n%f\n%f",x,x);
        }
        else if(d>0)
        {
            x=(-b+sqrt(d))/(2*a);
            y=(-b-sqrt(d))/(2*a);
            printf("the roots are %f and %f",x,y);
        }
        else if(d<0)
        {
            x=-(b/(2*a));
            printf("%f",x);
            y=(sqrt(-d))/(2*a);
            printf("the roots are %f+i%f and %f-i%f",x,y,x,y);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您正在对int变量执行大量数学运算,并将结果存储在float中。 意味着算术是使用浮点执行的,它都是整数。

sqrt() function返回double,以便保存虚部。对于实部,所有数学都是整数,因此-(b / (2 * a))将使用整数进行求值,然后最终结果将作为浮点存储在x中,当然没有任何小数部分。< / p>

答案 1 :(得分:0)

问题很简单,只需更改下面的代码

else if(d<0)
    {
      x=(-((float)b/(2*(float)a)));    // type conversion to float from int
      printf("%f",x);
      y=(sqrt(-d))/(2*a);
      printf("the roots are %f+i%f and %f-i%f",x,y,x,y);
    }

原因是,在二次方程中复数根计算,如果实部小于1(例如0.2),它将作为整数存储到变量x中(整数表示只有小数部分的数字),所以你必须这样做类型转换以获取正确的数据