在c語言中浮點數有兩個size,32位和64位。其中32位浮點數:第1位是signflag(符號位),2-9位是階碼位(exponent),10-32位是尾數字(significand)。64位分別是第1位,2-12位,13-64位。
浮點數大小的公式是:\(x = (-1)^ * 2^e*m\)
\(e = exp-(2^-1)\),將\(exp\)看作無符號整數,\(k\)為\(exp\)的位數。
例如,對於32位浮點數來說\(k = 8,e\in[-126,127]\),對於64位浮點數來說\(k=11,e\in[-1022,1023]\)。
\(m = 1+0.frac\),將\(frac\)看作小數值。
例如\(frac = 1011_2\),那\(m = 1_2+0.1011_2 = 1.1011_2 = 1\dfrac\)。
這是通常情況下(規格化值)的計算公式,還有三種特殊情況。
當\(exp=0\)時,即是非規格化的值,這時:
\(e = 1-(2^-1),k\)為\(exp\)的位數。
例如,對於32位非規格化值\(k=8,e = 1-(2^7-1) = -126\),對於64位來說\(k=11,e=1-(2^10-1)=-1022\),我們發現非規格化的\(e\)和規格化的\(e\)的下界相等,這會導致非規格化值到規格化值的平滑轉換。
\(m = 0.frac\)
當\(exp的\)位模式全為1時,也就是無符號整數的最大值,這時為特殊值,有兩個特殊值:
當\(frac=0\)時,浮點數為無窮大
否則,浮點數為nan(not a number),例如:\(\sqrt\) 。
ieee標準中,由於精度問題,當乙個浮點數無法準確表示乙個實數時需要進行捨入。所用的方法是向偶數捨入。
用幾個例子說明:
數字捨入後
1.41
1.62
1.52
2.52
3.54
如果該數字正好在上下界之間,則向偶數捨入,與我們通常的四捨五入略有區別。這樣做的好處是:當有一組浮點數放在一起求平均值時可以保證誤差最小,因為每個在上下界之間的數字都有百分之五十幾率向下捨入,百分之五十幾率向上捨入。
對於二進位制小數也是如此
二進位制小數
捨入後(保留小數點後一位)
10.01
10.0
10.011
10.1
10.11
11.0
11.001
11.0
計算機中浮點數的表示
浮點數就是有小數點的數。在c語言中有三種浮點數,分別為float,double和long double。下面分析一下其實現。include int main int argc,char argv 這是乙個簡單的c語言程式,定義了三個不同型別的變數a b c。編譯後用gdb除錯下 gdb p size...
浮點數在計算機中的表示
浮點數在計算機中的表示 最後編輯於 2010 4 13 計算機中數字是以0和1二進位制儲存的,我們熟悉的是整數的如何在計算機中表示,那麼浮點數是如何表示的呢?一 轉換 我們先來看看如何將十進位制的浮點數轉換成二進位制。乙個十進位制的浮點數,例如 abcd.efg 其中a g為0.9 其值用多項式為 ...
計算機中的浮點數
寫這篇blog,是因為在上工程碩士數學時候,又開始講到了浮點數的儲存,運算和精度的問題。這個問題已經見了好多次了,從微機原理的課到計算機視覺處理矩陣時候的conditioning,到這次。但感覺一直都沒有理清楚。所以這次嘗試梳理一下。一般主要分為兩種形式,這裡以8位的儲存進行解釋 所以用浮點數表示數...