浮點型是c++定義的基本型別。型別float、double和long double分別表示單精度浮點數、雙精度浮點數和擴充套件精度浮點數。在visual studio中,float型別用4個位元組表示,double和long double用8個位元組表示。
預設的浮點字面值常量為double型別。在數值的後面加上f或者f表示單精度,在數值後面加上l或者l表示擴充套件精度。
float x = 3.1415f;
double y = 3.1415;
long double c = 3.1415l;
在前文中提到,單精度浮點float型別佔4個位元組,即4×8=32位。在32位二進位制數中,包含了符號、指數和尾數三個部分,如圖1所示。
圖1 單精度浮點數的結構
可以用十進位制或者科學記數法來表示浮點數。十進位制的表示方式在「1 浮點型別簡介」中已經介紹。科學記數法的表示方式如下
float x = 1.23e3f;
float y = -4.56e-2f;
對於單精度浮點數型別的變數x,其符號為正,指數為3,尾數為1.23;對於變數y,其符號為負,指數為-2,尾數為-4.56。
對於單精度變數x
float x = 10.125f;
其在記憶體中的儲存方式是怎樣的呢?首先要將x變成二進位制格式,二進位制與十進位制的對應如表1所示:
表1 二進位制與十進位制的對應關係
二進位制0.1
0.01
0.001
0.0001
十進位制0.5
0.25
0.125
0.0625
根據表1所示,因為變數x的值10.125,所以其轉換成二進位制後的格式為1010.001。
接下來將其再轉換為科學計數法的方式,將小數點向左移動3位,即指數為3,因此此時x的表達方式是2進製,所以底數為2。即x的二進位制科學計數法的格式為1.010001×2^3。所以,對於值為10.125的單精度浮點型別的變數x來說,其符號位為正,指數為為3,尾數為010001。
需要注意的是,對於圖1所示的符號位,0表示正數,1表示負數。而指數字的起始值是127,如果此時指數為3,則指數字的值是127+3=130,即10000010,其結構如圖2所示。
圖2 10.125的儲存方式
其二進位制格式為0100 0001 0010 0010 0000 0000 0000 0000,十六進製制格式為41 22 00 00。因為變數使用主機位元組序儲存(大頭big-endian),即低位址儲存數值的低位,高位址儲存數值的高位,所以值為10.125的單精度浮點變數x的值是00 00 22 41。
(1)取值範圍
在「2.1.2 儲存方式」中提到,單精度浮點數float儲存指數的記憶體大小是8位,且起始值是127,所以浮點數指數的最大值是(2^8-1)-127=128。則單精度浮點數float的取值範圍是-2^128~2^128,即-3.4e38~3.4e38。
(2)精度
在「2.1.2 儲存方式」中提到,單精度浮點數float儲存尾數的記憶體大小是23位,2^(-23)≈0.000000119,四捨五入為0.0000001,即7位。也就是說,將浮點數轉化為二進位制科學表示式後,其有效位數為7時,都可以精確表示,即精度為7位。
例如:
float x = 1234.567f;
此時x的值為1234.567;
float y = 1234.5678f;
此時y的值是1234.566。
在前文中提到,雙精度浮點double型別佔8個位元組,即8×8=64位。在64位二進位制數中,包含了符號、指數和尾數三個部分,如圖3所示。
圖3 雙精度浮點數結構
雙精度浮點數double與「2.1.2 儲存方式」中提到的單精度浮點數float的儲存方式相同。
(1)取值範圍
在「2.2.2 儲存方式」中提到,雙精度浮點數double儲存指數的記憶體大小是11位,且起始值是1023,所以浮點數指數的最大值是(2^11-1)-1023=1024。則雙精度浮點數double的取值範圍是-2^1024~2^1024,即-1.79e308~1.79e308。
(2)精度
正如「2.1.3 取值範圍及精度」中提到的計算單精度浮點數float精度的方法,雙精度浮點數double的尾數是52位,所以雙精度浮點數double的精度是15位。
C 浮點型的儲存方式詳解
目錄 有些時候需要變數能儲存帶小數點的數,或者能儲存極大數或極小數。這類數可以用浮點 因小數點是 浮動的 而得名 格式進行儲存。c語言提供了3種浮點型別,對應三種不同的浮點格式。當精度要求不嚴格時 小數點後少於六位 float型別是很適合的型別。double提供更高的精度,對絕大多數程式來說夠用了。...
浮點型變數的儲存格式
float的記憶體結構,我用乙個帶位域的結構體描述如下 struct myfloat bool bsign 1 符號,表示正負,1位 char cexponent 8 指數,8位 unsigned long ulmantissa 23 尾數,23位 符號就不用多說了,1表示負,0表示正 指數是以2為...
IEEE 754浮點型儲存方式
最近突然糾結與浮點型到底是怎麼儲存的,看了很多理論描述,以為沒有找到特別詳細的例子,還是一臉懵逼。所以我特意記錄一下浮點型變數儲存方式的例子。以最常用的ieee 754標準為例,單精度浮點型的二進位制主要分為三部分 數符 階數 尾數 階數也包含一位階符,但從儲存上看應該是三部分 公式為 數符x尾數x...