我搜索了谷歌,没有运气找到了我正在寻找的答案。
假设这两个数字在基数2中:
A = 1.0001 * e-4
B = 1.001 * e-6因此,要减去这两个数字,我们需要将2end 1,2位右移,才能得到相同的指数。所以现在我们有:
A = 1.0001 * e-4
B = 0.001001 * e-4现在我们的指数是相同的,我们应该对有意义的值做减法,这意味着:
1.000100
- 0.001001
----------
0.111011然后对结果进行归一化和舍入处理。作为一个人类,我们知道如何处理减法,但是HW呢?它使用什么特殊的算法来负B数(算法类似于2的补码,就像我们对整数所做的那样)?当我们想要做A+B时,这个问题也是有效的,但是B是一个负数。
发布于 2017-11-21 18:54:09
如何在硬件上实现IEEE 754浮点减法?
需要明确的是: IEEE 754并没有规定HW必须如何执行减法,只要求给定两个输入和舍入模式,结果必须是什么。HW是中间的一个黑匣子,其中有一个奇迹发生。
样本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”是其中的任何一个吗?
c <-- Initial borrow bit
1.xxxxxxx_00
- 0.00001xx_xx现在以通常的方式执行减法。
为了简化函数解释,考虑两种情况:没有初始移位/移位,即使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位是或“‘ed”的(其中一个是?)以形成新的C。各种舍入模式,如向上、向下、截断、向无穷远,以及流行的“圆到最近与偶数的关系”,完全可以从符号、o、r和C中推导出来。当r和C为零时,结果是准确的。
o rs c
1.xxxxxxx_xx c
-->
1.xxxxxxx_x C现在添加圆位R。
1.xxxxxxx
0.000000R这一总和可能导致10.0000000。在这种情况下,结果向右移动,指数增加。
发布于 2021-06-18 01:18:11
嗯嗯。就像这个问题,每个细节都需要精确,否则就会失败.
抱歉,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.
https://stackoverflow.com/questions/47407662
复制相似问题