光纤熔接 ERP

弱电论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1649|回复: 0
打印 上一主题 下一主题

关于浮点数的格式...

[复制链接]
跳转到指定楼层
1#
发表于 2007-5-30 16:19:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
华为代理商
做通讯时,一般都要处理浮点数,以下是对浮点数的一个描述。
IEEE 制定之浮點數格式說明:
float 型態: 用 4 個 bytes 儲存, 也就是 32 bits. 各個 bit 的用途如下:
bit 31 23~30 0~22 ┌───┬────┬───────┐ │正負號│ 指數 │ 底數 │ └───┴────┴───────┘
double 型態: 用 8 個 bytes 儲存, 也就是 64 bits. 各個 bit 的用途如下:
bit 63 52~62 0~51 ┌───┬────┬───────┐ │正負號│ 指數 │ 底數 │ └───┴────┴───────┘
< 說明 > 正負號 (sign): 1 為負, 0 為正.
指數 (exponential): 將底數乘上 2 的指數次方後就是原來的數. 須注意的是: float 時, 因有 8 bits, 所以能表示的有 2 的 256 次方, 但因為指數應可正可負, 所以 IEEE 規定, 此處算 出的次方須減去 127 才是真的指數,所以 float 的指數可從 -126 到 128. 同理, double 型態有 11 bits, 算出的值須減去 1023, 所以 double 的指數可從 -1022 到 1024.
底數 (mantissa): 此部份格式實在難以用文字說明, 請參考下面的例子.
< 特例 > 0 因為無法用任何 2 的次方表示, 所以 0 的表示法就是 float : 00 00 00 00 double: 00 00 00 00 00 00 00 00
< 範例 > 將 17.625 換算成 float 型態. 首先, 先將 17.625 換算成 2 進位: 10001.101 (甚麼 ?? 你問我小數是怎麼換的 ?? 好吧,就告訴你好了, 因為 0.625 = 0.5 + 0.125 , 0.5 即 1/2 , 0.125 即 1/8 , 所以 0.625 換算成 2 進位是 0.101 , 如果你還沒懂, 請你再問別 人. 當然, 這裡的數字是為了講解方便才用這麼完美的小數, 實際的小數部份, 是用無限逼近出來的.) 再來將 10001.101 向右 shift 直到小數點前只剩一位 (這一位 數當然是 1), 變成了 1.0001101 x 2 的 4 次方 (因為向右移了 4 位). 此時, 我們要的底數和指數就出來了: 底數部份,因為小 數點前必為 1, 所以 IEEE 規定只記錄小數點後的就好, 所以此 題的底數為 0001101 . 指數部份實際為 4, 但在格式中須加上 127 , 固為 131 , 即二進位的 10000011. 綜合上列各項, 17.625 的 float 儲存格式就是: 0 10000011 00011010000000000000000 轉換成 byte : 41 8D 00 00 另外, 因為 INTEL CPU 是 little endian 的, 所以 41 8D 00 00 在記憶體中是按 00 00 8D 41 的順序放的. (位址 由低到高)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|广告咨询|VIP注册|关于我们|联系我们|积分规则|手机版|Archiver|弱电之家论坛 ( 京ICP备11008917号-3 )

GMT+8, 2025-7-14 18:23 , Processed in 0.084655 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表