我们定义一个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范围内才是有效的数据。
理解了这个例子,接下来我们来看浮点数与'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)
应该判断a是否位于0附近的一个很小的区间[-EPS,EPS]中,或者说a的绝对值小于等于一个很小的数EPS(可定义EPS=1e-6)
即用if(fabs(a)<=EPS) /* 正确的实数与0的比较方法 */
于是我们定义EPS=1e-6
#define EPS 1e-6