Floating point 为什么?;这是怎么回事;“双”字;至;14位整数“;代码工作?
我想知道是否有人能向我解释一下这段代码的工作原理,将-1.0和+1.0之间的双精度转换成14位整数 数据14中的值是如何选择的,以及幕后发生了什么Floating point 为什么?;这是怎么回事;“双”字;至;14位整数“;代码工作?,floating-point,bit-manipulation,bitwise-operators,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 >
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.5;
如果(数据<-1.0){
数据=-1.0;
}否则如果(数据>1.0){
数据=1.0;
}
int数据14=(int)(数据+1.0)/2.0*16383+0.5);
字节上限7=数据14>>7;
字节下限7=数据14&0x7f;
如果您能解析正确的操作顺序,以下是按数据间隔排列的序列结果
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的发生概率是[116382]的两倍
也许这是需要的,否则就必须乘以16384的浮点前置,并避免加+0.5。您知道什么是位移位和位屏蔽吗?如果没有,先学习这些,然后再回到这里。好了,现在好了吗?如果您记住十进制16383是十六进制0x3FFF,即二进制11111111,即14个连续位,那么理解这段代码可能会有所帮助。使用调试器查看
data14
的原始字节,查找data
的任何给定值,进行数学运算,了解data14
以这种方式设置的原因(例如,0.5
->12287
aka0x2FF
),并在纸上找出位移位的原因。如果有帮助:-1.0
变成0
,1.0
变成16383
(0x3FFF
,即最大14位)。代码正在将-1.0..1.0
之间的浮点值转换为0..16383
之间的十进制值。将1添加到数据,将14位(0x3FFF)乘以2,然后再添加0.5,背后的原因是什么?它不是将0x3FF乘以2。它是将数据除以2,然后将结果乘以0x3FF。我认为+1.0和+0.5是为了处理舍入问题。我认为解决端点偏差的更好选择是延迟夹紧,直到添加0.5
,因为舍入在这种转换中实际上是可取的。