C語言資料存盤-浮點型
- 浮點型
- 浮點型的種類和表示范圍
- 儲存方式
- 二進制轉化
- 浮點數的儲存 (IEEE 745)
- 一個實體
- 關于E的一些注意點
浮點型
浮點型的種類和表示范圍
1、float:3.4E-38~3.4E38
2、double:1.7E-308~1.7E308
3、long double:3.4E-4932~1.1E4932
儲存方式
二進制轉化
我們以9.5為例,首先將一個浮點型資料轉化為2進制形式,同時分為整數部分和小數部分
于是就有了1001.1
整數部分的轉化與整型非常類似,然而小數部分非常有趣,
小數點后其實類比于十進制,第一位代表2^-1(即0.5)
第二位代表 2^-2(即0.25)…以此類推,所以9.5可以精確的表示有賴于0.5恰好可以表示為2的-1次方,
那我們來觀察一下0.3=0.25(即2^-2)+
0.03125 (即2^-5)
+…
由此可知,不是所有小數都可以精確表示,所以浮點型資料的比較只能近似比較,直接比較兩個浮點型==是沒有意義的,
浮點數的儲存 (IEEE 745)
我們以32位機器為例,同時還是取上文提到得9.5

(1)第一步,上文已經完成了9.5到2進制轉化得到1001.1
(2)任何一個浮點數都可以寫成(-1)^SM2*E(其中1≤M<2)
我們可以類比十進制中的科學計數法來理解此處得轉化方法
M就類似于十進制中的有效數字,而E就代表指數,只不過此處轉化為了2進制
(3)我們來決議上文中的S、E、M
S代表sign即符號位,S僅有一位,我們通過(-1)^S來表示正負
E代表exp即指數字,有8位,所以理論可代表的指數為0-255,但我們需要考慮到E可以取負數,所以E總是+127后存盤(例如E為3,則實際存盤為130,即表示為10000010;E為-3,則實際存盤為124,即表示為01111100)
M為Fraction即有效數字,23位,因為我們約定1≤M<2,所以M的整數位一定為1,我們無需存盤,只存其小數位即可
(4)故對于9.5 S為0,E為3,M為0011
對應二進制S 0
E 00000011
M 00110000000000000000000
綜合起來就是00000001100110000000000000000000
一個實體
int main()
{
int n = 9;
//
//0 00000000 00000000000000000001001
//(-1)^0 * 0.00000000000000000001001 * 2^-126
//
float *pFloat = (float *)&n;
printf("n的值為:%d\n", n);//9
printf("*pFloat的值為:%f\n", *pFloat);//0.000000
*pFloat = 9.0;
//1001.0
//(-1)^0 * 1.001*2^3
//S=0
//M=1.001
//E=3 +127
//01000001000100000000000000000000
//
printf("num的值為:%d\n", n);//直接列印整形時,就是2進制到十進制轉換
printf("*pFloat的值為:%f\n", *pFloat);//9.0
return 0;
}
運行結果

關于E的一些注意點
(1)當E存盤為00000000時,此時E實際值為-127,注意到2^-127是一個極小數,這時有效數字M不再補上1,我們認為它表示±0,或是無窮趨近于0的數字
(2)當E存盤為11111111時,此時E實際值為128,注意到2^128是一個極大數,如果此時有效數字M全為0,則認為它趨近于±∞
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255898.html
標籤:其他
