Floating point 二进制浮点加法算法
我试图在二进制水平上理解IEEE 754浮点加法。我遵循了我在网上找到的一些示例算法,并且有大量的测试用例与经过验证的软件实现相匹配。我的算法目前只处理正数。但是,我没有得到与此测试用例匹配的结果: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
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)
非常接近,但不精确。我的算法有错误吗?计算中似乎有两个问题,都与将低于正常值的数字当作正常值处理有关:
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”。