浮點數在內存中存儲時,就要提到一個關鍵詞“科學計數法”,float和double的存儲方式是一樣的,下面用float做以解釋;任意一個二進制浮點數V可以表示成下面形式:
V=(-1)^S*M*2^E
(1)(-1)^S表示符號位,當S = 0,V為正;當S = 1,V為負;
(2)M為有效數字,因為M是二進制,大于等于1,小于2。
(3)2^E表示指數位
舉例來說:
十進制的5.0,寫成二進制是101.0,相當于1.01*2^2。按上面科學計數法的格式,可以得出S = 0,M = 1.01,E = 2。如果是-5.0,S= 1,M = 1.01. E = 2。
對于單精度浮點數來講,占32位,每個bit位存入相應的二進制數,具體看下面:
下面對S,M,E如何存入內存做以解釋:
S(符號位):
(-1)^S表示符號位,當S = 0,V為正;當S = 1,V為負;
M(尾數):
1<=M<2;
M要寫成1.xxxxxx的形式,xxxxxx表示小數部分,在把M存入計算機時,M的第一位總是1,因此,可以把第一位1在每次存入的時候去掉,只存入小數部分,在讀取的時候再在前面加上1,這樣就可以用23位全部來存小數部分,等于可以保留24位有效數字。
E(階碼):
E為一個無符號整形,E為8位時,它的取值范圍為0~255;若為double型,E為11,它的取值范圍是0~2047。
但是,在科學計數法中,E是可以表示負數的,所以規定,存入內存時E的真實值必須在加上一個中間值,對于8位的E,這個中間值位127;對于11位的E,這個中間值位1023。在讀取的時候在減去127。例如,2^10的E是10保存成單精度浮點型,存入內存時,必須保存成10+127=137,即10001001,在讀取時在減去127。
所以E的真實值的范圍就變成了127~128.
下面在解釋E的3中特殊情況:
(1)E不全位0或不全為1
讀取時指數E的計算值減去127,得到真實值,再將有效數字M前加上1.
比如:
0.5的二進制形式為0.1,由于規定M必須大于1小于2,則0.1的小數點右移1位,則為1.0*2^(-1),M1.0去掉正數部分的1其余有效位都為0;E存入時為-1+127 = 126,表示為二進制為01111110,,則其二進制為
0 01111110 00000000000000000000000
(2)E為全0
這時E為最小,浮點數的指數E等于0-127+1即為真實值,有效數字M不再加上第一位的1,
即讀取為0.xxxxxx的小數。這個數表示正負0,是一個接近0的很小的值。
(3)E位全1
這時,如果有效數字M全位0,表示正負無窮大(正負取決于符號S)。
對于占64位的double,S占1位,E占11位,M占52位
新聞熱點
疑難解答