#include
#include
#include
#define EPS 1e-6
int main(int argc, const char * argv[]) {
float a,b,c,disc,p,q;
printf("input the coefficients a,b,c\n");
scanf("%f,%f,%f",&a,&b,&c);
if(fabs(a)<=EPS) //fabs()是一个对浮点数求绝对值的函数, a=0时,输出“不是一元二次方程 ”
{
printf("It is nout a quadartic equation!\n");
exit(0);//终止程序执行,强制返回操作系统
}
disc=b*b-4*a*c; //计算判别式
p=-b/(2*a);
q=sqrt(fabs(disc))/(2*a);
if(fabs(disc)<=EPS) //判断判别式等于0时,输出两个相等的实根
{
printf("x1=x2=%.2f\n",p);
}
else
{
if(disc>EPS)
{
printf("x1=%.2f,x2=%.2f\n",p+q,p-q);
}
else
{
printf("x1=%.2f+%.2fi,",p,q);
printf("x2=%.2f-%.2fi\n",p,q);
}
}
}
运行结果:
这里在刚开始测试时,出现了一个错误,如图所示:
得不到正确的结果。
错误的原因时在输入的时候忽略了C语言是从缓冲区读取数据的,应该用空格依次去输入数据,而错误的方法却用了空格键,c语言读取了空格,导致无法计算。
注意:
(1)fabs()和abs()函数的区别,第一,abs()函数是对整数取绝对值,fabs()函数则对浮点数取绝对值。第二,头文件不同,fabs()的头文件是#include
(2为什么没有直接和0比较呢?
答:由于实数在内存中是以浮点形式存储的, 阶码所占的位数决定实数的表数范围,尾数所占的尾数决定实数的精度,ASCII C并没有明确规定三种浮点类型的阶码和尾数所占的位数,不同的c编译器分配给阶码和尾数的尾数是不同的,无论怎样,浮点数在内存中存储时其尾数所占的位数都是有限的,因此其能表示的实数的精度也是有限的,换句话说就是浮点数并非真正意义上的实数,只是在某种范围内的近似,因此只能用近似的方法将实数和0进行比较。
if(disc==0)
这样的比较是错误的,应判断浮点数disc是否近似为0,即是否位于0附近一个很小的区间里[-EPS,EPS],