使用动态EPSILON值判断两个浮点数相等(以单精度浮点数为例)

本文探讨了如何使用动态EPSILON值来判断两个浮点数是否相等,特别是在单精度浮点数的情况下。通过分析浮点数的二进制表示,发现不同数值范围内的浮点数精度不同,因此静态的EPSILON可能不适用。提出了根据浮点数的值动态调整EPSILON的方法,以提高判断相等性的准确性。
摘要由CSDN通过智能技术生成

我们知道在C的的头文件“float.h“中定义了一个名为FLT_EPSILON的值,其大小为
2^-23=1.19209289550E-7。看到很多朋友使用fabs(f1-f2)<FLT_EPSILON这个表达式来判定两个浮点数是否相等,实际上这个判定只有当1=<|f1|、|f2|<2时才会成立,为什么是这样?
我们知道FLT_EPSILON的定义为1.0+x>1.0,当x为最小的使这个表达式成立时的值被称为FLT_EPSILON。

十进制1.0的二进制为1.0ⅹ2^0,规格化后在内存中的单精度浮点二进制表示为:
0,0111,1111,00000000000000000000000
比1.0大的最小的值单精度浮点表示为:
0,0111,1111,00000000000000000000001
这两个值的差为0.00000000000000000000001=2^-23,这个差值就是FLT_EPSILON。

那么比2.0大的最小的值又是多少?
2.0的二进制为1.0ⅹ2^1,规格化后在内存中的单精度浮点二进制表示为:
0,1000,0000,00000000000000000000000
比2.0大的最小的值单精度浮点表示为:
0,1000,0000,00000000000000000000001
这两个值的差值是多少?并不是2-23而是2-22!因为这个差值还得乘以指数21等于21ⅹ2-23=2-22

当2.0<f<4.0时,f的二进制为1.XXXXXXX…ⅹ2^1,规格化后在内存中的单精度浮点二进制表示为:
0,1000,0000,XXXXXXXXXXXXXXXXXXXXXXX&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值