我目前正试图找出如何在定点表示中乘以两个数字。
说我的号码表示如下:
[SIGN][2^0].[2^-1][2^-2]..[2^-14]
就我而言,号码为10.01000000000000 = -0.25
。
我如何做0.25x0.25
或-0.25x0.25
等?
希望你能帮忙!
答案 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,这会使计算更复杂。