【问题标题】:efficient way to compute the overflow bits after multiplication乘法后计算溢出位的有效方法
【发布时间】:2022-01-01 02:44:16
【问题描述】:

这是一个关于算法的概念性问题,与我个人解决的问题有关。

在现实生活中的 CPU 架构中,乘法后将溢出位存储在某个寄存器中是很常见的,但如果此功能不可用怎么办?有没有一种有效的方法来计算溢出位?

因为它是一个 溢出 a * b >> bits 不是一个选项。

【问题讨论】:

  • 看看归一化(“浮点”)乘法:如果接受明显的不准确性,您可以用几乎一半的不可避免的计算来换取精确的结果。 (当天在Motorola 68000 上进行了“23 位 ± 5 LSB 相乘”。)
  • "任何有用的 CPU 架构在乘法后将溢出位存储在某个寄存器中。"这是一个比较强烈的说法。有许多有用的 CPU 架构没有 N x N -> 2N 乘法。例如 PowerPC、Alpha AXP、AArch64。还是说Power Mac和你的安卓手机没用?
  • @RaymondChen 我更改了我的声明以防我遗漏了什么,但是 RISC 风格的 CPU 没有单独的指令来计算溢出位吗?
  • @xiver77 是的,但是没有“乘以并给我结果和溢出”,这是您的文字所暗示的。您可以保留结果并丢弃溢出,或者保留溢出并丢弃结果。目前尚不清楚哪个处理器(如果有的话)将指令融合为一个乘法。
  • (另见:high bits of product? 和链接/相关。)

标签: algorithm optimization


【解决方案1】:

我可以想象两种基本选择。

  1. 旧 CPU 根本不支持乘法。我们必须手动完成。您始终可以通过加法和移位来实现乘法。该算法非常简单,并且不限于任意位数(因为在所有 CPU 上的任意位数上加法和移位都很容易进行)。

  2. 如果您的 CPU 可以在 N 位中进行乘法运算而不会溢出,您可以将其用作帮助器,以比上面提到的逐位计算更快地获得结果。如果 a 和 b 都是 N 位宽,那么 a * b 的结果是 2N 宽。如果将 a 和 b 分成两半,那么每一半都是 N/2 宽,它们的乘积是 N 位宽。因此,您将两半相乘,然后将它们相加。如果我们标记上半部a2/b2和下半部a1/b1,那么下半部结果是a1 * b1,中部结果是a2 * b1 + a1 * b2,上半部结果是a2 * b2,每次加上溢出。我希望它足够琐碎,所以不需要详细描述。

【讨论】:

  • 所以假设两个 32 位数字,这就是您要解释的内容,对吗? a * b = (a2 * 2^16 + a1) * (b2 * 2^16 + b1) = a2 * b2 * 2^32 + (a2 * b1 + a1 * b2) * 2^16 + a1 * b1。你的回答有帮助!
猜你喜欢
  • 2014-09-23
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2021-07-17
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多