了解:
目前c/c++編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把乙個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
符號位階碼尾數長度
float 1 8 23 32
double 1 11 52 64
例1:
0.5的二進位制形式是0.1
它用浮點數的形式寫出來是如下格式
0 01111110 00000000000000000000000
符號位 階碼 小數字
正數符號位為0,負數符號位為1
階碼是以2為底的指數
小數字表示小數點後面的數字
下面我們來分析一下0.5是如何寫成0 01111110 00000000000000000000000
首先0.5是正數所以符號位為0
再來看階碼部分,0.5的二進位制數是0.1,而0.1是1.0*2^(-1),所以我們總結出來:
要把二進位制數變成(1.f)*2^(exponent)的形式,其中exponent是指數
而由於階碼有正負之分所以階碼=127+exponent;
即階碼=127+(-1)=126 即 01111110
餘下的小數字為二進位制小數點後面的數字,即00000000000000000000000
由以上分析得0.5的浮點數儲存形式為0 01111110 00000000000000000000000
注:如果只有小數部分,那麼需要右移小數點. 比如右移3位才能放到第乙個1的後面, 階碼就是127-3=124.
例2:
-12.5轉為單精度二進位制表示
12.5:
1. 整數部分12,二進位制為1100; 小數部分0.5, 二進位制是.1,先把他們連起來,從第乙個1數起取24位(後面補0):
1100.10000000000000000000
這部分是有效數字。(把小數點前後兩部分連起來再取掉頭前的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 01001000 00000000 00000000
就是十六進製制的 c1480000.
浮點數的二進位制表示
前幾天,我在讀一本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在記憶體中明明是同乙個數,為什麼浮...