浮點型數據在內存中的存儲

根據國際標準IEEE(電氣和電子工程協會) 754,任意一個二進制浮點數可以表示成下面的形式:
浮點數 = (-1)^S*M*2^E

  • 符號位(Sign) : 0代表正,1代表爲負
  • 階碼,也稱指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移碼存儲。
  • 尾數部分(Mantissa),隱藏了個位和小數點的有效數字。大於等於1,小於2,一般化爲規範小數的形式,這樣其最高位(個位)必爲1, 因此個位和小數點就不存儲,省略作爲隱藏位,從而使浮點數尾數不變,但是精度進一步增加
十進制的5.0,寫成二進制是 101.0 ,相當於 1.01×2^2 。那麼,按照上面的格式,可以得出s=0,M=1.01,E=2。 
十進制的-5.0,寫成二進制是`-101.0`,相當於`-1.01×2^2`。那麼,s=1,M=1.01,E=2。

IEEE 754規定:

對於單精度浮點數,最高的1位是符號位s,接着的8位是指數E,剩下的23位爲有效數字M


雙精度浮點型:剩下的52位作爲尾數


對E和M的進一步說明:

1. 1≤M<2,也就是說,M可以寫成1.xxxxxx的形式,其中xxxxxx表示小數部分。

IEEE 754規定,在計算機內部保存M時,默認這個數的第一位總是1,因此可以被捨去,只保存後面的xxxxxx部分。

比如保存1.01的時候,只保存01,等到讀取的時候,再把第一位的1加上去。

這樣做的目的,是節省1位有效數字。以32位浮點數爲例,留給M只有23位,將第一位的1捨去以後,等於可以保存24位有效數字。

2. E爲一個無符號整數(unsigned int)

這意味着,如果E爲8位,它的取值範圍爲0~255;如果E爲11位,它的取值範圍爲0~2047。但是,我們知道,科學計數法中的E是可以出現負數的,所以IEEE 754規定,存入內存時E的真實值必須再加上一個中間數,對於8位的E,這個中間數是127;對於11位的E,這個中間數是1023。
比如,2^10的E是10,所以保存成32位浮點數時,必須保存成10+127=137,即10001001。

指數E還可以再分成三種情況:

1>E不全爲0或不全

這時,浮點數就採用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1。
比如:
0.5(1/2)的二進制形式爲0.1,由於規定正數部分必須爲1,即將小數點右移1位,則爲1.0*2^(-1),其階碼爲-1+127=126,表示爲01111110,

而尾數1.0去掉整數部分爲0,補齊0到23位00000000000000000000000,則其二進制表示形式爲:

0 01111110 00000000000000000000000

2>E全爲0

這時,浮點數的指數E等於1-127(或者1-1023)即爲真實值,有效數字M不再加上第一位的1,而是還原爲0.xxxxxx的小數。這樣做是爲了表示±0,以及接近於0的很小的數字。

3>E全爲1

這時,如果有效數字M全爲0,表示±無窮大(正負取決於符號位s);

來看個例子:

int main()
{
	int  num1 = 9;
	float *a = (float *)&num1;
	printf("%d\n", num1);
	printf("%f\n", *a);
	*a = 9.0;
	printf("%d\n", num1);
	printf("%f\n", *a);

	return 0;
}


爲什麼會出現這樣的情況呢?

首先,將0x00000009拆分,得到第一位符號位s=0,後面8位的指數E=00000000,最後23位的有效數字M=000 0000 0000 0000 0000 1001。
//9 -> 0000 0000 0000 0000 0000 0000 0000 1001
由於指數E全爲0,所以符合上一節的第二種情況。因此,浮點數V就寫成:V=(-1)^0×0.00000000000000000001001×2^(-126)=1.001×2^(-146)
顯然,V是一個很小的接近於0的正數,所以用十進制小數表示就是0.000000。

其次,浮點數9.0等於二進制的1001.0,即1.001×2^3。
//9.0 -> 1001.0 ->(-1)^0*1.001*2^3 -> s=0, M=1.001,E=3+127=130
那麼,第一位的符號位s=0,有效數字M等於001後面再加20個0,湊滿23位,指數E等於3+127=130,即10000010。
所以,寫成二進制形式,應該是s+E+M,即
0 10000010 001 0000 0000 0000 0000 0000
這個32位的二進制數,還原成十進制,正是1091567616。

發佈了102 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章