将负分数转换为 IEEE 754
Posted
技术标签:
【中文标题】将负分数转换为 IEEE 754【英文标题】:Converting a negative fraction to IEEE 754 【发布时间】:2015-03-04 03:10:35 【问题描述】:我正在尝试将十进制的 -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 吗?
【问题讨论】:
【参考方案1】:我不知道 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 位浮点数。
【讨论】:
谢谢,8 位我的教授只是用作理论示例以上是关于将负分数转换为 IEEE 754的主要内容,如果未能解决你的问题,请参考以下文章