我们知道在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&#