相比int等整型,float等浮點型別的表示和儲存較為複雜,但它又是乙個無法迴避的話題,那麼就有必要對浮點一**竟了。在計算機中,一般用ieee浮點近似表示任意乙個實數,那麼它實際上又是如何表示的呢?
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是乙個等於
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.25f為例。其二進位制表示為
因此不難得到,8.25的在記憶體中的儲存情況為:
***p
frac
01000 0010
0001 0000 0000 0000 0000 000
如果這個時候把這個值作為整型使用,是多少呢?沒錯,是1090781184
#includeint main(int argc,char *argv)
關於浮點數,需要再說幾句: 浮點數的理解
1 浮點數的表示 ieee 754 目前絕大多數語言都支援該文件,c語言裡面的float,double就為該文件的32位和64位浮點。1 單精度浮點值 float型別的為32位儲存方式,從高位到低位的儲存分別為31位是數符位,30 23位是階碼位e,在儲存時真實階碼e要加上7f h 為e,後面的22...
浮點數的理解
浮點表數法 的標準是這樣,假如是 single float 單精度浮點數為例,是4位元組32位的 儲存空間 第一位 bit 正負號 比如1代表 正數,0代表負數 後面八位是,2 x 次方中的 x 最後二十三位,表示 精度數值 這23位,分成整數和小數部分,x1.x2 2 y1 y2 設 y2就是 0...
浮點數的一些簡單表示規則
浮點型資料是用來表示具有小數點的實數de。在c中,實數是以指數形式存放在儲存單元中的。乙個實數表示為指數可以有不止一種形式,如3.14159 10 0,0.314159 10 1 它們代表的是同乙個值。可以發現,小數點的位置改變從而改變了指數的值,就不改變它們值的大小。由於小數點的位置可以浮動,所以...