例5.6求ax2+bx+c=0方程的解。
例4.12曾介绍过基本的算法,实际上应该有以下几种可能:
① a=0,不是二次方程。
② b2-4ac=0,有两个相等实根。
③ b2-4ac>0,有两个不等实根。
④ b2-4ac<0,有两个共轭复根。
画出NS流程图表示算法(图5.14)。
据此编写程序如下:
#include<math.h>
main()
{float a,b,c,d,disc,x1,x2,realpart,imagpart;
scanf("%f,%f,%f",&a,&b,&c);
printf("The equation");
if(fabs(a)<=le-6)
  printf("is not a quadratic");
else
{disc=b*b-4*a*c;
if(fabs(disc)<=le-6)
  printf("has two equal roots:%8.4\n",-b/(2*a));
else if(disc>le-6)
 {x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("has distinct real roots:%8.4f and %8.4f\n",x1,x2);

else
{realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
printf("has comPlex roots∶\n");
printf("%8.4f+%8.4fi\n",realpart,imagpart);
printf("%8.4f-%8.4fi\n",realpart,imagpart);
 }}

程序中用disc代表b2-4ac,先计算disc的值,以减少以后的重复计算。对于判断b2-4ac是否等于0时,要注意一个问题:由于disc(即b2-4ac)是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:if(disc==0)……因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于零而导致结果错误。所以采取的办法是判别disc的绝对值(fabs(disc))是否小于一个很小的数(例如10-6),如果小于此数,就认为disc=0。程序中以realpart代表实部P,以imagpart代表虚部q,以增加可读性。
运行结果如下:
① 1,2,1
The equation has two equalroots∶-1.0000
② 1,2,2
The equation has complex roots:
-1.0000+1.0000i
-1.0000-1.0000i
③ 2,6,1
The equation has distinct real roots:-0.1771 and =2.8229