浮点数与'0'的比较

    对于整型数据a来说,要判断其是否等于0,只需写if(a == 0)来判断即可。
    而对于浮点数怎样比较呢?首先我们要了解浮点数,先来看一个例子:
    我们定义一个float类型的数据a,赋值为123456789并输出:
int main()
{
	float a;
	a = 123456789;
	printf("%f\n",a);
	return 0;
}

    输出结果为:
       由此可以看出,程序输出的结果并不是其被赋予的值。即说明了浮点数存在一定的误差。而这个误差与其本身的精度有关。
       首先,浮点数在计算机当中的二进制表达方式就决定了大多数浮点数都是无法精确表达的。现在的计算机大部分都是数字计算机,不是模拟机,数字机的离散化的数据表达方法自然无法精确表达大部分的数据量。
       其次,计算机浮点数的精度在单精度float类型下,只有7位,在进行浮点运算的时候,这个精度往往会导致运算的结果和实际期望的结果之间有误差。下面我们通过具体的实例来理解精度的问题。
       已知某两栋建筑物之间的实际距离为200m,用一个误差范围为1m的测量工具进行测量,得到4组数据。分别为:199.3m,189.7m,200.3m,201.5m;根据误差所允许的范围来看,其中只有199.3m和200.3m这两个数据是有效的。也就是在误差范围为1m的情况下,我们认为在(200-1)m~(200+1)m即199m~201m范围内才是有效的数据。
       一般情况下,设真实值为y,有效值为z,误差为x,则(y-x) <= z <= (y+x)
       理解了这个例子,接下来我们来看浮点数与'0'的比较。
       通常情况下,C语言一般将浮点数的误差确定为0.000001。因此可以将误差进行宏定义#define EPS 0.000001,接下来是浮点数与'0'比较的几种表达:
        判断a是否等于0:if(-EPS <= a && a <= EPS)
        判断a是否大于0:if(a > EPS)
        判断a是否小于0:if(a < EPS)
        下面是对于以上方法的程序应用实例:
 
void Fun(double a,double b,double c)
{
	double x1;
	double x2;
	double d = b*b - 4*a*c;
	if(-EPS<=a && a<=EPS)
	{
		if(-EPS<=b && b<=EPS)
		{
			printf("该方程有无数解!\n");
		}
		else
		{
			x1=x2 =-c/b;
			printf("x1=%f,x2=%f\n",x1,x2);
		}
	}
	else if(-EPS<=d && d<=EPS)//d==0
	{
		x1=x2=-b/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else if(d > EPS)//d>0
	{
		x1 = (-b+sqrt(d))/(2*a);
		x2 = (-b-sqrt(d))/(2*a);
		printf("x1=%f,x2=%f\n",x1,x2);
	}
	else
	{
		printf("无实根\n");
	}
}

     以上代码是求二元一次方程a*x^2+b*x+c=0的根。其中double类型的d数据在与'0'进行比较时,使用了EPS,这样考虑使得程序显得严谨且不容易出错。因此当我们以后使用浮点型数据时,都应该考虑精度的问题。


猜你喜欢

转载自blog.csdn.net/PinkBananA_/article/details/80218599