C语言加餐--浮点数比较
在之前就说过浮点数的相等不能直接用==来进行比较,这是为什么呢?这是因为浮点数在内存中存储会有一定误差的原因.但是之前当我们并没有验证,下面我们来验证一下.
浮点数的存储误差
下面我们通过多位数的输出来验证一下这个存储误差.
int main()
{float f = 0.1;float f1 = 1.0;printf("%.50f\n", f);printf("%.50f\n", f1);printf("%.50f\n", 0.1);printf("%.50f\n", (f1 - 0.9));return 0;
}
输出结果见下,可以看出后两个的0.1的输出并不相同.这就是存储误差导致的.
这时候用==去验证二者相等是不可行的,我们也可以验证一下.
int main()
{float f = 0.1;float f1 = 1.0;if ((f1 - 0.9) == 0.1){printf("相等\n");}else{printf("不等\n");}return 0;
}
输出结果见下:
浮点数的比较方法
既然浮点数不能用==直接进行等于比较,那我们改如何进行浮点数之间的比较呢?
通常有两种方法,一是自己设置一个精度,如果二者之间差距小于这个精度就相等,反之则不等.二是用编译器自带的精度进行比较,如果二者之间差距小于这个自带精度就相等,反之则不等.通常情况下我们使用第二种来进行比较.
编译器给出了两个最小精度,一个是float的最小精度,FLT_EPSILON;另一个是double的最小精度,DBL_EPSILON.使用上面两个精度要包含相应的头文件<float.h>.那么什么是最小精度呢?最小精度就是使一个数发生改变的最小的数.加上他之前的数就会发生改变.
前提都了解好了,那么就让我们看下浮点数的比较,我以double类型为例
#include<float.h>
#include<math.h>int main()
{double f = 0.1;double f1 = 1.0;if (fabs((f1 - 0.9) - 0.1)<DBL_EPSILON){printf("相等\n");}else{printf("不等\n");}return 0;
}
这样输出结果就是相等了.
浮点数与0的比较
有了之前的铺垫,与0的比较也可以看作这个数-0是否在最小精度内,也就相当于这个数是否在最小精度内.
#include<float.h>
#include<math.h>int main()
{double f = 0.000000000000000000000000001;if (fabs(f) < DBL_EPSILON){printf("为0\n");}else{printf("不为0\n");}return 0;
}
看起来是很不错了,但是还有一个小细节我们要说一下,就是fabs(f) < DBL_EPSILON这里是否要带上等于号?
应该是不需要带等号的因为一个数加上最小精度数字是会发生改变的,而数字加上0是不会发生任何变化的,所以判断为0时不应该包括最小精度.
以上就是浮点数的比较啦.希望可以使大家有所收获.