首页 > 解决方案 > 如何用二进制补码固定点添加固定点?

问题描述

我想将无符号整数 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 点中遗漏的内容吗?

标签: mathtwos-complementfixed-point

解决方案


您的错误是您假设 2-complement 表示与字长无关。它不是。19660is 2^16 - 19660or的 16 位到 2 补码,45876但由于您使用的是 32 位数字,因此您需要相应的 2 补码,即2^32 - 19960or 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


推荐阅读