求方程a^2+b*x+c=0的解。
a=0,不是一元二次方程; b^2-4ac=0,有两相等的实根;x1=x2=-2a/b;
b^2-4ac>0,有两不等的实根;
p=-b/2a,q=sqrt(b^2-4ac)/2a;x1=p+q,x2=p-q;
b^2-4ac<0,有两个共轭复根;
p=-b/2a,q=sqrt(4ac-b^2)/2a;x1=p+qi,x2=p-qi
#include
#include
int main()
{
double a,b,c,disc,x1,x2,p,q;
printf("请输入函数的系数a,b,c:");
scanf("%lf%lf%lf",&a,&b,&c);
if(fabs(a)<=1e-6) //fabs(a)<=1e-6等价于|a|<1*10^(-6);
printf("不是一元二次方程\n");
else
{
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6)
printf("方程有两个相等的实根:\nx1=x2 = %.4f\n",-b/(2*a));
else if(disc>1e-6)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("方程有两个不等的实根:\nx1 = %.4f\nx2 = %.4f\n",x1,x2);
}
else
{
p=-b/(2*a); //r为复数的实部;
q=sqrt(-disc)/(2*a); //i为复数的虚部;
printf("方程有两个共轭复根:\nx1 = %.4f+%.4fi\nx2 = %.4f-%.4fi\n",p,q,p,q);
}
}
return 0;
}
/*这是为了判断浮点数相等,由于计算机保存的浮点数是2进制的,在精度上有一定的偏差。
if (disc == 0.0) 时,disc不一定精确地等于0,也许会等于0.000001。为了避免浮点数比
较上的误差,就要设定一个误差范围,也就是(-1e-6, 1e-6)这个范围内,如果disc落在这
个范围内,就认为其等于0了*/
运行结果截图: