浮點型數據
浮點型數據
1.十進位數形式
由數碼0~9和小數點組成。例如:0.0,.25,5.789,0.13,5.0,300.,-267.8230等均為合法的實數。
2.指數形式
由十進位數,加階碼標誌“e”或“E”以及階碼(只能為整數,可以帶符號)組成。一般形式為a E n (a為十進位數,n為十進位整數)其值為a*10,n如:2.1E5(等於2.1*10的5次方),3.7E-2(等於3.7*10的-2次方)0.5E7(等於0.5*10的7次方),-2.8E-2(等於-2.8*10的-2次方),以下不是合法的實數345(無小數點)E7(階碼標誌E之前無數字) -5(無階碼標誌)53.-E3(負號位置不對)2.7E(無階碼)
標準C允許浮點數使用後綴。後綴為“f”或“F”即表示該數為浮點數。如356f。例2.2說明了這種情況:
void main()
{
printf("%f\n%f\n",356.,356f);
}
void 指明main不返回任何值 利用printf顯示結果 結束
浮點型變數:
實型變數分為兩類:單精度型和雙精度型,
其類型說明符為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型處理。
標準4位元組浮點型在計算機里存儲方式如下圖
浮點型數據
符號域 | 指數域 | 小數域 | 指數偏移量 | |
單精度浮點數 | 1位 | 8位[30-23] | 23位[22-00] | 127 |
雙精度浮點數 | 1位 | 11位[62-52] | 52位[51-00] | 1023 |
下面以單精度浮點數為例來介紹浮點數的三個區域:
符號域:符號域佔1位,0表示正數,1表示負數。指數域:指數域共有8位,可表達的範圍為:0~255。為能處理負指數,實際指數位存儲在指數域中值減去一個偏移量(單精度為127,雙精度為1023)。單精度浮點數的偏移量為127,故實際可表達的指數值的範圍為-127~128。尾數域:尾數域共有23位。由於規範浮點數的小數點左側必須為1,所以在保存尾數時,可以省略小數點前面這個1,從而騰出一個二進位位來保存更多的尾數。舉例:比如對於單精度數而言,二進位的1001.101(對應於十進位的9.625)可以表達為1.001101×2^3,所以實際保存在尾數域中的
值為0011 0100 0000 0000 0000 000,即去掉小數點左側的1,並用0在右側補齊。
(
整數部分(9)的計算:1001
小數部分(0.625)的計算:
0.625*2=1.25--------1
0.252=0.5----------0
0.5*2=1.0-----------1
所以用二進位科學表示方式為:1.001101*2^3
)
實數與浮點數之間的變換舉例例一:已知一個單精度浮點數用16進位數表示為:0xC0B40000,求此浮點數所表達的實數。
先轉換為二進位形式(注意:對於負數二進位補碼轉換成十進位一定要:先取反,后加1)
C 0 B 4 0 0 0 0
1100 0000 1011 0100 0000 0000 0000 0000
按照浮點數格式切割成相應的域 1 1000 0001 01101 000000000000000000
經分析:符號域1 意味著負數;指數域為129 意味著實際的指數為2 (減去偏差值127);尾數域為01101 意味著實際的二進位尾數為1.01101 (加上隱含的小數點前面的1)。所以,實際的實數為:
= -1.01101 × 2^ 2=- ( 1*2^0 + 1*2^(-2) + 1*2^(-3) + 1*2^(-5) ) × 2^2
= -(1+0.25+0.125+0.03125)*4
= -1.40625*4
= -5.625
例二:將實數-9.625變換為相應的浮點數格式。
1)求出該實數對應的二進位:1001.101,用科學技術法表達為:-1.001101 ×2^3;
2)因為負數,符號為1;
3)指數為3,故指數域的值為3 + 127 = 130,即二進位的10000010;
4)尾數為1.001101,省略小數點左邊的1後為001101,右側0補齊,補夠23位,
最終尾數域為:00110100000000000000000;
5)最終結果:1 10000010 00110100000000000000000,用16進位表示:0xC11A0000。