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?
希望您能帮忙!
您应该使用 2 的补码表示形式而不是单独的符号位。对此进行数学计算要容易得多,不需要特殊处理。范围也得到了改善,因为负 0 没有浪费的位模式。要进行乘法,只需按照正常的定点乘法进行即可。正常的 Q2.14 格式将存储值 x/2 14作为 x 的位模式,因此如果我们有 A 和 B 那么
因此,您只需将 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,这会使计算更加复杂,因为您需要拆分符号位,然后在最后将其组合回来。