看板 CYCU-IM 關於我們 聯絡資訊
※ [本文轉錄自 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
neverend06:希望對您有幫助 http://Now.to/1l1 05/10 10:16
ROwater:推 01/29 15:41
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.234.177