目錄
有些時候需要變數能儲存帶小數點的數,或者能儲存極大數或極小數。這類數可以用浮點(因小數點是「浮動的」而得名)格式進行儲存。c語言提供了3種浮點型別,對應三種不同的浮點格式。
當精度要求不嚴格時(小數點後少於六位),float型別是很適合的型別。double提供更高的精度, 對絕大多數程式來說夠用了。longdouble支援極高精度的要求,很少會用到。
c標準沒有說明float、double和long double型別提供的的精度到底是多少,因為不同計算機可以用不同方法儲存浮點數。大多數現代計算機遵循ieee754標準(即iec 60559) 的規範,所以這裡也將它作為乙個示例。
由ieee開發的ieee標準提供了兩種主要的浮點數格式:單精度(32位)和雙精度(64位)。數值以科學記數法的形式儲存,每乙個數都由三部分組成:符號、指數和小數。指數部分的位數說明了數值的可能大小程度,而小數部分的位數說明了精度。單精度格式中,指數長度為8位,而小數部分佔了23位。因此,單精度數可以表示的最大值大約是3.401038,其中精度是6個十進位制數字。
ieee標準還描述了另外兩種格式:單擴充套件精度和雙擴充套件精度。標準沒有指明這些格式中的位數,但要求單擴充套件精度型別至少為43位,而雙擴充套件精度型別至少為79位。
型別最小值
最大值精度
備註●float
1.175 4910-38
3.402 821038
小數點後6位
單精度32位
●double
2.225 0710-308
1.797 6910308
小數點後15位
雙精度64位
上表給出了根據ieee標準實現的浮點型別特徵。[表中給出了規範化的最小正值, 非規範化的數可以更小。] long double型別沒有顯示在此表中, 因為它的長度隨著機器的不同而變化,而最常見的大小是80位和128位。
對於浮點型資料,首先我們需要明白的一點是:浮點數和整型數的編碼方式是不一樣的,ieee浮點標準採用如下形式來標識乙個浮點數。
v = (-1)s m 2e
下面,我將用float作為例子,double道理也是一樣的,只是位數有所不同。
例如:十進位制數:88.8125 —> 二進位制為:101 1000.1101
然後將101 1000.1101化成上述公式m的形式,其範圍是[1,2),所以將小數點左移6位,得到1.011000110126(這裡不懂的話對比十進位制,小數點左移一位乘以10,二進位制則乘以2)。
最後得到s = 0、m = 1.0110001101、e = 6,但是事情並沒有那麼簡單,我們接著往下看。
1、有效數字m:
1<=m<2,也就是說,m寫成1.***……的形式,其中***……表示小數部分。
ieee 754規定,在計算機內部儲存m時,預設www.cppcns.com這個數的第一位總是1,因此可以被捨去,只儲存小數部分。比如儲存1.0110001101時,只儲存0110001101,後面的位數補0就可以了,等到讀取的時候,再把第一位的1補上去。
2、指數e:
首先,e為乙個無符號整數(unsigned int)
如果e為8位,它的取值範圍為0~255;如果e為11位,它的取值範圍為0~2047。但是,我們知道,科學計數法是可以出現負數的,所以ieee 754規定,存入記憶體的e是真實值加上乙個中間數,對於8位的e,中間數是127,對於11位的e,中間數是1023。比如,26 的e是6,所以儲存為32位浮點數時,必須儲存為6+127=133,即10000101。
結合上述補充的資訊完善例子
float:
十進位制數:88.8125 二進位制為:101 1000.1101 == 1.011000110126
因此浮點數88.8125的ieee浮點表示為:
----0----1000 0101----011 0001 1010 0000 0000 0000
符號位- -指數域- - - - - - - - - - -小數域
根據指數域不同取值分為一下三種情況:&
1)e不全為0或不全為1(規格化值)
這是最常見情況,取出記憶體中的數時,指數e的計算值減去127(或1023),得到真實值,再將有效數字m前加上第一位的1。
2)e全為0(非規格化值)
這時,浮點數的指數e等於1-127(或1-1023)即為真實值,有效數字m不再加上第一位的1,而是還原為0.******x的小數。這樣做是為了表示正負零,以及接近於0的很小的數字。
舉個例子:編碼為如下情形:
0 0000 0000 000 0000 0000 0000 0000 0001
即2(-23)2(-126)=2(-149),轉成10進製大約等於1.410(-45),這就是單精度所能表達最小的正數了。
3)e全為1(特殊數值)
當指數域全為1時屬於這種情形。此時,如果小數域全為0且符號域s=0,則表示正無窮,如果小數域全為0且符號域s=1,則表示負無窮。如果小數域不全為0時,浮點數將被解釋為nan, 即不是乙個數(not a number) 。比如計算負數平方根或處理未初始化資料時。
本文標題: c++浮點型的儲存方式詳解
本文位址:
C 浮點型變數的儲存方式
浮點型是c 定義的基本型別。型別float double和long double分別表示單精度浮點數 雙精度浮點數和擴充套件精度浮點數。在visual studio中,float型別用4個位元組表示,double和long double用8個位元組表示。預設的浮點字面值常量為double型別。在數值...
IEEE 754浮點型儲存方式
最近突然糾結與浮點型到底是怎麼儲存的,看了很多理論描述,以為沒有找到特別詳細的例子,還是一臉懵逼。所以我特意記錄一下浮點型變數儲存方式的例子。以最常用的ieee 754標準為例,單精度浮點型的二進位制主要分為三部分 數符 階數 尾數 階數也包含一位階符,但從儲存上看應該是三部分 公式為 數符x尾數x...
C語言資料儲存 浮點型
浮點數的儲存 ieee 745 乙個例項 關於e的一些注意點 1 float 3.4e 38 3.4e38 2 double 1.7e 308 1.7e308 3 long double 3.4e 4932 1.1e4932 我們以9.5為例,首先將乙個浮點型資料轉化為2進製形式,同時分為整數部分和...