浮点数相等比较

文章目录

  • 浮点数相等(假)的比较
  • 精度
  • 浮点数相等(真)的比较
  • 总结


浮点数相等(假)的比较

浮点数从十进制转换成二进制,在有时计算不尽时,有可能会发生精度损失,这就有可能导致本来相等的浮点数变成不相等。
如下:

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;
}

结果如下:
浮点数相等比较_第1张图片
可以发现if语句的判断语句认为**(n-0.1)不等于0.1**,于是我们知道浮点数的相等比较不能用==,那么我们要如何来判断浮点数是否相等?答案是要进行精度范围比较,那什么是精度


精度

在C语言中精度包含在float.h这个头文件中。

其中double的精度如下:
浮点数相等比较_第2张图片
表示DBL_EPSILON为使1.0+DBL_EPSILON不等于1.0的最小正数。
其中float的精度如下:
在这里插入图片描述
表示FLT_EPSILON为使1.0+FLT_EPSILON不等于1.0的最小正数。


浮点数相等(真)的比较

那什么是精度范围比较?
在生活中,工厂生产的产品有一些会有误差,而产品要在误差允许的范围内通过检查为合格品。
精度范围就和误差范围差不多。
画图表示如下:
其中fabs函数为求x-y的绝对值,头文件在
浮点数相等比较_第3张图片


#include 
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;
}

结果如下:
浮点数相等比较_第4张图片
这就是浮点数的正确表示形式。


总结

以上就是浮点数相等的一些知识。

你可能感兴趣的:(C语言,c++)