看板 Electronics 關於我們 聯絡資訊
(代PO) 大家好,小弟最近在學浮點數 有幾個運算觀念卡關,因此來這邊求助大家。 這邊問題都以IEEE 754 單精度浮點數為例 (即1個sign bit,8個 exponent bit,23個mantissabit) 第一個問題: 兩個浮點數在算加減法的時候,exponent小的mantissa要對齊exponent大的mantissa 也就是要看兩個浮點數的exponent差距多少來看mantissa要移位多少 那如果exponent小的那個的mantissa在移位過後超過mantissa所能表示的範圍 要把超過範圍的那幾個bit一起算,還是要捨去呢? 舉例來說 我要算兩個浮點數相減 第一個數: 0 10010011 0000 0000 0000 0000 1111 111 | |------| |--------------------------| sign exponent mantissa 第二個數: 1 10001110 0000 0000 0000 0111 1111 111 | |------| |--------------------------| sign exponent mantissa 第一個數的exponent換成十進位是147,第二個數的exponent換成十進位是142 而147-127(bias)=20,142-127=15 所以事實上上面兩個數可以變為: 第一個數: 1.0000 0000 0000 0000 1111 111 * 2^20 第二個數: -1.0000 0000 0000 0111 1111 111 * 2^15 因為第二個數比第一個數的次方少五,所以要右移5個bit 那麼問題來了,移完之後是會變成 (一)所有bit都保留,因此共要28bit表示mantissa -0.0000 1000 0000 0000 0011 1111 1111 *(2^20) |----| 這五個bit超過23bit (二)超過23bit之後直接砍掉,因此滿足23bit表示mantissa -0.0000 1000 0000 0000 0011 111 *(2^20) (三)加入round,guard,sticky三個bit去考慮,因此用25bit表示mantissa -0.0000 1000 0000 0000 0011 1111 1 且設S=1(因為砍掉後面三個1) | | G R 是上面(一)、(二)、(三)的哪一種呢? 因為這三種不同的移位方式會造成最後答案都不一樣, 所以我想IEEE 754應該會有明確的規範。 我個人是比較傾向於第(三)種, 因為如果是第(一)種的話,兩個浮點數若exponent差太多 那就要保存一大堆數字,像是兩數的exponent如果差了一百 那小的exponent很可能就要保存一百個0外加原本的23個mantissa 等於要保存123個bit,以硬體的角度而言應該是不會這樣設計? 第二個問題: 在網路上查到的引入round,guard後的rounding方法大概是這樣 若 (一): (G,R) = (0,0)>捨去 (二): (G,R) = (0,1)>捨去 (三): (G,R) = (1,0)>看sticky bit是多少決定要不要捨or進 (四): (G,R) = (1,1)>進位 我對於(一),(二),(四)這三種方式都能接受 但是(三),若(G,R) = (1,0)的話 換成十進位不就是0.5,以四捨五入的角度來說不是就是直接進位嗎? 為什麼還要看sticky是多少來決定要不要進位呢? 目前主要就這兩個問題,希望各位可以替我解答一下,感激不盡! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.160.49.195 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1590756972.A.FD5.html
colinshih: 你怎麼手算,浮點就這麼算,但超出的位數用1-bit表示即可 05/29 21:23
謝謝您的回答 但是超出的BIT似乎沒辦法只用1BIT表示吧? 如果要表示的話,應該至少也要用GUARD和ROUND兩個BIT來表示吧?
colinshih: 100-0.0011,100 + 0.0011 那一位要設在那?想想就懂了 05/29 22:02
抱歉,小弟資質較差 想了蠻久的還是沒辦法了解您在說什麼 我是看到白算盤課本上的範例在移位的時候若有超過範圍的話 似乎是保留一個GUARD一個ROUND來運算 跟您說的似乎不太一樣才會這樣問@@.. ※ 編輯: ayn775437403 (118.160.49.195 臺灣), 05/29/2020 23:32:50
colinshih: ex 100+0.0011->100.0+0.01->100.01 g.rs=0.01 05/30 00:21
colinshih: 按rounding method 決定mantissa 05/30 00:21
colinshih: sticky = next bit of rounding = or(001) 05/30 00:23
colinshih: sticky = next bit of rounding = or(011) 修正 05/30 00:24
colinshih: 011 是 被加數在 rounding bit 後的數 05/30 00:26
所以依照您的意思來說 我問題一的答案應該是(三)吧? 就是需要加入g r s來判斷對吧 ※ 編輯: ayn775437403 (114.43.134.169 臺灣), 05/30/2020 16:14:03