【问题标题】:How do you do a fractional (fixed-point) division of two Q31 numbers in C?你如何在 C 中对两个 Q31 数字进行小数(定点)除法?
【发布时间】:2019-05-12 16:43:32
【问题描述】:

我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。 我想计算 z = y/x,知道 abs(x)>abs(y)。因此,z

int32_t  x, y = ?? ;
int32_t  z = (int32_t)( ((int64_t)y<<32) / ((int32_t)x) );

但它不起作用。你能看出任何明显的错误吗?

【问题讨论】:

  • 哦,我刚刚发现Q号格式的解释和示例算法可以在wiki找到。
  • OK,所以通过更多的测试,我找到了故障点。这有效:十进制:1937302376 / 926491996 = 2054017417(十六进制:7378E368 / 3739 255C = 7A6D D189)。这不是:十进制:1805901494 / 1161997366 = -1531394255(十六进制:6BA3 DEB6 / 4542 AC36 = A4B8 C731)。所以我的错误是,由于 Q31 的范围,答案将 >=0.5 或
  • 实际上,更好的选择可能是将结果右移一位,然后再从 int64 转换回 int32。

标签: c fixed-point


【解决方案1】:

我的问题是这两个数字是 Q31,我想要一个 Q31 的答案,所以我实际上需要在我的部门中有一个 Q1.62 分子。我的代码有效地使用了 Q63 分子,并除以 Q31,最终得到的结果被限制在 [-0.5,0.5) 范围内,而不是 [-1,1) 范围内。

解决方案是位移 31 而不是 32,以获得 Q1.62 分子,现在我更多地考虑我在做什么,这更有意义。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2011-05-25
    • 2014-01-29
    • 2021-12-05
    • 2022-11-14
    相关资源
    最近更新 更多