|
|
[求助]
再谈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 |
|