以算法方式执行浮点加法

ric*_*i90 5 algorithm math floating-point ieee-754

我试图理解浮点加法的算法。过去,我只需要在纸上完成此操作,并通过将其转换为十进制并再次转换回来来完成。我正在 HDL 中编写浮点 ALU,因此在这种情况下不起作用。我已经阅读了很多有关该主题的问题,其中最有用的问题是我在本示例中使用的,并且阅读了很多文章,但有些概念让我困惑。我在下面的上下文中写了这些问题,但为了总结,它们位于顶部:

  1. 尾数中的隐含位什么时候为0,什么时候为1?
  2. 添加之后,我们如何通过算法检查归一化,然后确定转向哪条路?
  3. 如果其中一个数为负数,尾数的减法是否以 2 补码进行?

借用这个例子:

00001000111100110110010010011100 (1.46487e-33)
00000000000011000111111010000100 (1.14741e-39)
Run Code Online (Sandbox Code Playgroud)

首先将它们分成各自的组成部分(符号、指数、尾数)

0 00010001 11100110110010010011100
0 00000000 00011000111111010000100
Run Code Online (Sandbox Code Playgroud)

接下来解决它们的隐式整数值

0 00010001 1.11100110110010010011100
0 00000000 0.00011000111111010000100
Run Code Online (Sandbox Code Playgroud)

问题1:第二个值前面的零整数是因为指数为零的原因吗

接下来用较小的指数减去较大的指数,并将较小的尾数向右移动该数量

  00010001
- 00000000
___________
00010001 = 17

0.00000000000000000000110
Run Code Online (Sandbox Code Playgroud)

添加尾数

   0.00000000000000000000110
+  1.11100110110010010011100
______________________________
   1.11100110110010010100010

Run Code Online (Sandbox Code Playgroud)

问题 2:在这种情况下,MSB 为 1,因此该值已标准化,我们可以删除它。假设事实并非如此。如果 MSB 为 0,那仍然会被视为标准化值,还是我们会向左移动以在该位置得到 1?

问题 3:假设其中一个数字为负数,减法是以 2 补数进行的,还是直接减去尾数就足够了?

chu*_*ica 4

尾数中的隐含位什么时候为0,什么时候为1?

当(有偏差的)指数处于最小值(例如0)时,隐含位为0。
当(有偏差)指数处于最大值时,没有隐含位。该值为无穷大或 NAN。
否则隐式位为 1。


添加之后,我们如何通过算法检查归一化,然后确定转向哪条路?

对于加法(具有相同符号的 2 个操作数),如果总和的最高位有进位,则右移,增加指数。检查指数溢出。

加法(2 个具有相反符号的操作数) - 这实际上是减法,如果所有有效位为零,则返回零。否则,如果最高有效位为零,则根据需要重复左移,递减指数,但不要递减指数低于最小值。


如果其中一个数为负数,尾数的减法是否以 2 补码进行?

不可以。常见的 FP 编码是符号量值编码。


问题1:第二个值前面的零整数是因为指数为零的原因吗

是的,有偏指数最小。


问题 2:在这种情况下,MSB 为 1,因此该值已标准化,我们可以删除它。假设事实并非如此。如果 MSB 为 0,那仍然会被视为标准化值,还是我们会向左移动以在该位置得到 1?

当符号不同时(或者两个操作数都是 0.0),MSBit 可能为零。如果总和不为零,则如上所述左移。


问题 3:假设其中一个数字为负数,减法是以 2 补数进行的,还是直接减去尾数就足够了?

不使用2的补语。当符号相同时,将大小相加。当符号不同时,翻转第二个符号位并调用减法代码。


IEEE-754 不使用“尾数”,而是使用wiki 中的有效数 。我认为这对于规范来说很重要。我稍后再回顾。