将负分数转换为 IEEE 754
Converting a negative fraction to 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。然后我将小数点二向右移动所以我得到 1 * 2^-2 这是正确的除了我不应该减去 3 的偏差使其成为 1 * 2^-5?
我不知道 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 位浮点数的二进制表示。
我正在尝试将十进制的 -0.25 转换为 IEEE 754 8 位浮点数。这意味着有符号位是 1 位,指数是 3 位,尾数是 4 位。因为它是分数,所以我的第一个数字是 0。对于我的下一个数字
.25 * 2 = **0**.5
.5 * 2 = **1**.0
0 * 2 = **0**.0...
所以我最终得到 0.01000。然后我将小数点二向右移动所以我得到 1 * 2^-2 这是正确的除了我不应该减去 3 的偏差使其成为 1 * 2^-5?
我不知道 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 位浮点数的二进制表示。