二进制浮点加法算法
binary floating point addition algorithm
我试图在二进制级别理解 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 次,LSb "sticking" 一旦收到 1:
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)
非常接近但不准确。我的算法有错误吗?
计算中似乎有两个问题,都与将次正规数视为正规数有关:
- 班次计算不正确。指数是-126,不是-127。
- 在二进制小数点前错误地插入一位。
修改后的计算如下:
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
我试图在二进制级别理解 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 次,LSb "sticking" 一旦收到 1:
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)
非常接近但不准确。我的算法有错误吗?
计算中似乎有两个问题,都与将次正规数视为正规数有关:
- 班次计算不正确。指数是-126,不是-127。
- 在二进制小数点前错误地插入一位。
修改后的计算如下:
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