将负分数转换为IEEE 754

时间:2015-03-04 03:10:36

标签: ieee-754

我试图将-0.25的十进制转换为IEEE 754 8位浮点。这意味着有符号位为1位,指数为3位,尾数为4位。因为它的一小部分我的第一个数字是0.我的下一个数字

.25 * 2 = **0**.5
.5 * 2 = **1**.0
0 * 2 = **0**.0...

所以我最终得到0.01000。然后我将小数点2向右移动,所以我最终得到1 * 2 ^ -2,这是正确的,除非我不应该减去3的偏差使其为1 * 2 ^ -5?

1 个答案:

答案 0 :(得分:2)

我不知道IEEE 754定义了8位格式。 (事实上​​,我仍然不相信它。)但我们可以从它定义的格式中进行推断。

你没有提到隐藏位,但是16,32,64和128位IEEE 754格式都使用隐藏位,因此我将用隐藏位解决这个问题。

我认为将浮点数的组件描述为三个单独的无符号整数是最简单的。 (我从this paper学到了这个技巧。)对于你的8位格式,这些整数是

  • s,符号位,为0或1,
  • e,指数,范围为0 ... 7,
  • m,有效数字,范围为0 ... 15。

格式使用隐藏位,我们通过向有效数字添加2 4 (也称为16)来处理。 (这里的4来自有效数字中的位数。)

您将偏差描述为3,但由于我将有效数视为整数,我需要将偏差加4(将除隐藏位以外的所有位移到小数点的右侧)。这使得偏见7成为我的符号。

因此,我们将浮点数f的值定义为

f = (-1)^s * 2^(e-7) * (m + 16)

现在让我们解决您的问题,即找到sem

f = -0.25

替换为f的早期定义:

-0.25 = (-1)^s * 2^(e-7) * (m + 16)

我们可以立即看到s == 1。除以-1得到

0.25 = 2^(e-7) * (m + 16)         (eq. 1)

解决此问题m + 16

m + 16 = 0.25 / 2^(e - 7)
       = 0.25 * 2^-(e - 7)
       = 0.25 * 2^(7 - e)

我们知道0 <= m < 16(因为m是4位),所以16 <= m + 16 < 32。替换和解决非负整数e:

16 <= 0.25 * 2^(7 - e) < 32
64 <= 2^(7 - e) < 128
log2 64 <= 7 - e < log2 128
6 <= 7 - e < 7
-1 <= -e < 0
1 >= e > 0
e = 1

现在将e = 1替换回等式1并求解m

0.25 = 2^(1 - 7) * (m + 16)
0.25 = 2^-6 * (m + 16)
16 = (m + 16)
m = 0

所以s = 1e = 1m = 0。回到f的定义中检查:

f = (-1)^1 * 2^(1 - 7) * (0 + 16)
  = -1 * 2^-6 * 16
  = -1 * 1/64 * 16
  = -1/4
  = -0.25

要将其转换为位,我们会写出s的一位,然后是e的三位,然后是m的四位:

0 0 0 1 0 0 0 0
s e e e m m m m

因此,16(基数10)或0x10是0.25的二进制表示,作为8位浮点数。