Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 为什么?;这是怎么回事;“双”字;至;14位整数“;代码工作?_Floating Point_Bit Manipulation_Bitwise Operators - Fatal编程技术网

Floating point 为什么?;这是怎么回事;“双”字;至;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 >

我想知道是否有人能向我解释一下这段代码的工作原理,将-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.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
aka
0x2FF
),并在纸上找出位移位的原因。如果有帮助:
-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
,因为舍入在这种转换中实际上是可取的。