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

3
我搜遍了 Google,可惜没有找到我所寻找的答案。
想象一下这两个二进制数:
A = 1.0001 * e-4
B = 1.001 * e-6

所以要减去这两个数字,我们需要将第二个数字向右移动2位,以使指数相同。现在我们有:
A = 1.0001 * e-4
B = 0.001001 * e-4

现在我们的指数相同,我们应该对尾数进行减法运算,也就是说:
  1.000100
- 0.001001
----------
  0.111011

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

如果你知道如何在软件中实现,你可能能够将其转化为硬件。但请注意,这并不是一件简单的事情。即使在软件中,正确地完成这个任务也非常复杂,更不用说在硬件中了。 - Rudy Velthuis
不,问题不在于硬件或软件,而在于如何实现它。但是我使用了“HW”一词来强调我不是在谈论一个CC++程序!我正在谈论从头开始使用像XORANDNOT等逻辑的实现... - manili
这并不是微不足道的,但在软件(机器码)中是可以完成的,即使你排除像 DIVMUL 这样的指令。已经有现有的库,请查看它们。 - Rudy Velthuis
2个回答

2
如何在硬件中实现IEEE 754浮点数减法?
需要明确的是:IEEE 754并没有规定硬件必须如何执行减法,只是指定了给定两个输入和舍入模式后结果应该是什么。硬件是一个黑盒子,在其中进行奇迹般的计算。
样例作业减法算法:
假设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

现在按照通常的方式执行减法。
为了简化函数的解释,考虑两种情况:没有初始移位/有移位,尽管硬件会使用一个单一的公共路径。
  // Result with no shift.  Initial borrow bit 'c' is then zero.
  0.1111111_00 Max value
  0.0000000_00 Min-value  (a == b)

结果向左移动,指数减少,直到首位为1。减法是精确的。零结果被特殊处理(未显示)。
在第二种情况下,通过移位,'c' 的值为0或1。
  // Result with shift
  1.1111110_11 Max value.
  0.1111111_1x Lowest-values. 

如果首位是0,则结果左移并将指数减1。最小值的子情况需要使用N+2寄存器而不是N+1寄存器来得到正确的舍入(如下所示)。
现在进行四舍五入。首先将sc位进行或运算(是其中任意一个吗?)以形成新的C。可以仅从符号,orC推断出各种取整模式,例如向上、向下、截断、朝正无穷大取整和流行的“四舍五入到最近的偶数”等。当rC都为零时,结果是精确的。
          o rs c
  1.xxxxxxx_xx c
  -->
  1.xxxxxxx_x  C

现在加上圆形部分 R
  1.xxxxxxx
  0.000000R

这个总和可能会得出 10.0000000。在这种情况下,结果会向右移动并且指数会增加。

谢谢您的回复,但我仍然不明白您是如何进行减法步骤的。您是否使用了类似于二进制补码的算法来生成负数,然后再进行加法运算?这正是我无法理解的问题所在。非常感谢。 - manili
2
@MA 使用 a-b,FP 使用符号大小,因此通过改变1位即可轻松更改值的符号。如果操作数的符号不匹配,则取反 b 并调用加法例程/硬件。如果操作数为 a < b,则执行 -(b - a)。然后,二进制减法就像小学减法一样。HW减法的核心部分是无符号的,没有涉及到2的补码。 - chux - Reinstate Monica

0

嗯嗯嗯嗯......就像这个问题一样,每一个细节都需要准确无误,否则它会失败......

抱歉,对于LF和引用的格式有困难... :-(

Imagine these 2 numbers in base 2:
A = 1.0001 * e-4 
B = 1.001 * e-6
So to subtract these 2 numbers we need to shift the 2end one 2 bits right, 
to have the same exponents. So now we have:

!! 2 位元 !!

A = 1.0001 * e-4
B = 0.001001 * e-4

应该是!!而不是!!:

B = 0.01001 * e-4

Now our exponents are the same and we should do subtraction for 
significands, which means:

  1.000100
- 0.001001
----------
  0.111011

根据上述更正:

  1.000100
- 0.010010
----------
  0.110010

注册。

版权。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接