Floating point 二进制浮点加法算法

Floating point 二进制浮点加法算法,floating-point,binary,ieee-754,Floating Point,Binary,Ieee 754,我试图在二进制水平上理解IEEE 754浮点加法。我遵循了我在网上找到的一些示例算法,并且有大量的测试用例与经过验证的软件实现相匹配。我的算法目前只处理正数。但是,我没有得到与此测试用例匹配的结果: 00001000111100110110010010011100 (1.46487e-33) 00000000000011000111111010000100 (1.14741e-39) 我把它分成符号位,指数,尾数。我在尾数后面加上隐含的1 0 00010001 1.11100110110010

我试图在二进制水平上理解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
1.11100110110010010011100 000
0.00011000111111010000100 000
我将较小值的尾数向右移动17次,LSb在收到1:

0.00000000000000001000110 001
我将较大尾数添加到移位的较小尾数:

1.11100110110010010011100 000 +
0.00000000000000001000110 001
================================
1.11100110110010011100010 001
1.11100110110010010011100 000 +
0.00000000000000000001100 001
================================
1.11100110110010010101000 001
由于没有溢出,并且保护位为0,我可以直接使用求和尾数和更大的指数(重新删除隐式“1”):

给出的最终值为:

00001000111100110110010011100010 (1.46487e-33)
但根据我的验证实施,我应该得到:

00001000111100110110010010101000 (1.46487e-33)

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

计算中似乎有两个问题,都与将低于正常值的数字当作正常值处理有关:

  • 换档计算不正确。指数是-126,而不是-127
  • 不正确地在二进制点前插入一位
  • 以下是修订后的计算:

    0 00010001 1.11100110110010010011100
    0 00000000 0.00011000111111010000100
    
    在尾数上钉上护齿、圆齿和粘性齿:

    1.11100110110010010011100 000
    1.00011000111111010000100 000
    
    1.11100110110010010011100 000
    0.00011000111111010000100 000
    
    数字较小的16位右移

    0.00000000000000000001100 001
    
    将较大尾数添加到移位后的较小尾数:

    1.11100110110010010011100 000 +
    0.00000000000000001000110 001
    ================================
    1.11100110110010011100010 001
    
    1.11100110110010010011100 000 +
    0.00000000000000000001100 001
    ================================
    1.11100110110010010101000 001
    

    零指数表示次正常数。没有隐含的一位。低于正常值的错误导致最终结果000010011010110010010100010中存在一位差异。它没有解释两个答案中最低有效位的不同位置。奇怪的是,为什么圆位0在这里?我希望是:“0.00000000000001100 0
    1
    1”。