幾個定/浮點數相互轉換的例子

32位系統中,浮點數包括單精度浮點數float(一般情況下雙字節,64位系統中4字節)和雙精度浮點數double(一般情況下四個字節,64位系統中8字節);

浮點數的最高位是s位(符號位),1表示負號,0表示正號;

符號位後面緊跟着一定長度的(單精度情況下半個字節或一個字節)指數位,指數位的大小指定了小數點的位置;

剩餘的位置是尾數位,尾數位中存放小數點移動後的結果。

如浮點數:-11.0 寫成二進制之後是1(符號)1011,這樣爲了將這個結果11011存放到float中,需要先對11011進行預處理:

1】提取最高位中的1,存放進float的符號位;

2】計算規格化1011所需要左移的位數 = 3,然後將計算結果3轉成2進制(0011)放進float的指數位中

3】將1011規格化後剩餘的011放入尾數位

因此,-11.0存入四節的float中,實際上就是 1 ,0000 0011, 0110 0000 0000 0000 0000 000,取出時候對以上步驟進行逆向操作得到 -11.0。

 

 

定點數的來源有兩種,一種來源於整形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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章