2017-08-30 49 views
-1

我想知道是否有人可以請我解釋爲什麼&該代碼的工作原理,將-1.0和+1.0之間的雙精度轉換爲14位整數。爲什麼&這個「double」到「14-bit Int」代碼是如何工作的?

data14中的值如何選擇,以及幕後發生了什麼?

double data = 0.5; 

if (data < -1.0) { 
    data = -1.0; 
} else if (data > 1.0) { 
    data = 1.0; 
} 

int data14 = (int)((data+1.0)/2.0*16383 + 0.5); 

BYTE upper7 = data14 >> 7; 
BYTE lower7 = data14 & 0x7f; 
+1

你知道位移和位掩碼是什麼嗎?如果不是,先學習,然後回到這個。好,現在好嗎?如果記住十進制16383是十六進制0x3FFF,這是二進制11111111111111,即14個連續位,則可能有助於理解此代碼。它也有助於使用你的調試器查看'data14'的任何給定值的'data'的原始字節,做數學來理解爲什麼'data14'被設置爲它的方式(例如,'0.5' - >' '12287'又名'0x2FF'),並在紙上寫出爲什麼按照原樣完成位移的原因。 –

+1

如果有幫助:'-1.0'變爲'0','1.0'變成'16383'('0x3FFF',即最大14位)。該代碼將'-1.0..1.0'之間的浮點值轉換爲'0..16383'之間的十進制值。 –

+0

將數據加1後的原因是什麼,將14位(0x3FFF)乘以2,然後加0.5? – Nop

回答

1

如果可以解析正確的操作順序,這裏是序列的數據區間的長期結果

input data    -> (-inf,inf) 
if(...) else if() ... -> [-1 , 1] 
data+1     -> [0 , 2] 
/2      -> [0 , 1] 
*16383     -> [0 , 16383] 
+0.5     -> [0.5 , 16383.5] 
int()     -> [0 , 16383] 

注意,在概率密度,數據的均勻分佈的期限在[-1,1]中將給出[0,16383]中的有偏分佈 - 極值0和16383具有比[1,16382]少兩倍的出現概率。

也許這是需要的,否則就需要乘以16384的浮點前驅,並避免加上+0.5。

+1

我認爲一個更好的選擇來解決對端點的偏置會延遲鉗位,直到*添加0.5後,因爲舍入在這個轉換中實際上是可取的。 – njuffa

相關問題