24小时热门版块排行榜    

查看: 1581  |  回复: 0

我爱小虫子

新虫 (正式写手)

[求助] 再谈float 与零值问题

想来关注一下细节,又迷茫了,望大神给解惑。。。
我们说比较float型变量x与0的大小时,要设置一个精度epsilon,
const float EPSINON = 0.00001; //自己设定的一个精度
  if ((x >= - EPSINON) && (x <= EPSINON)
在这个范围内,则认为,x是=0的。

今天看到了<float.h>头文件,
FLT_EPSILON (小的正数,float的0跨度值),我是不是可以认为 ,上面的const 常量的定义可以省略,比较直接换成if ((x >= - FLT_EPSINON) && (x <=FLT_ EPSINON) 上面说的这一堆好像没有问题,对吧

看下面:
在<float.h>头文件中,FLT_EPSILON的宏定义
#include<float.h>
cout<<"FLT_EPSILON="<<FLT_EPSILON<<endl;
cout<<"FLT_MIN="<<FLT_MIN<<endl;
float f=0.00000000000000000000000000000000000000000000000002;  //此处可以先不去看f到底多大
        cout<<f<<endl;
        cout<<(f==0)<<endl;
由下图可以看到精度的指数是-7,最小值的指数是-38,我发现,当我这个f的指数不超过-(7+38)时,它存的都是一个接近我定义的f的数,但是,如果f的指数为-46,或者-48了,这时候存的f 就是0了,f==0这时是成立的。

现在有个疑惑,我是不是可以这样认为,其实,float是可以和零值比较的,前提是它足够小(不只是小于了宏定义里的最小值,还牵扯到精度的指数)。

测试了一下,如果我定义的f的指数是-48时,(2*10^-48)结果如下图1,f显示存的是0
如果我定义的f的指数是-44时,结果如下图2,f显示存的是一个接近定义数的浮点数

以上观点是我今天测试时感觉到的,想请教大神证实一下,我有没有误解。。。。
再谈float 与零值问题
1.jpg


再谈float 与零值问题-1
2.jpg
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 我爱小虫子 的主题更新
信息提示
请填处理意见