我不知道 IEEE 754 定义了 8 位格式。 (事实上我仍然不相信它确实如此。)但我们可以从它定义的格式中推断出来。
你没有提到隐藏位,但是 16、32、64 和 128 位 IEEE 754 格式都使用了隐藏位,所以我将使用隐藏位来解决这个问题。
我认为将浮点数的组成部分描述为三个独立的无符号整数是最简单的。 (我从this paper 学到了这个技巧。)对于您的 8 位格式,这些整数是
-
s,符号位,为0或1,
-
e,指数,范围为 0...7,
-
m,有效数字,范围为 0...15。
该格式使用隐藏位,我们通过将 24(也称为 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 位浮点数。