單精度和雙精度浮點(diǎn)數(shù)數(shù)據(jù)類(lèi)型 C、C++中使用到的單精度浮點(diǎn)數(shù)(float)類(lèi)型和雙精度浮點(diǎn)數(shù)(double)類(lèi)型是在IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)(ANSI/IEEE Std 754-1985)中定義的。下面分別從存儲(chǔ)格式、內(nèi)存分布、編碼規(guī)則、取值范圍、有效數(shù)字位數(shù)和測(cè)試示例程序六個(gè)部分來(lái)詳細(xì)說(shuō)明。 存儲(chǔ)格式 浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲(chǔ)時(shí),按照二進(jìn)制科學(xué)計(jì)數(shù)法拆分為三個(gè)部分:符號(hào)位、指數(shù)部分和尾數(shù)部分。如下圖所示: 存儲(chǔ)時(shí),按照最高位存儲(chǔ)符號(hào)位,次高位存儲(chǔ)指數(shù)部分,低位存儲(chǔ)尾數(shù)部分的次序存儲(chǔ)。存儲(chǔ)時(shí)的排列示意圖如下: 內(nèi)存分布 float類(lèi)型和double類(lèi)型的各部分在內(nèi)存中的存儲(chǔ)空間占用如下表: float類(lèi)型的內(nèi)存分布如下圖所示: double類(lèi)型的內(nèi)存分布如下圖所示: 編碼規(guī)則 在實(shí)際存儲(chǔ)時(shí)要對(duì)使用二進(jìn)制科學(xué)計(jì)數(shù)法表示的浮點(diǎn)數(shù)值的符號(hào)位、指數(shù)部分和尾數(shù)部分進(jìn)行編碼處理。一般需要分為規(guī)約形式的浮點(diǎn)數(shù)、非規(guī)約形式的浮點(diǎn)數(shù)和特殊值三種類(lèi)型進(jìn)行編碼。其編碼前后處理如下圖所示: 注:非規(guī)約浮點(diǎn)數(shù)主要用于擴(kuò)大0值附近的浮點(diǎn)數(shù)表示范圍,非規(guī)約浮點(diǎn)數(shù)的絕對(duì)值均小于規(guī)約浮點(diǎn)數(shù)的絕對(duì)值,即前者在實(shí)數(shù)軸上更靠近0,這樣可以提高0附近的計(jì)算精度;一般C、C++中float和double的取值范圍都是按照規(guī)約浮點(diǎn)數(shù)定義的,MSDN文檔和相關(guān)教材也是這么說(shuō)的,但部分編譯器按照ANSI/IEEE Std 754-1985標(biāo)準(zhǔn)實(shí)現(xiàn)了非規(guī)約浮點(diǎn)數(shù),本文末尾留有程序示例說(shuō)明。 符號(hào)位:0表示正數(shù),1表示負(fù)數(shù); 指數(shù)部分: float的偏移量為2^8 - 1,double的偏移量為2^11 - 1; 尾數(shù)部分:實(shí)際尾數(shù)部分中的小數(shù)點(diǎn)后的數(shù)值,規(guī)約浮點(diǎn)數(shù)使用標(biāo)準(zhǔn)的二進(jìn)制科學(xué)計(jì)數(shù)法表示,其尾數(shù)范圍在 [1,2),非規(guī)約浮點(diǎn)數(shù)的尾數(shù)部分范圍在(0,1)。 下面以規(guī)約浮點(diǎn)數(shù)8.5為例,來(lái)說(shuō)明浮點(diǎn)數(shù)的編碼過(guò)程: 取值范圍
單精度浮點(diǎn)數(shù)的各種極限值和取值范圍如下圖所示:
雙精度浮點(diǎn)數(shù)的各種極限值和取值范圍如下圖所示: 有效數(shù)字位數(shù) 因?yàn)橛行?shù)字位數(shù)只與位數(shù)有關(guān),所以只要計(jì)算出十進(jìn)制表示的尾數(shù)中有效數(shù)字位數(shù)就能知道該浮點(diǎn)數(shù)的有效數(shù)字位數(shù)。 注:在接近0、正無(wú)窮、負(fù)無(wú)窮等極限值時(shí),有效數(shù)字不能保證為上述精度。 測(cè)試示例程序 浮點(diǎn)數(shù)據(jù)表示測(cè)試可以通過(guò)IEEE-754 Analysis網(wǎng)頁(yè)在線測(cè)試,也可以通過(guò)自己編寫(xiě)的C\C++程序來(lái)測(cè)試。 一下是在Visual Studio 2010下編寫(xiě)的C++測(cè)試代碼: 輸出結(jié)果如下: 從上述結(jié)果可以看出編譯器已經(jīng)實(shí)現(xiàn)了ANSI/IEEE Std 754-1985標(biāo)準(zhǔn)中定義的float型和double型浮點(diǎn)數(shù),而頭文件定義中并未更新或修改,MSDN文檔亦是如此。如下圖: |
|