32位系統中,浮點數包括單精度浮點數float(通常狀況下雙字節,64位系統中4字節)和雙精度浮點數double(通常狀況下四個字節,64位系統中8字節);code
浮點數的最高位是s位(符號位),1表示負號,0表示正號;class
符號位後面緊跟着必定長度的(單精度狀況下半個字節或一個字節)指數位,指數位的大小指定了小數點的位置;亂碼
剩餘的位置是尾數位,尾數位中存放小數點移動後的結果。二進制
如浮點數:-11.0 寫成二進制以後是1(符號)1011,這樣爲了將這個結果11011存放到float中,須要先對11011進行預處理:float
1】提取最高位中的1,存放進float的符號位;數據
2】計算規格化1011所須要左移的位數 = 3,而後將計算結果3轉成2進制(0011)放進float的指數位中移動
3】將1011規格化後剩餘的011放入尾數位di
所以,-11.0存入四節的float中,實際上就是 1 ,0000 0011, 0110 0000 0000 0000 0000 000,取出時候對以上步驟進行逆向操做獲得 -11.0。co
定點數的來源有兩種,一種來源於整形int的的轉換;一種來源於浮點(float & double)的轉換。浮點數
int型數據轉成定點數的時候,能夠經過數據左移實現:
例子:int 8,轉成Q5定點數
1】8的二進制表示111
2】轉成Q5定點數,只須要讓111左移5位,111<<5,即0000 0000 0000 0000 0000 0000 1110 0000;
浮點數轉成定點數時候不能直接左移,由於浮點數的存儲結構不想整形的存儲結構那樣單一,浮點數的每一部分都有着不一樣的涵義,移動就打亂了數據原有的存儲結構,產生亂碼,所以浮點轉定點仍是須要進行乘法計算:
例子:浮點數0.5表示成Q5定點數
1】計算 floor(0.5*2^5) = 16
2】轉成2進制 0000 0000 0000 0000 0000 0001 0000
例子:定點數16轉浮點數
1】讀取二進制數 16
2】逆向計算 16*2^-5 = 0.5
定點數定標以及表示範圍
Q表示 S表示 十進制數表示範圍 Q15 S0.15 -1≤x≤0.9999695 Q14 S1.14 -2≤x≤1.9999390 Q13 S2.13 -4≤x≤3.9998779 Q12 S3.12 -8≤x≤7.9997559 Q11 S4.11 -16≤x≤15.9995117 Q10 S5.10 -32≤x≤31.9990234 Q9 S6.9 -64≤x≤63.9980469 Q8 S7.8 -128≤x≤127.9960938 Q7 S8.7 -256≤x≤255.9921875 Q6 S9.6 -512≤x≤511.9804375 Q5 S10.5 -1024≤x≤1023.96875 Q4 S11.4 -2048≤x≤2047.9375 Q3 S12.3 -4096≤x≤4095.875 Q2 S13.2 -8192≤x≤8191.75 Q1 S14.1 -16384≤x≤16383.5 Q0 S15.0 -32768≤x≤32767