二进制浮点加法算法

时间:2018-08-02 19:57:11

标签: floating-point binary ieee-754

我正在尝试以二进制级别理解IEEE 754浮点加法。我遵循了一些在网上找到的示例算法,并且许多测试用例都与经过验证的软件实现相匹配。我的算法目前只处理正数。但是,我没有与此测试用例相匹配:

00001000111100110110010010011100 (1.46487e-33)
00000000000011000111111010000100 (1.14741e-39)

我将其分成符号位,指数和尾数。我将隐式1重新添加到尾数

0 00010001 1.11100110110010010011100
0 00000000 1.00011000111111010000100

我从较小的指数中减去较大的指数,以确定重排偏移量:

 00010001 (17)
-00000000 (0)
 =============
           17

我将保护钻头,圆头钻和粘性钻头固定在尾数上:

1.11100110110010010011100 000
1.00011000111111010000100 000

我将较小值的尾数向右移17次,一旦它收到1:LSb就“粘住”。

0.00000000000000001000110 001

我将较大的尾数添加到偏移的较小尾数上:

1.11100110110010010011100 000 +
0.00000000000000001000110 001
================================
1.11100110110010011100010 001

因为没有溢出,并且保护位为0,所以我可以直接使用求和尾数和更大的指数(重新删除隐式的'1'):

0 00010001 11100110110010011100010

给出最终值:

00001000111100110110010011100010 (1.46487e-33)

但是根据我的验证实施,我应该得到:

00001000111100110110010010101000 (1.46487e-33)

非常接近但不精确。我的算法有错误吗?

1 个答案:

答案 0 :(得分:2)

计算中似乎有两个问题,都与将次普通数视为正常一样有关:

  1. 不正确的班次计算。指数是-126,而不是-127。
  2. 在二进制点之前错误地插入一位。

这是修改后的计算:

0 00010001 1.11100110110010010011100
0 00000000 0.00011000111111010000100

将保护位,圆形位和粘性位固定到尾数:

1.11100110110010010011100 000
0.00011000111111010000100 000

较小数字的16位右移

0.00000000000000000001100 001

将较大的尾数添加到偏移的较小尾数中:

1.11100110110010010011100 000 +
0.00000000000000000001100 001
================================
1.11100110110010010101000 001