我试图将-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?
答案 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)
现在让我们解决您的问题,即找到s
,e
和m
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 = 1
,e = 1
和m = 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位浮点数。