C語言資料儲存-浮點型
阿新 • • 發佈:2021-02-16
技術標籤:C學習
C語言資料儲存-浮點型
浮點型
浮點型的種類和表示範圍
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)
那我們來觀察一下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進位制
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,則認為它趨近於±∞