首页
社区
课程
招聘
[求助]对书中的判断浮点数值是否为0不解
发表于: 2013-4-3 01:05 23045

[求助]对书中的判断浮点数值是否为0不解

2013-4-3 01:05
23045
书中代码是

        float fTemp = 0.0001f;
        if(fFloat >= -fTemp && fFloat <= fTemp)
        {
                // fTemp等于0
        }

但0.0001f经IEEE转换后不是应该
符号位:0
指数位: 0+127, 二进制 01111111
尾数位:00000000000001101000110

最后应该是 0 01111111 00000000000001101000110
即十六进制数为 0x3F800346

为啥调试时,值是 0x38D1B717???
请问是哪里搞错了?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
#define FLT_EPSILON 1.19209290E-07F
是因為這個嗎
2013-4-3 09:06
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个不太清楚,还没看到后面,不过早上从看了一下,发现书上这么一句话
"移动到除符号位的最高位为1处,停止移动"
这应该是IEEE编码的一个约定吧?

////////////////////////////////////////////////////////////////////////////////////////

然后现在有另外的问题,书上写的
"IEEE编码转换后得到一个近似值,存在一定误差,再将这个IEEE编码值转成
十进制小数,得到1.2516582,......这就解释了为什么C++在比较浮点数值是否
为0时,要做一个区间比较而不是直接进行等值比较"

  float fTemp = 0.0001f;
  if(fFloat >= -fTemp && fFloat <= fTemp)
  {
    // fTemp等于0
  }

这里fTemp 为什么会等于零呢?
0.0001f经IEEE编码转换后,明明是0x38D1B717,大于零的啊.
这里想不通,求解.
2013-4-3 09:42
0
雪    币: 17
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
计算机是对的。
0.0001 (10进制) = 1/2^14 + 1/2^15 + 1/2^17……
=  1.101…… * 2^-14 (2进制)

指数位: -14 + 127 = 01110001 (二进制) // 指数为127的偏移。即加上127
尾数位: 序列的开头应该是101…… // 隐藏着一个1。即小数点前面的1.默认是存在的.

那32位数开头应该是001110001101…… 就是0x38D……
2013-4-3 10:12
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看到你的帖子我才仔细看了下,指数部分为啥要+127啊??
==============================================
懂了。。。
2013-6-30 20:02
0
游客
登录 | 注册 方可回帖
返回
//