减去两个 Ieee754 数字,我没有得到正确的结果

问题描述 投票:0回答:1

我目前正在编写一个编译器来测试我的编程能力,而我的目标架构没有浮点单元。为了解决这个问题,我向我的标准库添加了函数来通过按位运算处理浮点计算。所有的浮点计算都是32位的。 1 个符号位,8 位指数,23 位尾数。下面详细介绍了减法运算的所有步骤。

请注意,目前我在标准库中的代码适用于相同符号的数字,甚至适用于具有不同符号的数字的某些情况。

我失败的测试用例与以下减法运算相关:

50.0 - 92.0 = -42.0

如上所述,我试图解决的运算是 50.0 - 92.0,它应该等于 -42.0。

第一步应该是将两个数字转换为二进制:

转换后的数字如下...

        Sign  Exp      Mantissa                Binary Scientific Notation
  50.0 = 0|10000100|10010000000000000000000 = 1.10010000000000000000000x2^5
  92.0 = 0|10000101|01110000000000000000000 = 1.01110000000000000000000x2^6

第二步是提高 50.0 的指数,使指数 5 变成 6。因此,我们需要将位 1 向右移动以适应指数的增加。

1.10010000000000000000000x2^5 becomes 0.11001000000000000000000x2^6

第三步是获得第二个值的二进制补码,因为我们要减去 92.0,而不是相加。

1.01110000000000000000000x2^6 inverted is 0.10001111111111111111111x2^6
0.10001111111111111111111x2^6 + 1 is 0.10010000000000000000000x2^6

最后一步是将尾数加在一起

  0.11001000000000000000000x2^6
+ 0.10010000000000000000000x2^6
_______________________________
  1.01011000000000000000000x2^6

现在这最后一点是我有点困惑的地方,因为 ieee754 格式的 -42 的最终结果是

       Sign Exp          Mantissa
-42.0 = 1|10000100|01010000000000000000000

显然还有尾数

01010000000000000000000 is not
01011000000000000000000

有人知道我做错了什么吗?谢谢

floating-point binary subtraction ieee-754
1个回答
0
投票

您没有使用足够的位来正确处理二进制补码,并且您还没有处理负结果。

补足正数 1.011100000000000000000002×26,得到 0.100100000000000000000002×26。结果应该是负数,但补码中前导 0 表示正数。换句话说,您的补码操作超出了格式。

如果您在前面加上前缀 0,然后补码,则会得到 10.100100000000000000000002×26,并将其添加到 00.110010000000000000000002×26,其中也有一个 0 前缀。那么总和就是 11.010110000000000000000002×26.

首位为1,表示结果为负。所以你可以再补一下看绝对值,00.101010000000000000000002×26,也就是说结果是−00.101010000000000000000002×26

最后,将其标准化为−1.010100000000000000000002×25,即−42。

注释

此解释并不认可使用补码。实现直接减法器可能是首选。

“有效数”是浮点数小数部分的首选术语。 “尾数”是对数小数部分的旧术语。有效数是线性的(如果数字增加 1.2 倍,则有效数增加 1.2 倍,除非超过指数阈值),而尾数是对数的(尾数相加等于所表示的值的乘积)。

© www.soinside.com 2019 - 2024. All rights reserved.