當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 淺談C語言中的浮點(diǎn)數(shù)
淺談C語言中的浮點(diǎn)數(shù)
時(shí)間:2018-09-25 來源:未知
在C語言中用于存儲浮點(diǎn)數(shù)的有兩種類型,單精度float和雙精度double。我們知道整形數(shù)據(jù)或者字符型數(shù)據(jù)在計(jì)算機(jī)中存儲的是該數(shù)據(jù)所對應(yīng)的補(bǔ)碼。那么浮點(diǎn)數(shù)在計(jì)算機(jī)中如何存儲的呢。無論是單精度還是雙精度在存儲中都分為三個(gè)部分:
1 符號位(Sign) : 0代表正,1代表為負(fù)(即浮點(diǎn)數(shù)沒有無符號的)
2 指數(shù)位(Exponent):用于存儲科學(xué)計(jì)數(shù)法中的指數(shù)數(shù)據(jù),并且采用移位存儲(注意指數(shù)位是指數(shù)移位得到的數(shù)這部分與取值范圍有關(guān))
3 尾數(shù)部分(Mantissa):尾數(shù)部分(與有效位數(shù)有關(guān))
其中float的存儲方式如下圖所示:

而雙精度的存儲方式為:

在分析浮點(diǎn)數(shù)的存儲是有兩個(gè)比較重要的概念需要搞清楚:1.有效位數(shù)、2.取值范圍。
1:有效位數(shù):
單精度數(shù)的尾數(shù)用23位存儲,加上默認(rèn)的小數(shù)點(diǎn)前的1位1,2^(23+1) = 16777216。因?yàn)?10^7 < 16777216 < 10^8,所以說單精度浮點(diǎn)數(shù)的有效位數(shù)是7位。雙精度的尾數(shù)用52位存儲,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以雙精度的有效位數(shù)是16位。
2:取值范圍:
要搞清楚浮點(diǎn)數(shù)的取值范圍必須了解指數(shù)位存儲的是什么,float中指數(shù)位=128+指數(shù),double中指數(shù)位= 1024+指數(shù)。那么float中指數(shù)的范圍是-127-128。Double中指數(shù)的范圍是-1023-1024。那么float的取值范圍是-2^128–2^128 即-3.4E+38–3.4E+38double的取值范圍-1.79E+308-1.79E+308.
下面我們來驗(yàn)證一下:
我們可以將浮點(diǎn)數(shù)寫到計(jì)算機(jī)中,然后去內(nèi)存中看看浮點(diǎn)數(shù)如何存儲。當(dāng)然這種方式不是什么情況都適用,因?yàn)樵谟行┣闆r下我們沒有辦法查看內(nèi)存。那么我們可以反向思維的方式去驗(yàn)證。即將浮點(diǎn)數(shù)按照浮點(diǎn)數(shù)的格式存儲的內(nèi)存中。然后按照浮點(diǎn)數(shù)的方式讀取出來,與之前的浮點(diǎn)數(shù)對比。若相同則可驗(yàn)證。
例:
浮點(diǎn)數(shù)5.5 二進(jìn)制形式為101.1
轉(zhuǎn)化為浮點(diǎn)數(shù)存儲格式為:0 10000001 0110000000000000000
符號 指數(shù)位 尾數(shù)部分
即:0x40b00000
下面是C語言程序:

運(yùn)行結(jié)果為:


