我搜索了谷歌,没有运气找到我正在寻找的答案。
想象一下基数2中的这2个数字:
A = 1.0001 * e-4
B = 1.001 * e-6
因此,为了减去这两个数字,我们需要将2端向右移2位,以获得相同的指数。所以现在我们有:
A = 1.0001 * e-4
B = 0.001001 * e-4
现在我们的指数是相同的,我们应该对有效数字进行减法,这意味着:
1.000100
- 0.001001
----------
0.111011
然后我们对结果进行归一化和舍入处理。作为一个人,我们知道如何处理这个减法,但是硬件呢?它是否使用任何特殊的算法来使B
数字为负(算法像2' s补码就像我们对整数的做法一样)?如果我们想要A+B
但B
为负数,则此问题也有效。
答案 0 :(得分:2)
如何在硬件中实现IEEE 754浮点减法?
要明确:IEEE 754没有规定HW必须如何执行减法,只有给定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
。移位会在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种情况:没有初始移位/移位,即使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.减法为 exact 。专门处理零结果(未示出)。
在情况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喜欢向上,向下,截断,向无穷大和流行的“圆到最近与偶数相关”可以仅从符号o
,r
和{{1 }}。 <{1}}和C
为零时,结果是准确的。
r
现在添加圆形位C
。
o rs c
1.xxxxxxx_xx c
-->
1.xxxxxxx_x C
此总和可能会导致R
。在这种情况下,结果向右移动,指数递增。
答案 1 :(得分: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
!!和acc。对上面的更正!!:
1.000100
- 0.010010
----------
0.110010
注册
b.