浮点数相等比较

在这里插入图片描述


浮点数相等(假)的比较

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

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

结果如下:
在这里插入图片描述
这就是浮点数的正确表示形式。


总结

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水月梦镜花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值