#include <stdio.h>
#include <math.h>
#define EXP 0.0000001 /*自定义精度*/
int main()
{
double a = 0.0, b = 0.0, c = 0.0;
double x1 = 0.0, x2 = 0.0;
double p = 0.0, q = 0.0;
printf("输入方程系数:");
scanf("%lf %lf %lf", &a, &b, &c); /*双精度浮点数一般用精度判断是否为0*/
if ((a > -EXP) && (a < EXP))
{
printf("这不是一元二次方程\n");
}
else
{
double disc = b*b - 4 * a*c;
if ((disc > -EXP) && (disc < EXP))
{
printf("方程有两个相等的实根:x=%lf\n",-b/(2*a));
}
else if (disc > 0.0)
{
x1 = (-b + sqrt(disc)) / (2 * a);
x2 = (-b - sqrt(disc)) / (2 * a);
printf("方程有两个不等的实根:\n x1=%lf x2=%lf\n",x1,x2);
}
else
{
p = -b / (2 * a);
q = sqrt(-disc) / (2 * a);
printf("方程有两个共轭的复根:\n");
printf("x1 = %lf + %lfi\n", p, q);
printf("x2 = %lf - %lfi\n", p, q);
}
}
return 0;
}
结果如下:
对于float,double这样的浮点数类型,在计算机中不能准确表示,也不能直接与0作比较。通常可以设置一个精度,在正负精度范围之间时,就可以认为该浮点数为0了。
例如:
#include<stdio.h>
#define exp 0.000001 //定义的一个精度,可以任意定义,一般取pow(10,-6)就可以
int main()
{
float a = 0.0;
float b = 0.0;
scanf("%f %f", &a, &b);
printf("a=%f b=%f\n",a,b);
if (((a-b) > -exp) && (a-b) < exp)
printf("a=b\n");
else if((a-b) > exp)
printf("a>b\n");
else if((a-b) < exp)
printf("a<b\n");
return 0;
}
结果如下:
当要比较的两个数a,b相等或等于0时,必须用这种定义精度的方式。当比较的两个数a>b时,(a-b) > 0.0也是可以的;a<b同a>b类似。