double和float都屬於浮點型,double是雙精度浮點型,8字節,16位有效位;float是單精度浮點型,4字節,7位有效位。spa
一. 基本原則blog
1. 存儲方式遵循IEEE規範(科學計數法,表示方式爲1.xxx * m^n),float是IEEE R32.24(float4字節,32位,其中8位是階碼位) ,double是R64.53(double8字節,64位,其中11位是階碼位)內存
2. 階碼:用於存儲科學計數法中的指數數據,而且採用移位存儲源碼
float最高位1位爲符號位,接下來8位是階碼位,剩餘23位爲尾數位循環
double最高位1位爲符號位,接下來11位是階碼位,剩餘52位爲尾數位二進制
3. 尾數位:採用科學計數法表示,整數部分只能有一個1,不保存到尾數位中float
二. 須要提早知道im
1. 移位存儲數據
階碼位採用移位存儲,用以表示指數,將移位存儲的二進制成爲移碼(還真是各類碼:源碼 反碼 補碼 移碼)img
移碼是指數加上127後的值(即偏移量爲127),即127至關於0,小於127爲負,大於127爲正,這裏的127是將階碼位轉爲十進制以後相比較的值,好比float類型的階碼位存儲了0111 1110,轉爲十進制爲126,126 - 127 = -1,即指數爲-1,2^(-1)
2. 十進制小數轉爲二進制小數
二進制和十進制同樣,也有小數,與整數位以「.」隔開,以「.」爲分界點,左側的爲整數部分,計算方式爲2^n(n爲整數),右側爲小數部分,計算方式爲2^(-n) (n爲整數),2^(-1) = 1 / 2^1 = 0.5, 2^(-2) = 1 / 2^2 = 0.25, 2^(-3) = 1 / 2^3 = 0.125
三. float舉例說明
1. float tmp = 1.5; 整數部分爲1,小數部分爲0.5 = 2^(-1),即十進制1.5對應二進制1.1,轉換爲科學計數表示方式爲1.1 * 2^0,即指數爲0,則階碼位爲127,在內存中存儲爲
十進制1.5對應二進制1.1,由於科學計數法整數部分只有一位且爲1,因此不保存整數部分的1,我以爲這也是爲何第三部分叫「尾數位」的緣由
2. float tmp = 0.2; 按照上一步的計算會發現二進制小數部分會無限循環,由於尾數位有長度限制,就會產生精度丟失