1. 程式人生 > 其它 >C語言資料儲存-浮點型

C語言資料儲存-浮點型

技術標籤: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)

第二位代表 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,則認為它趨近於±∞