如何用二进制补码固定点添加固定点?
How to add fixed point with two's complement fixed point?
我想将无符号整数 5432 乘以 0.01,然后 add/subtract 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 点中遗漏的内容吗?
您的错误在于您假设 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
这是 [=20 的定点表示=]
我想将无符号整数 5432 乘以 0.01,然后 add/subtract 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 点中遗漏的内容吗?
您的错误在于您假设 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
这是 [=20 的定点表示=]