浮点型的大小比较

本文探讨了浮点型数据在存储时由于精度损失导致的不精确性,指出不能直接使用`==`进行浮点数比较。解释了浮点数在内存中的二进制表示可能导致的精度问题,并提出了解决方案,即通过设定一个精度范围,利用fabs函数判断两个浮点数的差值是否在该范围内来比较它们的接近程度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浮点型存储时的精度损失

浮点型不能用==来比较数据是否相等,因为浮点型数据在存储时会损失精度,可能大于原值也可能小于。
在下图中我们可以看到,编译器打印在屏幕上的的值和我们期望得到的值并不相等,数据可能变大,也可能变小。
这与浮点型在内存中的存取方式有关。
在这里插入图片描述

浮点型的存取方式

我的另一篇博客里详细解释了浮点数的存取方式是怎样的,点击链接查看。
我们知道,任何数据在内存中是以二进制的形式进行存储的,也就意味着浮点型数据的小数位在2进制下是有可能超出规定的比特位的。我们小数转二进制呢是用乘二取整法,比如0.3,0.3×2=0.6,整数位为0,则取比特位为0,然后用0.6×2=1.2,整数位为1,那么取比特位为1,然后以此类推,不断得到比特位,然后你会发现有些它会一直乘2,就是不等于0,而我们的比特位是有限的,也因此它会损失精度。

如何解决浮点型的比较大小的问题

要想比较两个浮点数的大小,我们需要确认一个精度,用两个浮点数相减之后的值与精度比较。
在下方代码中,我们的目的是比较确定a和b是否相等,那么只需要确认两数相减的绝对值是否在一精度内就行。
使用fabs函数计算,fabs函数是c语言库函数中取绝对值的函数,需包含头文件math.h

#include <stdio.h>
#include<math.h>
#include<float.h>
#define EPSILON 0.0000001//宏定义一个精度
int main()
{
	double a = 1.0;
	double b = 0.1;
	//使用自定义精度计算		
	if((a-b) < EPSILON || (a-b)>EPSILON)
	{
		printf("a");
	}
	else
		printf("b");
	/*
	使用库中精度和绝对值函数
if (fabs(a) - b < DBL_EPSILON)
	printf("a");
else
printf("b");*/
	return 0;
	
}

:在语法上使用==是没有问题的,< > >= <=也都是没有问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值