C 浮點型變數的儲存方式

2021-08-10 13:32:00 字數 2411 閱讀 5758

浮點型是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...