浮點數在計算機中是如何表示的

2021-09-24 09:12:57 字數 2463 閱讀 9402

相比int等整型,float等浮點型別的表示和儲存較為複雜,但它又是乙個無法迴避的話題,那麼就有必要對浮點一**竟了。在計算機中,一般用ieee浮點近似表示任意乙個實數,那麼它實際上又是如何表示的呢?

下面的表示式裡,i的值是多少,為什麼?如果你不確定答案,那麼你應該好好看看本文。

float f = 8.25f;

int i = *(int*)&f;

ieee浮點標準用

的形式近似表示乙個數。並且將浮點數的位表示劃分為三個字段:

在單精度浮點格式(c語言的float)中,s,exp和frac欄位分別為1位,8位和23位,而雙精度浮點格式(c語言中的double)中,s,exp和frac欄位分別為1位,11位和52位。

乙個浮點數的常見位元位表示如下:

而根據exp的值,被編碼的值可以分為三大類不同的情況。下面進行一一解釋。

情況1:規格化的值

即最普遍的情況,當exp,即階碼域既不為全0,也不為全1的情況。在這種情況下,階碼字段解釋為以偏置(biased)形式表示有符號整數,即e=exp-bias,exp是無符號數(1~254)。bias是乙個等於的偏置值,對於單精度來說,k=23,bias=127,因此e的範圍是-126~+127。

frac被描述為小數值,且0≤frac<1,其二進位制表示為0.frac。尾數定義為m=1+frac,則m=1.frac。那麼就有1≤m<2,由於總是能夠調整階碼e,使得m在範圍1≤m<2,所以不需要顯示的表示它,這樣還能獲得乙個額外的精度位。也就是說,在計算機內部儲存m時,預設這個數的第一位總是1,因此可以被捨去,只儲存後面的frac部分,等到讀取的時候,再把第一位的1加上去。

情況2:非規格化的值

當exp,即階碼域為全0時,所表示的數便為非規格化的值,該情況下的階碼值e=1-bias(注:為從非格式化值轉換到格式化值提供了一種方法)。尾數m=frac

非規格化的數有兩個作用。

情況3:特殊值

有兩種對於浮點數,其能表示的數值範圍和其有效位如下

型別位元位

數值範圍

有效位float

32-3.410^38~+3.410^38

6~7位

double

64-1.710^-308~1.710^308

15~16位

long double

128-1.210^-4932~1.210^4932

18~19位

可見同比特位數的整型(例如int)要比浮點數(例如float)能表示的數值範圍要小很多,但是需要注意的,雖然浮點數能表示的範圍大,但是 它卻不能精確表示在其範圍內的所有實數,也就是說,它只能保證有效位的值是精確的,當表示的數值(小數部分)超過有效位時,所表示的數是無法保證精確的,甚至可以說是錯誤的。

那麼浮點數的數值範圍和有效位是如何得到的呢?

浮點數的數值範圍計算

有了前面了基礎,我們就可以來計算浮點數的數值範圍了。以單精度(float)為例,我們知道它的指數範圍(即e)為-126~+127,而m的範圍為1≤m<2,實際上,對於單精度,1≤m≤2-2^(-23)(注:23為frac欄位所佔的位元位)。那麼我們就可以得到單精度的最大值為:

同理,我們可以得到單精度的最小值為:

我們僅僅以單精度為例,用同樣的方法可以計算其他精度的浮點數數值範圍,在此不再贅述。

浮點數的有效位

有效位也可以理解為我們常說的精度。浮點數的精度是由尾數的位數來決定的。

對於單精度(float),它的尾數為23位,而2^23=8388608,共7位,也就是說最多能有7位有效數字,但至少能保證6位,因此其有效位為6~7位。當然我們可以通過下面的內容進一步理解。以下計算結果保留10位小數。

觀察a和b的結果可以發現,0.0000001和0.0000002之間的其他數是沒有辦法通過單精度浮點數來精確表示的,也就是說,只有到小數點後面7位的值才是精確的,同理,觀察b和c的結果,0.0000002到0.0000004之間的其他數也是不能通過單精度浮點數精確表示的,更不幸地是,這之間的數,甚至只能精確到第6位。

這也就有了單精度浮點數的有效位為6~7位的結論。根據相似的方法,我們同樣可以得到雙精度浮點數的有效位為15~16位的結論,這裡不再贅述。

了解了這麼多,我們來看一下乙個小數究竟是如何在記憶體中儲存的。以float f = 8.5f為例。其二進位制表示為

因此不難得到,8.5的在記憶體中的儲存情況為:

***p

frac

01000 0010

0001 0000 0000 0000 0000 000

如果這個時候把這個值作為整型使用,是多少呢?沒錯,是1091043328

#includeint main(int argc,char *ar**)

關於浮點數,需要再說幾句:

浮點數在計算機中的表示

浮點數在計算機中的表示 最後編輯於 2010 4 13 計算機中數字是以0和1二進位制儲存的,我們熟悉的是整數的如何在計算機中表示,那麼浮點數是如何表示的呢?一 轉換 我們先來看看如何將十進位制的浮點數轉換成二進位制。乙個十進位制的浮點數,例如 abcd.efg 其中a g為0.9 其值用多項式為 ...

計算機中浮點數的表示

浮點數就是有小數點的數。在c語言中有三種浮點數,分別為float,double和long double。下面分析一下其實現。include int main int argc,char argv 這是乙個簡單的c語言程式,定義了三個不同型別的變數a b c。編譯後用gdb除錯下 gdb p size...

計算機中浮點數的表示

在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 ...