❶ C語言實型(浮點型)數據在內存中的存放形式
實數分為float型和double型,它們分別對應IEEE 754標准中的單精度浮點數和雙精度浮點數類型,在內存中的存儲形式遵守IEEE 754浮點數標准。以float類型數據為例,3.14159表示成二進制為11.0010010000111111001111......,規格化後表示為1.10010010000111111001111×2^1(小數點後保留23位有效數字,因為IEEE 754標准規定的尾數為23位);指數為1,故階碼為1+127=128=10000000;這是一個正數故符號位為0,因此它在內存中的表示形式是0 10000000 10010010000111111001111,寫成16進制為40490FCF。
❷ float和double型分別怎麼存儲
C/C++的浮點數據類型有float和double兩種。
類型float大小為4位元組,即32位,內存中的存儲方式如下: 符號位(1 bit) 指數(8 bit) 尾數(23 bit)
類型double大小為8位元組,即64位,內存布局如下: 符號位(1 bit) 指數(11 bit) 尾數(52 bit)
符號位決定浮點數的正負,0正1負。
指數和尾數均從浮點數的二進制科學計數形式中獲取。
如,十進制浮點數2.5的二進制形式為10.1,轉換為科學計數法形式為(1.01)*(10^1),由此可知指數為1,尾數(即科學計數法的小數部分)為01。
根據浮點數的存儲標准(IEEE制定),float類型指數的起始數為127(二進制0111 1111),double類型指數的起始數為1023(二進制011 1111 1111),在此基礎上加指數,得到的就是內存中指數的表示形式。尾數則直接填入,如果空間多餘則以0補齊,如果空間不夠則0舍1入。所以float和double類型分別表示的2.5如下(二進制):
符號位
指數
尾數
0
1000 0000
010 0000 0000 0000 0000 0000
0
100 0000 0000
0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
❸ 關於浮點型float數值是怎樣在內存中存儲的
單精度浮點型(float )專指佔用32位存儲空間的單精度(single-precision )值。單精度在一些處理器上比雙精度更快而且只佔用雙精度一半的空間,但是當值很大或很小的時候,它將變得不精確。double float數據類型,計算機中表示實型變數的一種變數類型。此數據類型與單精度數據類型(float)相似,但精確度比float高,編譯時所佔的內存空間依不同的編譯器而有所不同,通常情況,單精度浮點數佔4位元組(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,;雙精度型佔8 個位元組(64位)內存空間,其數值范圍為1.7E-308~1.7E+308。
❹ 浮點類型是如何存儲的
計算機中最小的存儲單位是bit只能保存0和1,整數在內存中如何存儲我們都知道,將要存儲的數字轉成2進制即可
用windows自帶的計數器可以方便的查看整數對應的2進制值
如:
byte類型(單位元組)
那浮點類型是如何用這么少的位元組(如float 4位元組)表示這么大(float 最大 3.4028235E38)的數字呢?
浮點數,是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學計數法。
科學計數法是一種記數的方法。把一個數表示成a與10的n次冪相乘的形式(1≤|a|<10,a不為分數形式,n為整數),這種記數法叫做科學計數法。當我們要標記或運算某個較大或較小且位數較多時,用科學計數法免去浪費很多空間和時間。
這也是一種目前最常用的浮點數標准!為許多CPU與浮點運算器所採用。
簡單的說就是將一個浮點數字拆成3個部分(符號部分、指數部分、小數部分) 存儲在連續的bit中,類似科學計數法。
用 {S,E,M}來表示一個數 V 的,即 V =(-1)S × M × 2E ,如下:
其中:
其中d.dd...d 為有效數字,β為基數,e 為指數
有效數字中 數字的個數 稱為 精度 ,我們可以用 p 來表示,即可稱為 p 位有效數字精度。
每個數字 d 介於 0 和基數 β 之間,包括 0。
對十進制的浮點數,即基數 β 等於 10 的浮點數而言,上面的表達式非常容易理解。
如 12.34,我們可以根據上面的表達式表達為:
1×10 1 + 2×10 0 + 3×10 -1 + 4×10 -2
其規范的浮點數表達為: 1.234×10 1 。
但對二進制來說,上面的表達式同樣可以簡單地表達。
唯一不同之處在於:二進制的 β 等於 2,而每個數字 d 只能在 0 和 1 之間取值。
如二進制數 1001.101 ,我們可以根據上面的表達式表達為:
1×2 3 + 0×2 2 + 0×2 1 + 1×2 0 + 1×2 -1 + 0×2 -2 + 1×2 -3
其規范浮點數表達為: 1.001101×2 3 。
二進制數 1001.101 轉成十進制如下:
由上面的等式,我們可以得出:
向左移動二進制小數點一位相當於這個數除以 2,而向右移動二進制小數點一位相當於這個數乘以 2。
如 101.11 = 5又3/4 (5.75),向左移動一位,得到 10.111 = 2又7/8 (2.875)。
除此之外,我們還可以得到這樣一個基本規律:
一個十進制小數要能用浮點數精確地表示,最後一位必須是 5(當然這是必要條件,並非充分條件)。
如下面的示例所示:
基本換算方法:
將10進制的數拆分成整數和小數兩個部分
整數部分除以2,取余數;小數部分乘以2,取整數位。
示例:
將十進制 1.1 轉成 二進制
整數部分:1
1
小數部分:0.1
二進制形式表示為:
1.000110011001100110011...
再加上整數1,約等於:
1.099609375
計算的位數越多越精確
注意:
二進制小數不像整數一樣,只要位數足夠,它就可以表示所有整數。
在有限長度的編碼中,二進制小數一般無法精確的表示任意小數,比如十進制小數0.2,我們並不能將其准確的表示為一個二進制數,只能增加二進制長度提高表示的精度。
根據 IEEE 754 浮點「雙精度格式」位布局。
如果參數是正無窮大,則結果為 0x7ff0000000000000L。
如果參數是負無窮大,則結果為 0xfff0000000000000L。
如果參數是 NaN,則結果為 0x7ff8000000000000L。
根據 IEEE 754 浮點「單一格式」位布局。
如果參數為正無窮大,則結果為 0x7f800000。
如果參數為負無窮大,則結果為 0xff800000。
如果參數為 NaN,則結果為 0x7fc00000。
這里以 double類型說明
將一個浮點數與上面的掩碼進行與運算,即可得到對應的 符號位、指數位、尾數位 的值。
1.000110011001100110011...
所以存為:
0 01111111111 000110011001100110011...
根據 IEEE 754 規范
在二進制,第一個有效數字必定是「1」,因此這個「1」並不會存儲。
單精和雙精浮點數的有效數字分別是有存儲的23和52個位,加上最左邊沒有存儲的第1個位,即是24和53個位。
通過計算其能表示的最大值,換十進制來看其精度:
浮點運算很少是精確的,只要是超過精度能表示的范圍就會產生誤差。而往往產生誤差不是因為數的大小,而是因為數的精度。
我自己理解為分兩種情況(這個不一定是對)
通過上面的轉換示例,我們知道小數的二進製表示一般都不是精確的,在有限的精度下只能盡量的表示近似值
值本身就不是精確的,再進行計算就很可能產生誤差
輸出:
0.1
原始值: 0 01111111011
指數:1019 -1023 = -4
二進制形式:
0.0001
0.2
原始值:0 01111111100
指數:1020 -1023 = -3
二進制形式:
0.00
0.3
原始值:0 01111111101
指數:1021 = -2
二進制形式:
0.00
二進制加法運算
這里用float驗證,float最大的精度是8位數
對於不能精確的表示的數,採取一種系統的方法:找到「最接近」的匹配值,它可以用期望的浮點形式表現出來,這就是舍入。
對於舍入,可以有很多種規則,可以向上舍入,向下舍入,向偶數舍入。如果我們只採用前兩種中的一種,就會造成平均數過大或者過小,實際上這時候就是引入了統計偏差。如果是採用偶數舍入,則有一半的機會是向上舍入,一半的機會是向下舍入,這樣子可以避免統計偏差。而 IEEE 754 就是採用向最近偶數舍入(round to nearest even)的規則。
(這段是網上抄的)
這里以java語言示例,用大端的方式示例(網路序)
java中是以大端模式存儲的,java對我們屏蔽了內部位元組順序的問題以實現跨平台!
實際在不同的cpu架構下,存儲方式不同,我們常用的X86是以小端的模式存儲的。
網路傳輸一般採用大端序,也被稱之為網路位元組序,或網路序。IP協議中定義大端序為網路位元組序。
輸出:
❺ 浮點數在計算機裡面的存儲
這個問題比較難..其實在實際運算過程中或寫程序中我們要求的浮點數都有一定的精度,大多數情況下存成文件等形式我們一般會讓他*10^n次方來存儲去掉小數位.下面說正題.
何數據在內存中都是以二進制(0或1)順序存儲的,每一個1或0被稱為1位,而在x86CPU上一個位元組是8位。比如一個16位(2 位元組)的short int型變數的值是1000,那麼它的二進製表達就是:00000011 11101000。由於Intel CPU的架構原因,它是按位元組倒序存儲的,那麼就因該是這樣:11101000 00000011,這就是定點數1000在內存中的結構。
目前C/C++編譯器標准都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
````````符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64
臨時數 1 15 64 80
由於通常C編譯器默認浮點數是double型的,下面以double為例:
共計64位,摺合8位元組。由最高到最低位分別是第63、62、61、……、0位:
最高位63位是符號位,1表示該數為負,0正;
62-52位,一共11位是指數位;
51-0位,一共52位是尾數位。
按照IEEE浮點數表示法,下面將把double型浮點數38414.4轉換為十六進制代碼。
把整數部和小數部分開處理:整數部直接化十六進制:960E。小數的處理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了(隱藏位技術:最高位的1 不寫入內存)。
如果你夠耐心,手工算到53位那麼因該是:38414.4(10)=1001011000001110.(2)
科學記數法為:1.001……乘以2的15次方。指數為15!
於是來看階碼,一共11位,可以表示範圍是-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023,在這里, 15+1023=1038。二進製表示為:100 00001110
符號位:正—— 0 ! 合在一起(尾數二進制最高位的1不要):
01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101
按位元組倒序存儲的十六進制數就是:
55 55 55 55 CD C1 E2 40
❻ float變數在內存當中是怎樣存儲的或是怎樣的一種存儲格式
浮點型變數在計算機內存中佔用4位元組(Byte),即32-bit。遵循IEEE-754格式標准。
一個浮點數由2部分組成:底數m 和 指數e。
±mantissa × 2exponent
(注意,公式中的mantissa 和 exponent使用二進製表示)
底數部分使用2進制數來表示此浮點數的實際值。
指數部分佔用8-bit的二進制數,可表示數值范圍為0-255。但是指數應可正可負,所以IEEE規定,此處算出的次方須減去127才是真正的指數。所以float的指數可從 -126到128.
底數部分實際是佔用24-bit的一個值,由於其最高位始終為 1 ,所以最高位省去不存儲,在存儲中只有23-bit。
到目前為止, 底數部分 23位 加上指數部分 8位 使用了31位。那麼前面說過,float是佔用4個位元組即32-bit,那麼還有一位是幹嘛用的呢? 還有一位,其實就是4位元組中的最高位,用來指示浮點數的正負,當最高位是1時,為負數,最高位是0時,為正數。
浮點數據就是按下表的格式存儲在4個位元組中:
Address+0 Address+1 Address+2 Address+3
Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮點數正負,1為負數,0為正數
E: 指數加上127後的值的二進制數
M: 24-bit的底數(只存儲23-bit)
主意:這里有個特例,浮點數 為0時,指數和底數都為0,但此前的公式不成立。因為2的0次方為1,所以,0是個特例。當然,這個特例也不用認為去干擾,編譯器會自動去識別。
通過上面的格式,我們下面舉例看下-12.5在計算機中存儲的具體數據:
Address+0 Address+1 Address+2 Address+3
Contents 0xC1 0x48 0x00 0x00 接下來我們驗證下上面的數據表示的到底是不是-12.5,從而也看下它的轉換過程。
由於浮點數不是以直接格式存儲,他有幾部分組成,所以要轉換浮點數,首先要把各部分的值分離出來。
Address+0 Address+1 Address+2 Address+3
格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
二進制 11000001 01001000 00000000 00000000
16進制 C1 48 00 00
可見:
S: 為1,是個負數。
E:為 10000010 轉為10進制為130,130-127=3,即實際指數部分為3.
M:為 10010000000000000000000。 這里,在底數左邊省略存儲了一個1,使用 實際底數表示為 1.10010000000000000000000
到此,我們吧三個部分的值都拎出來了,現在,我們通過指數部分E的值來調整底數部分M的值。調整方法為:如果指數E為負數,底數的小數點向左移,如果指數E為正數,底數的小數點向右移。小數點移動的位數由指數E的絕對值決定。
這里,E為正3,使用向右移3為即得:
1100.10000000000000000000
至次,這個結果就是12.5的二進制浮點數,將他換算成10進制數就看到12.5了,如何轉換,看下面:
小數點左邊的1100 表示為 (1 × 23) + (1 × 22) + (0 × 21) + (0 × 20), 其結果為 12 。
小數點右邊的 .100… 表示為 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其結果為.5 。
以上二值的和為12.5, 由於S 為1,使用為負數,即-12.5 。
所以,16進制 0XC1480000 是浮點數 -12.5 。
上面是如何將計算機存儲中的二進制數如何轉換成實際浮點數,下面看下如何將一浮點數裝換成計算機存儲格式中的二進制數。
舉例將17.625換算成 float型。
首先,將17.625換算成二進制位:10001.101 ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不會將小數部分轉換成二進制,請參考其他書籍。) 再將 10001.101 向右移,直到小數點前只剩一位 成了 1.0001101 x 2的4次方(因為右移了4位)。此時 我們的底數M和指數E就出來了:
底數部分M,因為小數點前必為1,所以IEEE規定只記錄小數點後的就好,所以此處底數為 0001101 。
指數部分E,實際為4,但須加上127,固為131,即二進制數 10000011
符號部分S,由於是正數,所以S為0.
綜上所述,17.625的 float 存儲格式就是:
0 10000011 00011010000000000000000
轉換成16進制:0x41 8D 00 00
所以,一看,還是佔用了4個位元組。
下面,我做了個有趣的實驗,就是由用戶輸入一個浮點數,程序將這個浮點數在計算機中存儲的二進制直接輸出,來看看我們上面所將的那些是否正確。
有興趣同學可以到VC6.0中去試試~!
#include<iostream.h>
#define uchar unsigned char
void binary_print(uchar c)
{
for(int i = 0; i < 8; ++i)
{
if((c << i) & 0x80)
cout << '1';
else
cout << '0';
}
cout << ' ';
}
void main()
{
float a;
uchar c_save[4];
uchar i;
void *f;
f = &a;
cout<<"請輸入一個浮點數:";
cin>>a;
cout<<endl;
for(i=0;i<4;i++)
{
c_save[i] = *((uchar*)f+i);
}
cout<<"此浮點數在計算機內存中儲存格式如下:"<<endl;
for(i=4;i!=0;i--)
binary_print(c_save[i-1]);
cout<<endl;
}
好了,我想如果你仔細看完了以上內容,你現在對浮點數算是能比較深入的了解了。
❼ 請問浮點型數據在計算機是怎麼存儲的
對於浮點類型的數據採用單精度類型(float)和雙精度類型(double)來存儲,float數據佔用32bit,double數據佔用64bit。
無論是單精度還是雙精度在存儲中都分為三個部分:
1、符號位(Sign) : 0代表正,1代表為負。
2、指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲。
3、尾數部分(Mantissa):尾數部分。
(7)浮點型在內存中存儲方式擴展閱讀
實型變數分為兩類:單精度型和雙精度型,
其類型說明符為float 單精度說明符,double
雙精度說明符。在Turbo
C中單精度型佔4個位元組(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。
雙精度型佔8
個位元組(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
實型變數說明的格式和書寫規則與整型相同。
例如: float x,y; (x,y為單精度實型量)
double a,b,c; (a,b,c為雙精度實型量)
實型常數不分單、雙精度,都按雙精度double型處理。