2008年8月31日 星期日

IEEE-754 浮點數的表示法

為了防止忘記,又為重點考題,所以......

浮點數表示分為三個部份
S:符號,表示正負值,0為正,1為負
E:指數,基準值加上指數,單精度基準值為 [2^(8-1)]-1 = 127,倍精度基準值為 [2^(11-1)]-1 =1023
M:小數,又為精確值,小數值得正規劃,並且隱藏 MSB 的 1 (正規劃後面用例子解釋)

而又分為單精度與倍精度:單精度為32bits,倍精度為64bits
單精度 S:1bit E:8bits M:23bits
倍精度 S:1bit E:11bits M:52bits


ex. -12.625 使用 IEEE-754 單精度 表示浮點數

第一步驟:不管正負號直接將數值轉為二進制
 12.625 => 1100.101 = 1.100101 × 2^3

第二步驟:計算指數
 127+3=130 => 10000010

第三步驟:填入數值置於浮點數規格中
 S E      M
 1 10000010 100101 0000 0000 0000 0000 0
 
 *注意:1)小數部份要隱藏 MSB 的 1 ,只填入小數點之後的數值
     2)剩餘沒用到的地方補0,補足至 23bits (倍精度就補足到 52bits)

 如此一來可以將轉出來的浮點數再表示成 16 進制
 => 1100 0001 0100 1010 0000 0000 0000 0000
 => C14A0000

補充:
 1. 指數E保留0與255做為特殊用途,因此指數真正的範圍在1~254之間。
 2. 指數E與小數M的特殊用途組合如下
   E=0  M=0:表示0
   E=0  M≠0:未正規形式
   E=255 M=0:表示無限大 (配合正負號,可以表示正無限、負無限)
   E=255 M≠0:NaN (Not a Number)
 3. 浮點數精確度的問題
   由於浮點數當小數位數不足的時候會發生兩種 error
   a.進位誤差:超出表示範圍的數值,使用四捨五入產生的誤差
   b.捨去誤差:不足放入小數表示位數所剩餘的小數值,皆捨去產生的誤差
   所以為了解決這樣的誤差,只有提高小數點可存放的位數,但是相對的所佔用的容量就很大
 4. 維基百科的詳細說明 IEEE 754

30 則留言:

匿名 提到...

您的數值 12.625 是正數, 所以 S 應該是 0

絕色幻翼 提到...

此例是用 -12.625 來說明的,因此結果沒錯。也謝謝您的指教。

匿名 提到...

感謝您
剛好不太會
上課又很混

匿名 提到...

哈哈我明天要考計概,謝謝妳唷 我平常都超混現在給妳一點都會了XD

絕色幻翼 提到...

呵呵呵~不客氣,對你有幫助就好,不過這只是IEEE-754的標準轉換方法,如果考題出來是由題目所另外規定,就要按照題目上規定的來答題。

匿名 提到...

感謝你囖
今天考記數有救了
\(^o^)/

匿名 提到...

第一步驟:不管正負號直接將數值轉為二進制
 12.625 => 1100.101 = 1.100101 × 2^3

後面的2^3不是應該是10^3嗎0.0

ps.感謝你淺顯易懂的解說QAQ

絕色幻翼 提到...

因為已經轉為二進制,所以才是2^3
基底為 10進制 10^3 = 1000
基底為 2進制 2^3 = 1000 => 轉為10進制就是8

匿名 提到...

推淺顯易懂~我12月要考~吃鱉中 ^^
不知有沒有國營職員-儀電組的計概中試題說明之類的嗎??
IEEE.754剛好有一年有考出來
因為都是計算題~
網路上都找不到answer
如果版大有空可以分享一下嗎
不好意思囉
覺得這篇說明受益良多
謝謝您:)

絕色幻翼 提到...

關於這點就愛莫能助了
很抱歉

Xanxus 提到...

大大您寫得很好

讓我一看就懂

匿名 提到...

Thanks!
It's really helpful to me.
:D

匿名 提到...

還有~補零時為不影響數值的補零,所以E的補玲要補前面,M的補零要補後面

絕色幻翼 提到...

指數(E)不需要補零,因為在設計上所有位元都會用上,指數的十進制0~255正好填滿二進制的00000000~11111111,所以沒有要補零的問題。
小數(M)就確實要補零在後面

匿名 提到...

謝謝您細心的解說��一看就懂了��

匿名 提到...

大大你好
我在維基百科上看到
在解釋 指數偏移值的地方
"以單精度浮點數為例,它的指數域是8個位元,固定偏移值是 127。此為有號數的表示方式,單精度浮點數的指數部分實際取值是從-128到127。"
-128~127的範圍是指甚麼??

絕色幻翼 提到...
作者已經移除這則留言。
匿名 提到...

維基百科裡提到的-128~127指的應該是補數範圍
ieee的指數部分若不考慮特殊保留00000000(0 or denormalized number),11111111(infinity or NaN)
以01111111為0
00000000 = -127
11111111 = 128
範圍為-127~128若考慮保留則是-126~127

參考資料:計算機組織課本、http://steve.hollasch.net/cgindex/coding/ieeefloat.html

絕色幻翼 提到...
作者已經移除這則留言。
匿名 提到...

有用顏色標示,很清楚
發現跟記概課本算法有出入
12.625 => 1100.101 = 0.1100101 × 2^4 <==記概課本
現在才發現計概課本用的不是IEEE-754

Unknown 提到...

實在是太感謝了...知道原理之後自幹PHP成功了

紡客Felix 提到...

謝謝 很詳細

Unknown 提到...

那0.00875怎麼轉成32位元啊?

絕色幻翼 提到...

這看起來好像是作業,過程就不寫了,直接給你答案
32位元有兩種可能
捨去誤差 3C0F5C28
進位誤差 3C0F5C29
64位元就沒這問題
3F81ED851ED851EC
中間比較有問題的可能是進位轉換,網路上再找找看相關內容

PS.因為小數位數很多若有計算錯誤請見諒

暗夜翔羽 提到...
作者已經移除這則留言。
eizokang8787 提到...

我雖然高中讀電機科 但是完全看不懂 好慘...在這邊可以找到基礎的知識嗎?

絕色幻翼 提到...

這裡基礎知識其實沒有很多,可以說大概只有這篇,這篇內的問題大概還可以幫你回答。

匿名 提到...

2018年3月6日的留言有錯誤喔
偏移值照你這樣數真的不會是-128到127,是-127到128

把他模型化縮小就能理解了,不信的自己數一次也會知道
十進位 偏移值
0 -3 (左行-右行永遠等於基準值3
1 -2 (因為同加同減差距不會變
2 -1
3 0 設定3為基準值
4 (4-3=) 1
5 (5-3=) 2
6 (6-3=) 3
當基準值為127時
不難看出是變成
0 -127 (左-右=127)
1 -126
2 -125
... ...
127 0
128 1
129 2
... ...
255 128 (255-128=127,代表左右差距不變

絕色幻翼 提到...

感謝網友的糾錯,2018年3月6日指數範圍確實是寫錯
以下補正
IEEE 754 指數範圍是 -127~128
過去有錯誤的回應自會刪除文章重新補正

絕色幻翼 提到...

回應2018年3月5日

單精度指數有 8 bits 因此指數範圍就是-127~128
因為浮點數表示法就是使用有號數表示,會有個 1 bit 來表示正負號。

而指數有 8 bits 可以表示範圍就是 00000000~11111111 => 0~255,因為指數規定要用基準值(中間值)來記錄,因此 8 bits 的一半就是 01111111 => 127 作為中間值,用這個數值表示指數0,因此排列出來的範圍就如下

二進位 十進位 偏移值

0000 0000 => 0 => -127
...
0111 1100 => 124 => -3
0111 1101 => 125 => -2
0111 1110 => 126 => -1
0111 1111 => 127 => 0 <== 基準值 (中間值)
1000 0000 => 128 => 1
1000 0001 => 129 => 2
1000 0010 => 130 => 3 <== 本文中的例子就是
...
1111 1111 => 255 => 128


因此計算的時候就不要自找麻煩了,單精度的就直接用拿127來計算,處理完偏移再轉為二進制填入適當位置就好。另外wiki裡面說的偏移值就是指文中例子步驟一所計算出來的3,因此有了基準值+偏移值,才會是真正的浮點表示法中呈現出數值。

希望能幫助到你