【发布时间】:2020-02-27 20:49:13
【问题描述】:
我正在尝试使用定点处理算法将两个 32Q16 数字相除。我的理解是,当我们将一个 32Q16 定点操作数除以另一个时,我们要求结果是一个 32Q16 数。因此,我们需要一个 64Q32 被除数,它是通过符号扩展原始 32Q16 被除数,然后左移 16 位创建的。然后用 64 位除数和 32 位除数进行除法,得到 32 位商。
我编写了这个 C 例程来计算商。除法适用于正数,但当我尝试除任何负数时,结果不正确。
我不确定 C 如何处理 64 位整数和 32 位整数之间的除法。谁能帮我理解我做错了什么?谢谢。
int32_t divide32Q16 (int32_t dividend, int32_t divisor)
{
int32_t quotient = ((int64_t) dividend << 16) / divisor;
return quotient;
}
当我尝试将 -32761 除以 10 时,预期结果应该是 -3276.1,但我从代码中得到的实际结果是 -3277.9
这是我用来显示数字的代码 sn-p:
void display32Q16 (int32_t num)
{
int16_t integer = num >> 16;
uint64_t fraction = ((0x0000FFFF & num) * 10000) >> 16;
printf("Number = %d.%" PRIu64 "\n", integer, fraction);
}
【问题讨论】:
-
商如何解释或输出为-3277.9?
-
这个bug在你的显示函数中。
-
@IanAbbott 感谢您帮助我。我添加了用于显示数字的代码 sn-p。显示功能适用于其他算术运算符。你能帮我找出错误吗?
-
printf ("Number = %.5f\n", num / 65536.0); -
@njuffa 是的,解决了它。谢谢 :D 能否请您简要解释一下或提示我在原始代码中做错了什么?
标签: c bit-shift fixed-point