回复:s200用 自由口通讯 如何传实数到 vb

Am_Programer

  • 帖子

    641
  • 精华

    2
  • 被关注

    3

论坛等级:侠士

注册时间:2003-06-06

普通 普通 如何晋级?

发布于 2007-05-17 00:20:43

0楼

你还可参考
http://www.ad.siemens.com.cn/club/bbs/post.asp?b_id=3&a_id=331754&s_id=0&num=7#anch

姑苏城外 回答

主题:回复:如何用十六进制表示一个带小数的实数

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 的順序放的. (位址由低到高)

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33257条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。