你如何乘以两个定点数?

时间:2012-12-23 03:16:55

标签: multiplication fixed-point

我目前正试图找出如何在定点表示中乘以两个数字。

说我的号码表示如下:

[SIGN][2^0].[2^-1][2^-2]..[2^-14]

就我而言,号码为10.01000000000000 = -0.25

我如何做0.25x0.25-0.25x0.25等?

希望你能帮忙!

3 个答案:

答案 0 :(得分:2)

乘以更大的变量,然后右移定点精度的位数。

答案 1 :(得分:0)

这是C中的一个简单示例:

int a =  0.25 * (1 << 16);
int b = -0.25 * (1 << 16);
int c = (a * b) >> 16;
printf("%.2f * %.2f = %.2f\n", a / 65536.0, b / 65536.0 , c / 65536.0);

您基本上将所有内容乘以一个常数,将小数部分加到整数范围内,然后将这两个因子相乘,然后(可选)除以一个常数,将产品返回到标准范围,以便在将来的计算中使用。这就像将以小数美元表示的价格乘以100然后以美分计算(即1.95美元* 100美分/美元= 195美分)。

小心不要溢出要乘以的变量的范围。您的常量可能需要更小以避免溢出,例如在上面的示例中使用1 << 8而不是1 << 16

答案 2 :(得分:0)

您应该使用2的补码表示而不是单独的符号位。在数学上做数学要容易得多,并且范围得到改善,因为你不需要浪费两倍于-0和0的代码。要相乘,只需做正常的定点无符号乘法。

2位可以表示值-2,-1,0,1。因此,使用Q2.14格式,-0.25将由11.11000000000000表示。使用1个符号位,您只能表示-1,0,1,这会使计算更复杂。