天天看點

《C語言程式設計魔法書:基于C11标準》——2.3 浮點數在計算機中的表示

本節書摘來自華章計算機《c語言程式設計魔法書:基于c11标準》一書中的第2章,第2.3節,作者 陳轶,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

目前主流處理器一般都能支援32位的單精度浮點數與64位的雙精度浮點數的表示和計算,并且能遵循ieee754-1985工業标準。現在此标準最新的版本是2008,其中增加了對16位半精度浮點數以及128位四精度浮點數的描述。c語言标準引入了一個浮點模型,可用來表達任意精度的浮點數,盡管目前主流c語言編譯器尚未很好地支援半精度浮點數與四精度浮點數的表示和計算。關于c語言标準對浮點數的描述,我們稍後将在5.2節做更詳細的介紹。

為了更好地了解ieee754-1985中規格化(normalized)浮點數的表示法,我們先來介紹一下浮點數用一般二進制數的表示方法。一個浮點數包含了整數部分和尾數(即小數)部分。整數部分的表示與我們之前所讨論過的一樣,第n位就表示2n,n從0開始計。而尾數部分則是第m位表示2-m,m從1開始計。對于一個0101.1010的二進制浮點數對應十進制數的計算如圖2-7所示:

《C語言程式設計魔法書:基于C11标準》——2.3 浮點數在計算機中的表示

圖2-7中,整i位即表示第i位整數;尾i位即表示第i位尾數。其中,第3位整數為最高位整數;第4位尾數表示最低位尾數。對二進制浮點數的表示有了概念之後,我們就可以看ieee754-1985标準中對規格化浮點數的描述了。ieee754-1985對32位單精度與64位雙精度兩種精度的浮點數進行描述。32位單精度浮點可表示的數值範圍在±1.18×10-38到±3.4×1038,大約含有7位十進制有效數;64位雙精度浮點可表示的數值範圍在±2.23×10-308到±1.80×10308,大約含有15位十進制有效數。我們看到ieee定義的浮點數的絕對值範圍可以是一個遠大于1的數,也可以是一個大于零但遠小于1的數,即它的小數精度是可浮動的,是以稱之為浮點數。如果說是定點數的話,它也可表示一個小數,但是其整數位數與小數位數的精度都是固定的。比如一個16.16的定點數表示整數部分采用16個比特,尾數部分也采用16個比特。而對于一個32位浮點數來說,既能使用16.16的格式,也能使用30.2的格式(即30個比特表示整數,2個比特表示尾數)或其他各種形式。而ieee754-1985對規格化單精度浮點數的格式如下定義:

1)1位符号位,一般是最高位(31位),表示正負号。0表示正數,1表示負數。

2)8位指數位,又稱階碼,位于23到30位。(階碼的計算後面會詳細介紹。)

3)23位尾數,位于0到22位。

我們下面舉一個實際的例子來詳細說明一個十進制小數5.625如何表示成ieee754标準的規格化32位單精度浮點數。

1)5.625是一個正數,是以符号位為0,即第31位為0。

2)我們将5.625依照圖2-7那樣寫成一般小數的表示法——0101.101。

3)我們将此二進制浮點數用科學計數法來表示,使得二進制整數位為最高位的1。這裡最高位為1的比特是從左往右數是第二個比特,是以将小數點就放到該比特的後面,得到1.01101×22。二進制數的科學記數法,底數的值顯然就是2。

4)此時,我們能看到尾數部分是小數點後面的那串二進制數,即01101,而指數為2。現在我們來求階碼。階碼用的是中經指數偏差(exponent bias)處理後的指數,即用上述得到的指數加上偏內插補點所求得的和。ieee754在單精度浮點中規定,偏內插補點為127。是以本例中,階碼部分為2+127=129,用二進制數表示就是1000 0001。

5)尾數部分從大到小照抄,低位的用0填充即可,是以這裡的尾數部分二進制數為:011 0100 0000 0000 0000 0000。

6)将整個處理完的二進制數串起來獲得:0(符号位)1000 0001(階碼)011 0100 0000 0000 0000 0000(尾數),用十六進制數表達就是:40b4 0000。

十進制小數轉64位雙精度浮點數的方法與上述雷同,隻不過階碼用11位比特來表示,尾數則用52位比特表示,而偏內插補點則規定為1023。

繼續閱讀