浮點數怎麼存儲
A. 單片機里浮點數是怎麼存放的
可以這么說:任何存儲器,無論是pc機,單片機,甚至內存卡的基本存儲模塊都是一樣
的結構(當然是對於ram而言),都是一個存儲單元對應地址線的一種組合相應存儲一個位元組,物理結構是裡面的八個觸發器,每個觸發器對應一個位元組。至於浮點數和整型數理論上沒什麼區別了把,就在多一個位元組存放小數點吧。
B. 浮點數在計算機中的存儲方式
應該是: 在一個為32bit的存儲空間中存儲浮點數,bit0~bit22存儲有效數字部分;bit23~bit30存儲指數部分;bit31存儲符號位。 在一個為64bit的存儲空間中存儲浮點數,bit0~bit51存儲有效數字部分;bit52~bit62存儲指數部分;bit63存儲符號位。 還一種 在一個為80bit的存儲空間中存儲浮點數,bit0~bit62存儲有效數字部分;bit63~bit78存儲指數部分;bit79存儲符號位。 只有這三種了,其他都不支持的 未來可能還有128位浮點數
C. 計算機是如何存儲浮點數的(工作原理,實現方式)
計算機用二進制來表示數字,浮點數也是如此:
首先了解如何用二進製表示小數(也就是如何把十進制小數轉化為二進製表示):
舉一個簡單例子,十進制小數 10.625
1)首先轉換整數部分:10 = 1010b
2)小數部分0.625 = 0.101b
(用「乘2取整法」:0.625*2=1.25,得第一位為1,0.25*2=0.5,得第二位為0,0.5*2=1, 得第三位為1,餘下小數部分為零,就可以結束了)
3)於是得到 10.625=1010.101b
換個表示方式更加深入理解:
1*(10^1)+0*(10^0)+6*(10^-1)+2*(10^-2)+5*(10^-3) =
1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0) + 1*(2^-1) + 0*(2^-2) + 1*(2^-3)
4) 類似十進制可以用指數形式表示:
10.625=10625*(10^-3)
所得的二進制小數也可以這樣指數形式表述:
1010.101b=1010101 * (2^-3)
也就是用有效數字a和指數e來表述: a * (2^e)
用一個32bit的空間(bit0~bit31)來存儲這么一個浮點數,如此分配存儲空間:
bit0 ~ bit22 共23bit,用來表示有效數字部分,也就是a,本例中a=1010101
bit23 - bit30 共8個bit,用來表是指數,也就是e,范圍從-128到127,實際數據中的指數是原始指數加上127得到的,如果超過了127,則從-128開始計,所以這里e=-3表示為124
bit31 為符號位,1表示負數,這里應該為0
把上述結果填入32bit的存儲器,就是計算機表示小數10.625的形式。
注意這個例子的特殊性:它的小數部分正好可以用有限長度的2進制小數表示,因此,而且整個有效數字部分a的總長度小於23,因此它精確的表示了10.625,但是有的情況下,有效數字部分的長度可能超過23,甚至是無限多的,那時候就只好把後面的位數截掉了,那樣表示的結果就只是一個近似值而非精確值;顯然,存儲長度越長,精度就越高,比如雙精度浮點數長度為64位,1位符號位,11位指數位,52位有效數字。
D. 浮點數在計算機裡面的存儲
這個問題比較難..其實在實際運算過程中或寫程序中我們要求的浮點數都有一定的精度,大多數情況下存成文件等形式我們一般會讓他*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
E. 誰能解釋浮點數在內存是怎樣存儲的嗎比如-3.14159如何存儲
以32位浮點數為例:
-3.14159轉化為二進制為-11.xxxx,後面的xxxx我就算了,你自己算,不管怎樣,小數點後面始終精確到第23位
也即-1.1xxxx*2^1,
現在開始計算:符號位是1,階碼是1+127,尾數是1xxxx
至於小數點前面那個1,不存儲,該浮點數參與計算的時候默認加上即可
看明白規律了嗎?
將其二進制形式按符號位、階碼、尾數的形式順序存入內存中的一個4位元組空間里
F. 請問浮點型數據在計算機是怎麼存儲的
摘要 對於浮點類型的數據採用單精度類型(float)和雙精度類型(double)來存儲,float數據佔用32bit,double數據佔用64bit。
G. 請問浮點型數據在計算機是怎麼存儲的
對於浮點類型的數據採用單精度類型(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型處理。
H. 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
I. 浮點數的存儲問題
一個16位或32位浮點數,一部分位數用來儲存10的指數部分,其他位數用來儲存有效數字,還有正負號,如果10的指數部分很大,有效數字部分不夠用,就會舍棄一部分,當然不能精確存儲了。不過大多數應用下都可以保證精度。
J. 浮點型參數怎麼存到存儲器里
一般我更喜歡用共用體:
//聲明共用體
union _UnFloat
{
unsigned char byData[4];
float fData;
}unFloat;
//保存到存儲器:
float Data = 123.456789;//浮點數
unFloat.fData = Data;//浮點數賦值給共用體
//然後unFloat.byData[0]、unFloat.byData[1]、unFloat.byData[2]、unFloat.byData[3]就分別是浮點數4個位元組的內容了,把這四個位元組寫入存儲器就可以了。
//從存儲器中讀出浮點數據
unFloat.byData[0] = 讀存儲器中浮點數保存的第一個位元組;
unFloat.byData[1] = 讀存儲器中浮點數保存的第二個位元組;
unFloat.byData[2] = 讀存儲器中浮點數保存的第三個位元組;
unFloat.byData[3] = 讀存儲器中浮點數保存的第四個位元組;
float Data = unFloat.fData;//這個就是存儲器中保存的浮點數了
實際應用中一般保存到存儲器或者RS232、RS485傳輸等,我都使用這種方式,比較方便。