例四 (20.59375)10 =(10100.10011 )2
首先分別將整數和分數部分轉換成二進位制數:
20.59375=10100 .10011
然後移動小數點,使其在第1,2位之間
10100 .10011 =1 .010010011 ×2^4 即e=4
於是得到:
s=0, e=4+127=131, m=010010011
最後得到32位浮點數的二進位制儲存格式為:
0100 0001 1
010 0100 1100 0000 0000 0000
=(41a4c000)16
例五:
-12.5
轉為單精度二進位制表示
12.5:
1. 整數部分12,二進位制為1100; 小數部分0.5, 二進位制是.1,先把他們連起來,從第乙個1數起取24位(後面補0):
1100.1
0000000000000000000
這部分是有效數字。(把小數點前後兩部分連起來再取掉頭前的1,就是尾數)
2. 把小數點移到第乙個1的後面,需要左移3位(1.10010000000000000000000 *2^3), 加上偏移量127:127+3=130,二進位制是10000010 ,這是階碼。
3. -12.5是負數,所以符號位是1。把符號位,階碼和尾數連起來。注意,尾數的第一位總是1,所以規定不存這一位的1,只取後23位:
1 10000010 10010000000000000000000
把這32位按8位一節整理一下,得:
11000001 0
1001000 00000000 00000000
就是十六進製制的 c1480000.
例六:
2.025675
1. 整數部分2,二進位制為10; 小數部分0.025675, 二進位制是.0000011010010010101001,先把他們連起來,從第乙個1數起取24位(後面補0):
10 .0000011010010010101001
這部分是有效數字。把小數點前後兩部分連起來再取掉頭前的1,就是尾數: 00000011010010010101001
2. 把小數點移到第乙個1的後面,左移了1位, 加上偏移量127:127+1=128,二進位制是10000000,這是階碼。
3. 2.025675是正數,所以符號位是0。把符號位,階碼和尾數連起來:
0 10000000 00000011010010010101001
把這32位按8位一節整理一下,得:
01000000 0
0000001 10100100 10101001
就是十六進製制的 4001a4a9.
例七:
(逆向求十進位制整數)乙個浮點二進位制數手工轉換成十進位制數的例子:
假設浮點二進位制數是 1011 1101 0100 0000 0000 0000 0000 0000
按1,8,23位分成三段:
10111101010000000000000000000000
最後一段是尾數。前面加上"1.", 就是 1.10000000000000000000000
下面確定小數點位置。由e = e-bias,
階碼e是01111010,加上00000101才是01111111 (127),
所以他減去127的偏移量得e=-5。(或者化成十進位制得122,122-127=-5)。
因此尾數1.10(後面的0不寫了)是小數點右移5位的結果。要復原它就要左移5位小數點,得0.0000110, 即十進位制的0.046875 。
最後是符號:1代表負數,所以最後的結果是-0.046875。
注意:其他機器的浮點數表示方法可能與此不同. 不能任意移植 。
再看一例(類似例七):
比如:53004d3e
二進位制表示為:
01010011000000000100110100111110
按照1個符號 8個指數 23個小數字劃分
0 10100110 00000000100110100111110
正確的結果轉出來應該是551051722752.0
該怎麼算?
好,我們根據ieee的浮點數表示規則劃分,得到這個浮點數的小數字是:
00000000100110100111110
那麼它的二進位制表示就應該是:
1.000000001001101001111102
× 239
這是怎麼來的呢? 別急,聽我慢慢道來。
標準化公式中的m要求在規格化的情況下,取值範圍
1ε)
正因為如此,我們才需要對原始的整數二進位制表示做偏移,偏移多少呢?偏移
2e 。
這個「e」怎麼算?上面的
239 怎麼得來的呢?
浮點數表示中的8位指數為就是告訴這個的。我們知道:
e = e-bias
那麼根據指數字:
101001102
=>
16610
即e=166,由此算出e=e-bias=166-127=39,就是說將整數二進位制表示轉為標準的浮點數二進位制表示的時候需要將小數點左移39位,好,我們現在把它還原得到整數的二進位制表示:
1 00000000100110100111110 0000000000000000 1
│←───── 23─────→│←─── 16───→│
23+16=39,後面接著就是小數點了。
拿出計算器,輸入二進位制數1000000001001101001111100000000000000000
轉為十進位制數,不正是:551051722752麼!
通過這例六例七,介紹了將整數二進位制表示轉浮點數二進位制表示的逆過程,還是希望大家不但能掌握轉化的方法,更要理解轉化的基本原理。
浮點數的二進位制表示
前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶體中明明是同乙個數,為什麼浮點數...
浮點數的二進位制表示
日期 2010年6月 6日 1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶...
浮點數的二進位制表示
1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶體中明明是同乙個數,為什麼浮...