浮点变量不可用“==” 或“!=” 与数字比较,那么如何判断两个浮点数相等?

一、浮点变量不可用“==” 或“!=” 与数字比较

	float i = 9.3654564;
	if(i == 9.3654564)
	{
		printf("test ok\n");
		
	}
	else
	{
		printf("test error\n");
		
	}

运行结果为test error

无论是 float 还是 double 类型的变量,都有精度限制。
所以一定要避 免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

我没法理解为什么精度限制,就无法用“==”或“!=”与数字比较。
通过《深入理解计算机系统第三版》 P22
(3.14 + 1e20) - 1e20 结果为0.0,而3.14 + (1e20 - 1e20) = 3.14。浮点数只能表示近似值
【1e20表示1*10的20次方】

二、那么该如何判断两个浮点数相等?

假设浮点变量的名字为 x,应当将 if (x == 0.0) // 隐含错误的比较
转化为 if ((x>=-EPSINON) && (x<=EPSINON)) 其中 EPSINON 是允许的误差(即精度)。

float的精度误差在1e-6 ==> 1*10^-6 ==> 1/10^6 ==>也就是0.000001
double精度误差在1e-15 ==>也就是0.000000000000001

例:判断float a,b是否相等

if(fabs(a-b) < 1e-6)
printf("a等于b\n");
else
printf("a不等于b");

另外注意fabs()和abs()的区别:fabs()是对浮点数求绝对值,abs()是对整数求绝对值。

或者自定义精度值:

#define EPSILON 0.000001 //根据精度需要
if ( fabs( fa - fb) < EPSILON )
{
printf("fa<fb\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值