淺(qian)談(tan)C語言中的浮點數(shu)
							時間:2018-09-25      來源:未(wei)知(zhi) 
							在(zai)C語言中用于(yu)存(cun)儲浮點數(shu)的有兩種類型,單(dan)精度float和雙(shuang)精度double。我(wo)們知道整形數(shu)據(ju)或者字(zi)符型數(shu)據(ju)在(zai)計算機中存(cun)儲的是該數(shu)據(ju)所對應的補(bu)碼(ma)。那么浮點數(shu)在(zai)計算機中如何存(cun)儲的呢。無論是單(dan)精度還是雙(shuang)精度在(zai)存(cun)儲中都分為三個部分:
1 符號位(Sign) : 0代表(biao)正,1代表(biao)為負(即浮點數沒(mei)有無(wu)符號的)
2 指(zhi)數位(wei)(wei)(Exponent):用(yong)(yong)于存(cun)儲科學計數法中的指(zhi)數數據(ju),并且采用(yong)(yong)移位(wei)(wei)存(cun)儲(注(zhu)意指(zhi)數位(wei)(wei)是指(zhi)數移位(wei)(wei)得(de)到的數這部分與取值范圍(wei)有關)
3 尾數部分(Mantissa):尾數部分(與有效位數有關)
其中(zhong)float的存儲方(fang)式如下圖所示:
 
而雙精度(du)的存儲方式為:
  
在(zai)分析浮點數的存儲是有兩個比較重(zhong)要的概念需要搞清楚:1.有效位數、2.取值范圍。
1:有效位數:
單精(jing)(jing)(jing)度數(shu)的尾數(shu)用(yong)23位(wei)(wei)(wei)存儲(chu),加上默認的小數(shu)點前的1位(wei)(wei)(wei)1,2^(23+1) = 16777216。因為 10^7 < 16777216 < 10^8,所(suo)以(yi)說單精(jing)(jing)(jing)度浮點數(shu)的有效位(wei)(wei)(wei)數(shu)是7位(wei)(wei)(wei)。雙精(jing)(jing)(jing)度的尾數(shu)用(yong)52位(wei)(wei)(wei)存儲(chu),2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所(suo)以(yi)雙精(jing)(jing)(jing)度的有效位(wei)(wei)(wei)數(shu)是16位(wei)(wei)(wei)。
2:取值范圍:
要搞清(qing)楚浮點(dian)數(shu)(shu)(shu)的(de)取(qu)值(zhi)范(fan)圍(wei)必須了(le)解指(zhi)數(shu)(shu)(shu)位(wei)存(cun)儲的(de)是(shi)什(shen)么(me),float中(zhong)(zhong)指(zhi)數(shu)(shu)(shu)位(wei)=128+指(zhi)數(shu)(shu)(shu),double中(zhong)(zhong)指(zhi)數(shu)(shu)(shu)位(wei)= 1024+指(zhi)數(shu)(shu)(shu)。那么(me)float中(zhong)(zhong)指(zhi)數(shu)(shu)(shu)的(de)范(fan)圍(wei)是(shi)-127-128。Double中(zhong)(zhong)指(zhi)數(shu)(shu)(shu)的(de)范(fan)圍(wei)是(shi)-1023-1024。那么(me)float的(de)取(qu)值(zhi)范(fan)圍(wei)是(shi)-2^128–2^128 即(ji)-3.4E+38–3.4E+38double的(de)取(qu)值(zhi)范(fan)圍(wei)-1.79E+308-1.79E+308.
下(xia)(xia)面我們(men)來(lai)驗證一(yi)下(xia)(xia):
我(wo)們可以(yi)(yi)將(jiang)(jiang)浮(fu)(fu)點數(shu)(shu)寫到計算機(ji)中,然后(hou)去(qu)內(nei)存中看看浮(fu)(fu)點數(shu)(shu)如(ru)何存儲。當然這種方式不(bu)是什(shen)么(me)情況(kuang)都適用(yong),因為在有些(xie)情況(kuang)下我(wo)們沒有辦(ban)法查看內(nei)存。那(nei)么(me)我(wo)們可以(yi)(yi)反向(xiang)思維的(de)(de)(de)方式去(qu)驗證。即將(jiang)(jiang)浮(fu)(fu)點數(shu)(shu)按照浮(fu)(fu)點數(shu)(shu)的(de)(de)(de)格式存儲的(de)(de)(de)內(nei)存中。然后(hou)按照浮(fu)(fu)點數(shu)(shu)的(de)(de)(de)方式讀(du)取出來(lai),與之前的(de)(de)(de)浮(fu)(fu)點數(shu)(shu)對比。若相同則可驗證。
例:
浮點數5.5 二進制形(xing)式為(wei)101.1
轉化為浮點數存(cun)儲格式為:0 10000001 0110000000000000000
符號 指數位 尾(wei)數部分
即:0x40b00000
下(xia)面是C語(yu)言程(cheng)序:
  
運行結果為:
 

