Math 如何用两个';s补不动点?

Math 如何用两个';s补不动点?,math,twos-complement,fixed-point,Math,Twos Complement,Fixed Point,我想用无符号整数5432乘以0.01,然后加/减0.3。我想使用定点算法,而不是使用浮点数。以下是我的步骤: 1) ((1)固定点Q0.16 2) 655*5432=3557960=>固定点Q16.16 3) ((1)固定点Q0.16 4) 添加0.3:3557960+19660=3577620=>转换为浮点=54.59,这与使用浮点计算非常相似:5432*0.01+0.3=54.62 5) 减去0.3:找到两个的补码19660=>45876,现在3577620+45876=3623496=>5

我想用无符号整数5432乘以0.01,然后加/减0.3。我想使用定点算法,而不是使用浮点数。以下是我的步骤:

1) ((1)固定点Q0.16

2) 655*5432=3557960=>固定点Q16.16

3) ((1)固定点Q0.16

4) 添加0.3:3557960+19660=3577620=>转换为浮点=54.59,这与使用浮点计算非常相似:5432*0.01+0.3=54.62

5) 减去0.3:找到两个的补码19660=>45876,现在3577620+45876=3623496=>55.29,这不是预期的5432*0.01-0.3=54.02


有人能证明我在第1-4点是正确的吗?我在第5点中遗漏了什么?

你的错误是你假设2-补码表示独立于单词大小。事实并非如此。
19660
的16位到2位补码是
2^16-19660
45876
,但由于您使用的是32位数字,因此需要相应的2位补码,即
2^32-19960
42947636
。换句话说,当您将2-补码从16位扩展到32位时,您应该用符号位填充顶部字节,即
1
表示负值。您可以看到,在这种扩展下,二进制中的两个值实际上是相同的:

45876      =                   10110011_00110100 (16-bit binary)
4294947636 = 11111111_11111111_10110011_00110100 (32-bit binary)

如果您添加
3557960+4294947636
,您将得到
4298505596
,或者如果您将其截断回32位值-
3538300
,这是
53,99

的定点表示,您的错误在于您假设2补码表示与字长无关。事实并非如此。
19660
的16位到2位补码是
2^16-19660
45876
,但由于您使用的是32位数字,因此需要相应的2位补码,即
2^32-19960
42947636
。换句话说,当您将2-补码从16位扩展到32位时,您应该用符号位填充顶部字节,即
1
表示负值。您可以看到,在这种扩展下,二进制中的两个值实际上是相同的:

45876      =                   10110011_00110100 (16-bit binary)
4294947636 = 11111111_11111111_10110011_00110100 (32-bit binary)

如果您添加
3557960+4294947636
,您将得到
4298505596
,或者如果您将其截断回32位值-
3538300
,这是
53,99
的定点表示,太棒了!这很有道理,太好了!这是有道理的。