首页 > 解决方案 > 你如何在 C 中对两个 Q31 数字进行小数(定点)除法?

问题描述

我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。我想计算 z = y/x,知道 abs(x)>abs(y)。因此,z<1,因此它可以表示为另一个 Q31/int32。所以我想我需要将 Y 左移 32 位,并将其转换为 int64。然后我应该能够除以 int32 (强制转换不是必需的,但为了清楚起见)并转换回 int32:

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

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

标签: cfixed-point

解决方案


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

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


推荐阅读