我的朋友要求找到错误,我将复杂解决方案的真实部分视为零。 任何人都可以告诉我为什么以及如何解决它, 谢谢你的帮助
#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);
}
}
}
答案 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中(整数表示只有小数部分的数字),所以你必须这样做类型转换以获取正确的数据