浮點數的表示

2021-06-13 01:27:21 字數 2592 閱讀 6857

在定點數表示中存在的乙個問題是,難以表示數值很大的資料和數值很小的資料。例如,電子的質量(9×10-28克)和太陽的質量(2×1033克)相差甚遠,在定點計算機中無法直接表示,因為小數點只能固定在某乙個位置上,從而限制了資料的表示範圍。

為了表示更大範圍的資料,數學上通常採用科學計數法,把資料表示成乙個小數乘以乙個以10為底的指數。

例如,在計算機中,電子的質量和太陽的質量可以分別取不同的比例因子,以使其數值部分的絕對值小於1,即:

9×10-28 = 0.9×10-27

2×1033 = 0.2×1034

這裡的比例因子10-27和1034要分別存放在機器的某個單元中,以便以後對計算結果按此比例增大。顯然,這要占用一定的儲存空間和運算時間。

浮點表示法就是把乙個數的有效數字和數的範圍在計算機中分別予以表示。這種把數的範圍和精度分別表示的方法,相當於數的小數點位置隨比例因子的不同而在一定範圍內自由浮動,改變指數部分的數值相當於改變小數點的位置。在這種表示法中,小數點的位置是可以浮動的,因此稱為浮點表示法。

浮點數的一般表示形式為:

乙個十進位制數n可以寫成:n = 10e×m

乙個二進位制數n可以寫成:n = 2e×m

其中,m稱為浮點數的尾數,是乙個純小數;e是比例因子的指數,稱為浮點數的指數,是乙個整數。在計算機中表示乙個浮點數時,一是要給出尾數m,用小數形式表示;二是要給出指數e,用整數形式表示,常稱為階碼。尾數部分給出有效數字的位數,因而決定了浮點數的表示精度;階碼部分指明了小數點在資料中的位置,因而決定了浮點數的表示範圍。浮點數也是有符號數,帶符號的浮點數的表示如圖2-2所示。

其中,s為尾數的符號位,放在最高一位;e為階碼,緊跟在符號位之後,佔m位;m為尾數,放在低位部分,佔n位。

1. 規格化浮點數

若不對浮點數的表示做出明確規定,同乙個浮點數的表示就不是惟一的。例如:

(1.75)10 = (1.11)2        = 1.11×20

= 0.111×21

= 0.0111×22

= 0.00111×23

為了提高資料的表示精度,需要充分利用尾數的有效位數。當尾數的值不為0時,尾數域的最高有效位應為1,否則就要用修改階碼同時左右移動小數點的辦法,使其變成符合這一要求的表示形式,這稱為浮點數的規格化。

2. ieee-754標準浮點格式

在ieee-754標準出現之前,業界並沒有乙個統一的浮點數標準,相反,很多計算機製造商都在設計自己的浮點數規則以及運算細節。

為了便於軟體的移植,浮點數的表示格式應該有乙個統一的標準。2023年,ieee(institute of electrical and electronics engineers,美國電氣和電子工程師協會)提出了ieee-754標準,並以此作為浮點數表示格式的統一標準。目前,幾乎所有的計算機都支援該標準,從而大大改善了科學應用程式的可移植性。

ieee標準從邏輯上採用乙個三元組來表示乙個數n,它規定基數為2,符號位s用0和1分別表示正和負,尾數m用原碼表示,階碼e用移碼表示。根據浮點數的規格化方法,尾數域的最高有效位總是1,由此,該標準約定這一位不予儲存,而是認為隱藏在小數點的左邊,因此,尾數域所表示的值是1.m(實際儲存的是m),這樣可使尾數的表示範圍比實際儲存多一位。為了表示指數的正負,階碼e通常採用移碼方式來表示,將資料的指數e 加上乙個固定的偏移量後作為該數的階碼,這樣做既可避免出現正負指數,又可保持資料的原有大小順序,便於進行比較操作。

目前,大多數高階語言都按照ieee-754標準來規定浮點數的儲存格式。ieee-754標準規定,單精度浮點數用4位元組(即32位)儲存,雙精度浮點數用8位元組(即64位)儲存,如圖2-3所示:

單精度格式(32位):符號位(s)1位;階碼(e)8位,階碼的偏移量為127(7fh);尾數(m)23位,用小數表示,小數點放在尾數域的最前面;

雙精度格式(64位):符號位(s)1位;階碼(e)11位,階碼的偏移量為1023(3ffh);尾數(m)52位,用小數表示,小數點放在尾數域的最前面。

在ieee-754標準中,乙個規格化的32位浮點數x的真值可表示為:

x = (-1)s×(1.m)×2e-127       e = e-127          (式2-9)

在ieee-754標準中,乙個規格化的64位浮點數x的真值可表示為:

x = (-1)s×(1.m)×2e-1023       e = e-1023         (式2-10)

由於雙精度格式的原理與單精度格式相同,僅僅是表示的位數有所增加,所以,下面主要介紹單精度格式(32位)浮點數的表示方法。

當乙個浮點數的尾數為 0,不論其階碼為何值,或者當階碼的值遇到比它所能表示的最小值還小時,不管其尾數為何值,計算機都把該浮點數看成零值,稱為機器零。

當階碼e為全0且尾數m也為全0時,表示的真值x為零,結合符號位s為0或1,有正零和負零之分。當階碼e為全1且尾數m也為全0時,表示的真值x為無窮大(∞),結合符號位s為0或1,有+∞和-∞之分。這樣,在32位浮點數表示中,要除去e用全0和全1(255)表示零和無窮大的特殊情況,因此,階碼e的取值範圍變為1~254,指數的偏移量不選128(10000000b),而選127(01111111b)。對於32位規格化浮點數,真正的指數值e為-126~+127,因此,數的絕對值的範圍是2-126~2127≈10-38~1038。

浮點數的表示

日期 2010年6月 6日 1.前幾天,我在讀一本c語言教材,有一道例題 includevoid main void 執行結果如下 num的值為 9 pfloat的值為 0.000000 num的值為 1091567616 pfloat的值為 9.000000 我很驚訝,num和 pfloat在記憶...

浮點數的表示

浮點數,是指小數點在資料中的位置可以左右移動的資料。它通常被表示成 n m re 這裡的m mantissa 被稱為浮點數的尾數,r radix 被稱為階碼的基數,e exponent 被稱為階的階碼。計算機中一般規定r為2 8或16 是乙個確定的常數,不需要在浮點數中明確表示出來。因此,要表示浮點...

浮點數的表示

浮點數,是指小數點在資料中的位置可以左右移動的資料。它通常被表示成 n m re 這裡的m mantissa 被稱為浮點數的尾數,r radix 被稱為階碼的基數,e exponent 被稱為階的階碼。計算機中一般規定r為2 8或16 是乙個確定的常數,不需要在浮點數中明確表示出來。因此,要表示浮點...