【发布时间】: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