如何将两个定点数相乘?

fou*_*oor 4 fixed-point multiplication

我目前正在尝试弄清楚如何以定点表示形式将两个数字相乘。

假设我的数字表示如下:

[SIGN][2^0].[2^-1][2^-2]..[2^-14]
Run Code Online (Sandbox Code Playgroud)

就我而言,数字10.01000000000000 = -0.25.

例如我会怎么做0.25x0.25等等-0.25x0.25

希望您能帮忙!

phu*_*clv 5

您应该使用 2 的补码表示形式而不是单独的符号位。对此进行数学计算要容易得多,不需要特殊处理。范围也得到了改善,因为负 0 没有浪费的位模式。要进行乘法,只需按照正常的定点乘法进行即可。正常的 Q2.14 格式将存储值 x/2 14作为 x 的位模式,因此如果我们有 A 和 B 那么

\frac{A}{2^{14}}\times\frac{B}{2^{14}} = \frac{A \times B}{2^{14}}\times \frac{1}{ 2^{14}}

因此,您只需将 A 和 B 直接相乘,然后将乘积除以 2 14即可将结果返回到 x/2 14的形式,如下所示

AxB = ((int32_t)A*B) >> 14;
Run Code Online (Sandbox Code Playgroud)

需要舍入步骤才能获得最接近的值。你可以在Q数字格式#数学运算中找到方法。舍入到最接近的最简单方法就是添加回最后移出的位(即第一个小数位),如下所示

AxB = (int32_t)A*B;
AxB = (AxB >> 14) + ((AxB >> 13) & 1);
Run Code Online (Sandbox Code Playgroud)

您可能还想阅读这些

用 2 位可以表示 [-2, 1] 的整数范围。因此,使用 Q2.14 格式,-0.25 将存储为11.11000000000000. 使用 1 个符号位只能表示 -1、0、1,这会使计算更加复杂,因为您需要拆分符号位,然后在最后将其组合回来。