#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
float a,b,c,disc,p,q;//如果用double定义下面不可用%f,而应该用%lf
printf("请输入系数 a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);//double变量只能用%lf在scanf输入,float变量只能用%f输入
disc=b*b-4.0*a*c;
if (fabs(a)<=1.0e-10){//如果不加绝对值fabs()函数则会出现程序判断a为-1时不为一元二次方程
printf("这不是一个一元二次方程\n");
exit(0);
}
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
if(fabs(disc)<=1.0e-10){//不可直接用等号进行判断,因为double和float定义的变量有精度,不可能为0,后面必跟有小数
printf("x1=x2=%.2f\n",p);
}
else{
if(disc>1.0e-10){
printf("x1=%lf,x2=%lf\n",p+q,p-q);
}
else
{
printf("x1=%f+i%f,",p,q);
printf("x2=%f-i%f\n",p,q);
}
}
return 0;
}
fabs()函数时用于求int变量绝对值,C语言中求整数的绝对值fabs()应该包含stdlib.h头文件中。
c语言中求绝对值的函数有
abs() 用于求int变量的绝对值
labs() 用于求long变量的绝对值
fabsf() 用于求float变量的绝对值
fabs() 用于求double变量的绝对值
fabsl() 用于求long double变量的绝对值
浮点型与0的比较
不能用浮点型数据直接和0用>=,<=来比较!!!
浮点型数值具有精度限制。例如c语言规定float类型必须至少能表示6位有效数字,即float类型必须能够表示33.333333的前六位数字,注意不是精确到小数点后六位。float可能不能完全精确地表示一个数,有可能会造成精度损失,可能会导致后很多很多位的小数无法表示出来。
同时float不可能等于“整数0”。
#include<stdio.h>
int main()
{
float a=0;
printf("%f",a);
return 0;
}
运行结果
即float类型变量一定会“表示完”他的精度。
所以float变量不可直接和整型0比较,因为浮点型变量有精度,整型变量无精度,计算机中0.000000不等于0。
所以在判断浮点型变量是否和0相等时,常用的方法是将该浮点型的绝对值与一个超级小的小数比较(在精度范围内比较),如和1.0e-10,如果浮点型比这个0.00000000...0001还小,可认为该浮点型等于0。
因为自己初学,对这方面理解不够深,希望以后有能力专门出一篇文章把他讲明白。