为什么&这是怎样的" double"到" 14位Int"代码工作?

时间:2017-08-30 17:22:35

标签: floating-point bit-manipulation bitwise-operators

我想知道是否有人可以向我解释为什么&这段代码如何工作,将-1.0和+1.0之间的双精度转换为14位整数。

如何在数据14中选择值,以及幕后发生了什么?

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 个答案:

答案 0 :(得分: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的发生概率比[0]少两倍。 1,16382]。

可能需要,否则有必要乘以16384的浮点前导并避免添加+0.5。