我想将无符号整数5432乘以0.01,然后加/减0.3。除了使用浮点数,我还想使用定点算法。这是我的步骤:
1)((1 << 16)* 0.01)= 655 =>定点Q0.16
2)655 * 5432 = 3557960 =>定点Q16.16
3)((1 << 16)* 0.3)= 19660 =>定点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点中所缺少的吗?
答案 0 :(得分:2)
您的错误是您假设2补码表示形式与字长无关。它不是。 19660
的16位2补码是2^16 - 19660
或45876
,但是由于您使用的是32位数字,因此需要一个对应的2补码2^32 - 19960
或4294947636
。换句话说,当您将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
的定点表示形式