如何在硬件中实现 IEEE 754 浮点减法?
how to implement IEEE 754 floating point subtraction in hardware?
我搜索了 google,但没有找到我正在寻找的答案。
假设这 2 个数字以 2 为基数:
A = 1.0001 * e-4
B = 1.001 * e-6
所以要减去这 2 个数字,我们需要将 2end 右移 2 位,以获得相同的指数。所以现在我们有:
A = 1.0001 * e-4
B = 0.001001 * e-4
现在我们的指数相同,我们应该对有效数字进行减法,这意味着:
1.000100
- 0.001001
----------
0.111011
然后我们对结果进行归一化和舍入处理。作为人类,我们知道如何处理这种减法,但是 HW 呢?它是否使用任何特殊算法来使 B
数字为负数(算法类似于 2 的补码,就像我们对整数所做的那样)?当我们想做 A+B
但 B
是负数时,这道题也有效。
how to implement IEEE 754 floating point subtraction in hardware?
明确一点:IEEE 754 没有规定硬件必须如何执行减法,只是规定了给定的 2 个输入和舍入模式结果必须是什么。 HW 是中间的一个黑框 miracle occurs。
HW 减法算法示例:
假设 N=8
位有效数,a b
相同符号(否则使用加法),|a| >= |b| > 0
(否则交换操作数)。位 x
为 0 或 1。
1.xxxxxxx e AA
- 1.xxxxxxx e BB
使用 N+2
宽寄存器。查找需要的班次 AA - BB
。移位将在 N+2
寄存器中留下一些 b
位,一些在 "right".
中
1.xxxxxxx_00 e AA
- 0.00001xx_xx xxx e AA
从xxx
移出,设一个"borrow bit c"是其中任何一个1?
c <-- Initial borrow bit
1.xxxxxxx_00
- 0.00001xx_xx
现在以通常的方式执行减法。
为了简化函数解释,考虑两种情况:没有初始 shift/shift,即使 HW 会使用单个公共路径。
// 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
。各种 rounding modes,如向上、向下、截断、向无穷大和流行的 "round to nearest with ties to even" 可以仅从符号 o
、r
和 C
中推导出来。当 r
和 C
为零时,结果是准确的。
o rs c
1.xxxxxxx_xx c
-->
1.xxxxxxx_x C
现在添加圆位R
。
1.xxxxxxx
0.000000R
这个总和可能会导致 10.0000000
。在这种情况下,结果右移并且指数递增。
hmmmmmm ... 就像这个问题一样,每个细节都需要准确,否则会失败...
抱歉,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
!!和acc。到上面的更正!!:
1.000100
- 0.010010
----------
0.110010
注册
b.
我搜索了 google,但没有找到我正在寻找的答案。
假设这 2 个数字以 2 为基数:
A = 1.0001 * e-4
B = 1.001 * e-6
所以要减去这 2 个数字,我们需要将 2end 右移 2 位,以获得相同的指数。所以现在我们有:
A = 1.0001 * e-4
B = 0.001001 * e-4
现在我们的指数相同,我们应该对有效数字进行减法,这意味着:
1.000100
- 0.001001
----------
0.111011
然后我们对结果进行归一化和舍入处理。作为人类,我们知道如何处理这种减法,但是 HW 呢?它是否使用任何特殊算法来使 B
数字为负数(算法类似于 2 的补码,就像我们对整数所做的那样)?当我们想做 A+B
但 B
是负数时,这道题也有效。
how to implement IEEE 754 floating point subtraction in hardware?
明确一点:IEEE 754 没有规定硬件必须如何执行减法,只是规定了给定的 2 个输入和舍入模式结果必须是什么。 HW 是中间的一个黑框 miracle occurs。
HW 减法算法示例:
假设 N=8
位有效数,a b
相同符号(否则使用加法),|a| >= |b| > 0
(否则交换操作数)。位 x
为 0 或 1。
1.xxxxxxx e AA
- 1.xxxxxxx e BB
使用 N+2
宽寄存器。查找需要的班次 AA - BB
。移位将在 N+2
寄存器中留下一些 b
位,一些在 "right".
1.xxxxxxx_00 e AA
- 0.00001xx_xx xxx e AA
从xxx
移出,设一个"borrow bit c"是其中任何一个1?
c <-- Initial borrow bit
1.xxxxxxx_00
- 0.00001xx_xx
现在以通常的方式执行减法。
为了简化函数解释,考虑两种情况:没有初始 shift/shift,即使 HW 会使用单个公共路径。
// 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
。各种 rounding modes,如向上、向下、截断、向无穷大和流行的 "round to nearest with ties to even" 可以仅从符号 o
、r
和 C
中推导出来。当 r
和 C
为零时,结果是准确的。
o rs c
1.xxxxxxx_xx c
-->
1.xxxxxxx_x C
现在添加圆位R
。
1.xxxxxxx
0.000000R
这个总和可能会导致 10.0000000
。在这种情况下,结果右移并且指数递增。
hmmmmmm ... 就像这个问题一样,每个细节都需要准确,否则会失败...
抱歉,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
!!和acc。到上面的更正!!:
1.000100
- 0.010010
----------
0.110010
注册
b.