我想知道是否有人可以向我解释为什么&这段代码如何工作,将-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;
答案 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。