作者boyulin (Active study)
看板CYCU-IM
標題[轉錄][教學] 計概 IEEE754 表示式
時間Fri Feb 6 22:59:00 2009
※ [本文轉錄自 Army-Sir 看板]
作者: Liroy (Liroy) 看板: Army-Sir
標題: [教學] 計概 IEEE754
時間: Sun Jan 27 20:53:36 2008
IEEE754為一種二進位小數的標準表示式,以精確度分成單倍精和雙倍精。
單倍精(32bit):以32個bit來表示一個二進位小數,格式如下
s(1 bit) exp(8 bit) fraction(23 bit) => 1+8+23=32 bit(沒錯吧XXXD)
化簡方式分成幾步驟(十進位->IEEE754):
1. 十進位->二進位
2. 二進位正規化
3. exp加上bias值
4. fraction扣去隱藏位元
eg: -5(10)化成IEEE754表示式
1. -5(10) = -101
2. -101 = -1.01 x 2^2
3. 2 + 127 = 129(10) = 10000001(2) - 這個只要一般二進位表示即可
不需用二的補數,因為你已經加上bias了
4. 1.01 -> .01 (1被隱藏起來了,剩下小數點後面的東西)
s exp fraction
=> 1 10000001 01000000000000000000000
ps:可能有人會問127是什麼?127為bias,再化成IEEE754時都固定要加上這個值
又有人問,幹麻加這個,因為這樣的化簡可以簡化兩個IEEE754小數做運算時的步驟
怎樣的簡化,就不在這裡討論範圍內了。(詳見白算盤XXXXD)
ps2:有人會問幹麻把小數點前的那個1隱藏起來呀。答案是,因為正規化時,小數點前
一定是1,所以可以省略,這樣就可以多一個bit來表示小數,可增加小數精確度
ps3:exp只需要用二進位表示就好了,因為你已經加上bias了,所以不會變負的,
不需要用到二的補數來表示這個部份。
----
雙倍精(64 bit):以64個bit來表示一個二進位小數,格式如下
s(1 bit) exp(11 bit) fraction(52 bit) => 1+11+52=64 bit(沒錯吧XXXD)
化簡方式分成幾步驟(十進位->IEEE754):
1. 十進位->二進位
2. 二進位正規化
3. exp加上bias值
4. fraction扣去隱藏位元
eg: -5(10)化成IEEE754表示式
1. -5(10) = -101
2. -101 = -1.01 x 2^2
3. 2 + 1023 = 1025(10) = 10000000001(2) - 這個只要一般二進位表示即可
4. 1.01 -> .01 (1被隱藏起來了,剩下小數點後面的東西)
s exp fraction
=> 1 10000000001 0100...0(好多零~囧 1後面一共有50 bit,自己算吧)
備註:雙倍精bias為1023 (因為exp bit一共有11個)
----
另外單倍精exp最多只能到11111110 ,最小也只能到達00000001
妳會納悶11111111 和 00000000 怎麼不用- -a
因為呀!! 這兩個拿來當另外處理的
exp=255 fraction≠0 =>NaN (表非數字)
exp=255 fraction=0 =>±∞(依s來區別是正還是負)
exp=0 fraction≠0 =>不足位,underflow,denormalized(太小了,小到無法表示)
exp=0 fraction=0 =>用來表示0.0這個數 (有的版本還會分正負零)
雙倍精依此類推,exp無法使用11111111111 和 00000000000
例外處理所表示的跟單倍精一樣,只是255改成2047
......|
-------------------|
..|
..|
-------------------|
......
*--可用IEEE754表示--* 0 *--可用IEEE754表示--*
亮粉紅表示overflow,數字太大無法表示,∞
亮黃色表示underflow,數字太小無法表示,denormalized number
-- 表示可用IEEE754正規表示式表示的範圍 (中間的0也可以表示喔!!別把他忽略了)
----
此外補充:
IEEE754 單倍精正規表示範圍最大正數:≒ 2 x 10^38
最小正數:≒ 2 x 10^-38
最大負數:≒ -2 x 10^-38
最大負數:≒ -2 x 10^38
IEEE754 雙倍精正規表示範圍最大正數:≒ 2 x 10^308
最小正數:≒ 2 x 10^-308
最大負數:≒ -2 x 10^-308
最大負數:≒ -2 x 10^308
----
最大數和最小數證明:
IEEE754單倍精最大正數->0 11111110 11111111111111111111111 (IEEE754)
=> + 1.11111111111111111111111 x 2^(254-127) ≒ 2.0 x 2^127 ≒ 2 x 10^38
^^^^^^^^^^^^^^^^^^^^^^^^^->大約等於2.0,大家應該沒異議吧!
IEEE754單倍精最小正數->0 00000001 00000000000000000000000 (IEEE754)
=> + 1.00000000000000000000000 x 2^(1-127) ≒ 1.0 x 2^-126 ≒ 2 x 10^-38
其他依此類推,我懶著打了ˊˋ。數零數到我眼睛都花了~ε(┬┬_┬┬)3
這應該就全部IEEE754的精隨了!!~有問題再問吧<(_._)>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.105.172.111
推 Ryx:謝謝講解 這下有得看了= = 01/27 20:58
推 f910567:感謝 明白 了解 <(@ ̄︶ ̄@)> 01/27 21:01
推 gnss:太好了 謝謝你! 01/27 21:03
→ Liroy:我補個圖表一下@@ 01/27 21:05
推 SuperCEO:好文推 01/27 21:05
→ Liroy:補完了,IEEE754所能表示的範圍,有補一張圖,應該比較明瞭 01/27 21:10
推 khakidream:推熱心大大好文~ 01/27 21:15
推 zitadakimas:多謝你讓我喚起兩年前的記憶 01/27 21:27
推 SuperCEO: 喚起五年前的記憶 01/27 21:31
→ Liroy: 一個月後 01/27 21:32
推 Gortage:耶耶 完全無以前記憶可言 但是終於懂一些了!!!!!!!! 01/27 22:10
推 Haskell:最後證明最小正數那邊應該是 1.0 x 2^-126 喔 01/28 10:33
※ 編輯: Liroy 來自: 59.105.172.111 (01/28 11:01)
→ Liroy:感謝指證,看太多零跟一果然會眼花~囧XXXXD 01/28 11:01
推 ROwater:推 01/29 15:41
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.139.234.177