我搜索了谷歌,没有运气找到我要找的答案。

想象一下以基数2表示的这两个数字:

A = 1.0001 * e-4
B = 1.001 * e-6

因此,要减去这两个数字,我们需要将2end右移2位,以具有相同的指数。现在我们有了:
A = 1.0001 * e-4
B = 0.001001 * e-4

现在我们的指数相同,我们应该对有效位数进行减法,这意味着:
  1.000100
- 0.001001
----------
  0.111011

然后,我们对结果进行归一化和舍入处理。作为人类,我们知道如何处理这种减法,但是硬件又如何呢?它是否使用任何特殊的算法来使B数字为负(就像我们对Integer所做的那样,算法像2的补码一样)?当我们要执行A+BB为负数时,此问题也有效。

最佳答案

如何在硬件中实现IEEE 754浮点减法?

需要明确的是:IEEE 754并没有规定硬件必须如何执行减法运算,只是规定了给定的2个输入和舍入模式必须得出的结果。硬件是中间的黑匣子,其中miracle occurs

样本硬件减法算法:

假设N=8位有效,a b(其他使用加法)和|a| >= |b| > 0(其他交换操作数)的符号相同。 x位为0或1。

  1.xxxxxxx e AA
- 1.xxxxxxx e BB

使用N+2宽寄存器。查找所需的班次AA - BB。移位将把b寄存器中的某些N+2位保留下来,而另一些保留到“右”。
  1.xxxxxxx_00     e AA
- 0.00001xx_xx xxx e AA

从移出的xxx中,将“借位c”设置为1。
             c <-- Initial borrow bit
  1.xxxxxxx_00
- 0.00001xx_xx

现在以通常的方式执行减法。

为了简化功能说明,请考虑2种情况:无初始移位/移位,即使硬件将使用单个 public 路径也是如此。
  // Result with no shift.  Initial borrow bit 'c' is then zero.
  0.1111111_00 Max value
  0.0000000_00 Min-value  (a == b)

结果左移,指数递减,直到前导位为1。减法是精确的。零结果被专门处理(未显示)。

在情况2中,随着移位,“c”为0或1。
  // Result with shift
  1.1111110_11 Max value.
  0.1111111_1x Lowest-values.

如果前导位为0,则结果左移,指数递减。是最低值的子情况要求N+2而不是N+1寄存器来使舍入(以下)正确。

现在发生舍入。首先,对sc位进行“或”运算(是一个?)以形成新的C。仅通过符号,orC可以推断出各种rounding modes,例如向上,向下,截断,向无穷大以及流行的“到最近的,具有偶数的关系”。当rC为零时,结果是准确的。
          o rs c
  1.xxxxxxx_xx c
  -->
  1.xxxxxxx_x  C

现在添加舍入R
  1.xxxxxxx
  0.000000R

此总和可能会导致10.0000000。在这种情况下,结果将右移,指数递增。

关于floating-point - 如何在硬件中实现IEEE 754浮点减法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47407662/

10-11 00:07