【发布时间】:2020-07-21 12:08:15
【问题描述】:
我的问题是关于如何将整数或浮点数转换为 S16.16 格式。
我正在阅读一些代码,说将整数或浮点数转换为 S16.16 格式可以通过乘以 2^16 来对齐零点。
这是正确的吗?有人可以解释一下它是如何工作的吗?
【问题讨论】:
标签: integer fixed-point
我的问题是关于如何将整数或浮点数转换为 S16.16 格式。
我正在阅读一些代码,说将整数或浮点数转换为 S16.16 格式可以通过乘以 2^16 来对齐零点。
这是正确的吗?有人可以解释一下它是如何工作的吗?
【问题讨论】:
标签: integer fixed-point
S16.16 中的“.16”表示最低 16 位实际上在小数点之后。例如:(有趣的≘符号表示“对应”)
0x00010000 ≘ 1.0
^^^^
the whole number part
0x00028000 ≘ 2.5
0x0003C000 ≘ 3.75
^^^^
the part after the radix point
或者换句话说,原始值的解释方式为: value = raw / 216
为了将正常值转换为该格式,我们需要乘以 216(这会与隐式除法相抵消)。
例子:
1 << 16 = 0x00010000 ≘ 1.0
int(3.75 * pow(2.0, 16)) = int(245760.0) = 0x0003C000 ≘ 3.75
【讨论】: