浮点数相等(假)的比较
浮点数从十进制转换成二进制,在有时计算不尽时,有可能会发生精度损失,这就有可能导致本来相等的浮点数变成不相等。
如下:
int main()
{
double n = 1.1;
double m = 0.1;
printf("%.50lf\n", n);
printf("%.50lf\n", m);
printf("%.50lf\n", n - 1.0);
if ((n - 1.0) == 0.1)
{
printf("(n-1.0)==0.1\n");
}
else
{
printf("(n-0.1)!=0.1\n");
}
return 0;
}
结果如下:
可以发现if语句的判断语句认为**(n-0.1)不等于0.1**,于是我们知道浮点数的相等比较不能用==,那么我们要如何来判断浮点数是否相等?答案是要进行精度范围比较,那什么是精度?
精度
在C语言中精度包含在float.h这个头文件中。
其中double的精度如下:
表示DBL_EPSILON为使1.0+DBL_EPSILON不等于1.0的最小正数。
其中float的精度如下:
表示FLT_EPSILON为使1.0+FLT_EPSILON不等于1.0的最小正数。
浮点数相等(真)的比较
那什么是精度范围比较?
在生活中,工厂生产的产品有一些会有误差,而产品要在误差允许的范围内通过检查为合格品。
精度范围就和误差范围差不多。
画图表示如下:
其中fabs函数为求x-y的绝对值,头文件在<math.h>
#include <math.h>
int main()
{
double n = 1.1;
if (((n - 1.0) - 0.1) > -DBL_EPSILON && ((n - 1.0) - 0.1) < DBL_EPSILON)
{
printf("(n-0.1)==0.1\n");
}
if (fabs((n - 1.0) - 0.1) < DBL_EPSILON)
{
printf("(n-0.1)==0.1\n");
}
return 0;
}
结果如下:
这就是浮点数的正确表示形式。
总结
以上就是浮点数相等的一些知识。