1. 程式人生 > >浮點數在記憶體中的儲存

浮點數在記憶體中的儲存

浮點數在記憶體中的儲存

浮點數家族:float,double,long double型別.


同一個數為啥差別這麼大?想知道為神馬?請讀下文。

詳細解讀:

1.根據國際標準IEEE(電氣和電子工程協會)754,任意一個二進位制浮點數V可以表示成下面的形式: @(-1)^S*M*2^E @(-1)^s表示符號位,當s=0,v為正數;當s=1;v為負數。 @M表示有效數字,大於等於1,小於2. @2^E表示指數位 舉列來說: 十進位制5.0,寫成二進位制101.0,相當於1.01*2^2.
那麼,按照上邊v的格式,可以得出s=0,M=1.01,E=2. 十進位制-5.0,寫成二進位制-101.0,相當於-1.01*2^2. 那麼,按照上邊v的格式,可以得出s=0,M=1.01,E=2. 2.IEEE754規定: 對於32 位的浮點數,最高1位是符號位s,接著的8位是指數E,剩下23位為有效數字M. 對於64位的浮點數,最高1位是符號位s,接著的11位是指數E,剩下52位為有效數字M.
3.IEEE754對於有效數字M和指數E的特別規定. IEEE754規定,在計算機內部儲存M時預設這個數的第一位總是1,因此可以被捨去,,只保留後面的xxxxx部分.比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節省一位有效數字,以32位浮點數為例,留給M只有23位,將第一位的捨去以後,等於可以儲存24位有效數字。
首先,E為一個無符號整數。E為8位,它的取值範圍0~255;E為11位,它的取值範圍0~2047. 但是我們知道科學計數法是可以出現負數的,所以IEEE754規定,存入記憶體中E的真實值必須再加上一個中間數,對於8位的E,這個中間數是127,對於11位的E,這個中間數是1023. 比如:,2^10的E是10,所以儲存成32位浮點數時,必須儲存成10+127=137,即10001001.

E不為全0,不為全1 此時,浮點數就採用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1.
比如: 0.5(1/2)的二進位制形式為0.1,由於規定正數部分必須為1,即小數點右移一位,則為1.0*2(-1)其階碼為-1+127=126表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位00000000000000000000000,則二進位制表示形式為: 0 01111110 00000000000000000000000. E為全0 這時,浮點數的指數E等於1-127(或者1-1023)即為真實值,有效數字M不再加上第一位的1,而是還原為0.xxxxxxx的小數,這樣做是為了表示±0,以及接近於0的很小的數字。 E為全1 這時,如果有效數字M全為0,表示±無窮大(正負取決於符號位s)

懂了吧!!!