浮點數的儲存 (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)
+…由此可知,不是所有小數都可以精確表示,所以浮點型資料的比較只能近似比較,直接比較兩個浮點型==是沒有意義的。
我們以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()
執行結果
(1)當e儲存為00000000時,此時e實際值為-127,注意到2^-127是乙個極小數,這時有效數字m不再補上1,我們認為它表示±0,或是無窮趨近於0的數字
(2)當e儲存為11111111時,此時e實際值為128,注意到2^128是乙個極大數,如果此時有效數字m全為0,則認為它趨近於±∞
C語言浮點型儲存到記憶體
將乙個float型轉化為記憶體儲存格式的步驟為 將這個實數的絕對值轉化為二進位制,轉化方法如下 例如11.25表示為二進位制數先將整數部分轉為二進位制 11 2 5 餘1 5 2 2 餘1 2 2 1 餘0 1 2 餘1 0結束 11的二進位制表示為 從下往上 1011 小數部分轉化為二進位制 用小...
C語言整型,浮點型資料儲存的超詳細講解
我們都知道c語言有很多資料型別,如char int double 等等,本篇部落格我們來梳理分類一下這些資料型別,首先我們可以將資料型別分為兩類,整型和浮點型 也就是實型 兩大類,有些讀者可能就會疑惑了,char不是字元型別嗎?怎麼沒列出來呢,別著急先繼續往下閱讀,下面會給出解釋。整型包含 char...
C 浮點型變數的儲存方式
浮點型是c 定義的基本型別。型別float double和long double分別表示單精度浮點數 雙精度浮點數和擴充套件精度浮點數。在visual studio中,float型別用4個位元組表示,double和long double用8個位元組表示。預設的浮點字面值常量為double型別。在數值...