c - 你如何在 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) );
但它不起作用。你能看到任何明显的错误吗?
解决方案
我的问题是这两个数字是 Q31,我想要一个 Q31 的答案,所以我实际上需要在我的部门中有一个 Q1.62 分子。我的代码有效地使用了 Q63 分子,并除以 Q31,最终得到的结果被限制在 [-0.5,0.5) 范围内,而不是 [-1,1) 范围内。
解决方案是位移 31 而不是 32,以获得 Q1.62 分子,现在我更多地考虑我在做什么,这更有意义。
推荐阅读
- r - 使用 dplyr::mutate_at 和不同长度的动态变量保留原始变量
- javascript - 使用包含异步等待的数组 foreach 等待
- javascript - 隐藏在主要内容下的导航栏下拉菜单
- python - 以相反的顺序迭代一个可交互的序列
- java - FlatFileItemReader 制表符分隔符不起作用
- html - 使用引导程序在图像上放置带有文本的框
- c# - 尝试自动填写表单,但无法使用 GeckoFX
- python - 检查最长的连续序列,其中前一个数字是当前数字的除数
- bootstrap-4 - 在移动设备上自动调整内容大小(引导程序)
- bash - 使用 wget 下载一个只有部分链接的 html 页面