電氣和電子工程師協會(ieee)定義了幾種儲存浮點數的標準。最常用的就是單精度和雙精度。
單精度資料格式採用總共32位(4位元組)來儲存乙個浮點表示法的實數。符號占用1位,指數占用8位(採用餘127碼),尾數使用23位(無符號數)。
雙精度資料格式採用總共64位(8位元組)來儲存乙個浮點表示法的實數。符號占用1位,指數占用11位(採用餘1023碼),尾數使用52位(無符號數)。
下面以單精度為例討論浮點數的表示方法:
符號位s:占用1位,0表示正,1表示負;
指數字e:指數為占用8位,採用餘127碼系統,可表示的值為0~255,其中,0和255(即8位全部為1)是兩個特殊值,後面會詳細討論。姑且認為指數字可表示的值為1~254,對應的指數範圍是-126~127.
尾數字m:尾數字占用23位,表示小數字,範圍從0~2^23-1.
乙個實數儲存為浮點數格式的步驟是:
在s中儲存符號(0或1)
將數字轉換為二進位制
規範化找到e,m的值
連線s,e,m
例子:寫出十進位制-5.75的127餘碼表示。
符號位為1,s=1;
5.75
=101.11
=1.0111∗2
2
e=2+127=129,m=0111
因此,5.75的單精度表示方法為:
1 10000001 10110000000000000000000
類似的,對於-161.875有:
161.875=10100001.111=1.0100001111*2^7
s=1;
e=7+127=134=10000110;
m=0100001111;
//單精度表示為:
1 10000110 0100001111;
指數e=0時,有效數最高位為0,而不再是1,只有當
0<
e<28
−1時,有效數最高位為1。當指數字為0,且位數字為0時,表示+-0。指數e
=28−
1 且尾數部分為0,則表示正無窮大或者負無窮大,視符號位而定。指數e
=28−
1 且尾數部分不為0,則表示這不是乙個數。
由上面的規則可以推導出32位浮點數的表示範圍。
正最大值:se
m011111110
11111111111111111111111 n
max=
+(1−
2−24)
×2+128
正最小值:se
m000000001
00000000000000000000001 n
max=
+(1−
2−1)
×2−127
負最大值: nm
ax=−
(1−2
−24)×
2+128
負最小值: nm
ax=−
(1−2
−1)×
2−127
浮點數在記憶體中的表示
c語言的float對應單精度浮點數,由1位符號 8位指數 23位尾數組成 尾數部分是二進位制小數,那23位是小數點後面的部分,小數點前面還有個隱含的1並不儲存 二進位制小數和十進位制小數道理一樣,只是基數變成2 比如十進位制的3.14 3x10 0 1x10 1 4x10 2 3 1 10 4 10...
浮點數在記憶體中的表示
printf f 5 printf d 5.01 輸出結果為 0.000000,乙個大數的原因。原因 int型讀成了double型 printf函式自動將float型轉化為double 就發生記憶體訪問越界,讀出非常小的數 float型讀成int型,就變成非常大的數了。2進製 10進製 對於大小為3...
浮點數在記憶體中的表示
浮點數在記憶體中的表示 c語言 浮點數在記憶體中的表示 單精度浮點數 1位符號位 8位階碼位 23位尾數 雙精度浮點數 1位符號位 11位階碼位 52位尾數 實數在記憶體中以規範化的浮點數存放,包括數符 階碼 尾數。數的精度取決於尾數的位數。比如32位機上float型為23位 double型為52位...