為什麼浮點數不能精確表示?

2021-07-07 08:15:50 字數 2268 閱讀 5699

我們知道,在編寫程式時,兩個浮點數(floatdouble)不能直接進行大小比較。

當然,我們也都知道,不能直接進行大小比較的原因是因為浮點數在計算機內部不能精確的表示。可是,為什麼在計算機內部浮點數不能夠精確地表示呢?

這還得從ieee 754標準說起。

根據ieee 754標準,浮點數在計算機內部儲存時主要分為符號位(sign)、指數(exponent)部分、尾數(fraction)部分:

那麼,這個數就是:(−

1)si

gn×2

expo

nent

×fra

ctio

n2例如十進位制的0.5可以表示成(−

1)0×

2−1×

1.0 。

以32位的單精度浮點數(常見的float)為例,它的符號位佔一位(bit),指數部分佔8位,尾數部分佔23位。

現在我們需要儲存十進位制的0.1這個小數,首先需要把0.1轉換成二進位制數。然而,我們會發現,十進位制的0.1轉換成二進位制是乙個無限迴圈小數:0.0001100110011001100…

可是,尾數只有23位,只能擷取二進位制小數的前23位儲存。這時,誤差就產生了。

當再次把這個浮點數轉換成十進位制數時,由於損失了一些二進位制位,轉換回來的十進位制數自然也就與原來的不同了。

即使是有11位指數和52位尾數的64位雙精度浮點數,也不可能精確儲存乙個無限迴圈小數,只能是相對單精度浮點數而言,儲存的精度更高。

看懂iee 754標準之前,首先需要了解一下定點數的表示。

所謂定點數,就是小數點位置固定不動的小數。

例如二進位制的0.10可以表示成10。

雖然計算機不能表示出小數點,但是這裡我們假設小數點就在最前面,於是,任何小於1且大於等於0的小數都可以用定點數來表示。

例如:001表示的是二進位制小數0.001。

相對於定點數,小數點的位置不固定的數就叫做浮點數。由於浮點數的小數點位置不固定,因此,就需要一定的方法來表示小數點的位置。

現在的計算機主要採用的是ieee 754標準來表示浮點數。

事實上,在浮點數的儲存過程中,為了運算方便和盡可能多的提高儲存儲存空間的利用效率,往往不會直接儲存各部分的二進位制原碼。

例如,指數部分儲存的是實際指數值得移碼,而尾數部分儲存的是規約化後的尾數的補碼。e=

2n−1

−1其中

n 是指數部分的長度。

如此一來,即使是最小的指數(例如單精度浮點數是-126),在儲存的時候也會儲存為1(-126+127)。這樣,就方便了指數的大小比較也省了乙個符號位。

現在,上面的浮點數的計算公式就變成了下面的樣子:(−

1)si

gn×2

expo

nent

−e×f

ract

ion2

當然,這還不是計算公式的最終形態,因為我們還有尾數沒有說。

剛剛在上面提到過定點數的表示其實就是在這裡做一下鋪墊。因為,尾數部分實際上儲存的就是乙個定點數。

這裡的定點數需要時乙個以1開頭的二進位制數並且小數點位於第一位數的後面。拿(

0.5)

10 來說,把它轉換成二進位制是

(0.1)2

=(−1

)0×(

1.0)2×

2−1

把指數部分用移碼表示就是−1

+127

=126

,所以,0.5的就儲存為:

0 01111110 1000000000000000000000

現在我們又發現,既然尾數部分的定點數都是1開頭,那就把這個1給省略掉好了。這樣就又多出一位來儲存尾數,提高精度了(當然,省略開頭的第乙個1後,預設小數點的位置就變成現在的第一位數之前了)。

於是乎,上面的0.5在實際儲存中就變成了

0 01111110 0000000000000000000000

此時,最終形態的計算公式就是:(−

1)si

gn×2

expo

nent

−e×(

frac

tion

2+1)

當指數部分為0,而尾數部分不為0(指數、尾數同時為0表示的當然是數字0)時,這個浮點數稱為非規約形式浮點數。ieee 754標準規定:非規約形式的浮點數的指數偏移值比規約形式的浮點數的指數偏移值大1。

(完)

程式設計之美 浮點數的精確表示

問題描述 如何將浮點數 小數 轉換為分數的形式,這樣可以更精確的表達出浮點數的值。問題分析 小數可以分為兩種,有限小數和無限迴圈小數。有限小數的處理相對簡單 只要把它乘以10的n次方,轉換為整數,再和10的n次方都除以它們的最大公約數即可。例如 0.25 把它乘以 10的2次方 變成25,25 10...

浮點數的表示

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

浮點數的表示

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