2017-08-30 9 views
-1

私はなぜこのコードが動作するのか、-1.0と+1.0の間の倍精度を14ビットの整数に変換するために、なぜ&の理由を説明してもらえますか?なぜ& "14ビットInt"コードに "double"が作用するのですか?

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

ビットシフトとビットマスキングについて理解していますか?そうでない場合は、最初にそれらを学び、次にこれに戻ってください。今、いいですか? 10進の16383が16進数の0x3FFF、つまり11111111111111のバイナリ、つまり14の連続ビットであることを覚えておけば、このコードを理解するのに役立ちます。デバッガを使って、 'data14'の任意の与えられた値の生のバイトを見て、' data14'がなぜそれが設定されるのかを理解するための数学をします(例えば、 '0.5' - > '12287'、別名' 0x2FF')、なぜビットシフトが行われたのかを紙に書いています。 –

+1

助けがあれば: '-1.0'は' 0'になり、 '1.0'は' 16383'( '0x3FFF'、つまり14ビット)になります。このコードは浮動小数点値を '-1.0..1.0'から' 0..16383'までの10進数値に変換しています。 –

+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] 

なお、確率の密度、データの均一な分布の用語でin [-1、1]は[0,16383]に偏った分布を与える - 極値0と16383は、[1,16382]よりも2倍少ない発生確率を持つ。

それ以外の場合は、16384の浮動小数点前任者を掛けて+0.5を追加する必要があります。

+1

私は、この変換で実際に丸めが望ましいので、終点に対してバイアスをかけることのより良い代替策は、「0.5」の後に*締め付けを遅らせることであろうと考えます。 – njuffa