我搜索了谷歌,没有运气找到我要找的答案。
想象一下以基数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+B
但B
为负数时,此问题也有效。 最佳答案
如何在硬件中实现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
寄存器来使舍入(以下)正确。现在发生舍入。首先,对
s
和c
位进行“或”运算(是一个?)以形成新的C
。仅通过符号,o
,r
和C
可以推断出各种rounding modes,例如向上,向下,截断,向无穷大以及流行的“到最近的,具有偶数的关系”。当r
和C
为零时,结果是准确的。 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/