floating-point - 二进制浮点加法算法

标签 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. 类次计算不正确。指数是-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

关于floating-point - 二进制浮点加法算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661257/

相关文章:

VBScript 和浮点( double )数字 : Round function returns wrong result

c - 为什么 IEEE 754 浮点格式不使用 union ?

Javascript Float32Array 怪异

math - float 学有问题吗?

assembly - SIMD指令用于浮点相等比较(NaN == NaN)

binary - 为 Stata 中的所有变量重新编码相同的值模式

C++ 像 lower_bound 这样的二进制搜索

java - NaN 的总和 : How is the underlying bit pattern calculated?

python 浮点除法不起作用

binary - 有用的二进制差异工具(除了 msdn[apatch 和 mpatch]、xdelta、bsdiff、vbindiff 和 winmerge)