定点实数算术运算全解析
在许多嵌入式应用中,对实数的需求往往较少,即便需要,定点实数相较于浮点数也更为常见。这主要是因为处理器可能缺乏浮点指令,带有浮点功能的处理器会增加成本,或者使用浮点数会带来不可接受的性能损失。下面我们将深入探讨定点实数的相关算术运算。
高效运算实现与任意常数除法
部分现代精简指令集计算机(RISC)微处理器,如 ARM 系列处理器芯片,具备对指令操作数进行预移位的能力,从而实现更高效的运算。例如,对于操作数 A,可按以下步骤操作:
1. 获取 A 左移 6 位的副本:$S 2^6 A$
2. 加上 A 左移 3 位的值:$S 2^6 A + 2^3 A$
3. 再加上 A 左移 1 位的值:$S 2^6 A + 2^3 A + 2^1 A$
当除数为常数但处理器没有除法指令时,若处理器有乘法指令,可利用倒数乘法原理进行除法运算。原理上,用乘以 $1/B$ 替代除以 B,即 $A \div B = A * (1/B)$ 。然而,当 $B > 1$ 时,$1/B$ 为 0。为解决此问题,使用 $2^k/B$ 代替 $1/B$ ,并将结果右移 $k$ 位(算术右移)来除以 $2^k$ ,即 $A * (1/B) = [A * (2^k/B)] \div 2^k = [A * (2^k/B)] >> k$ 。
由于乘法指令会产生双倍长度的乘积 P,其最高有效位和最低有效位会分别存于两个单长度存储位置 $P_{hi}$ 和 $P_{lo}$ 。若选择 $k$ 等于处理器的基本字长,无需将 P 右移 $k$ 位,直接从 $P_{hi}$ 获取商即可。
不过,倒数乘法可能会在商中引入
超级会员免费看
订阅专栏 解锁全文
549

被折叠的 条评论
为什么被折叠?



