math - 如何用二进制补码固定点添加固定点?
问题描述
我想将无符号整数 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 点中遗漏的内容吗?
解决方案
您的错误是您假设 2-complement 表示与字长无关。它不是。19660
is 2^16 - 19660
or的 16 位到 2 补码,45876
但由于您使用的是 32 位数字,因此您需要相应的 2 补码,即2^32 - 19960
or 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
推荐阅读
- powershell - Unity.exe 命令行构建需要 10 分钟,但编辑器需要不到一分钟
- c - 在制表符分隔的文本文件中使用 fscanf 计算空值
- python - Python Webcolors - 没有定义的颜色名称
- javascript - 使用下一个和上一个按钮自动和手动更改幻灯片
- javascript - Mongoose 在文档更新时不尊重参考架构定义
- blazor - 核心身份种子用户 HashPassword 登录失败
- vue.js - 基本 vue.js 上的 dist 文件夹
- pandas - Pandas - 从 Skewness 和 Kurtois 打印到一个 df
- python - 寻找不同形状的 Numpy 数组之间的差异?
- c++ - Boost 库和应用程序中的不同 C++ 重命名名称