我用过那个网站:http ://sandbox.mc.edu/~bennet/cs110/flt/dtof.html他们说这2.625
是0_100_0101
基于指数是4
和尾数是5/16
。所以数字是(5/16) * 2^4
,而这绝对不是2.625
。
那么应该如何。
我用过那个网站:http ://sandbox.mc.edu/~bennet/cs110/flt/dtof.html他们说这2.625
是0_100_0101
基于指数是4
和尾数是5/16
。所以数字是(5/16) * 2^4
,而这绝对不是2.625
。
那么应该如何。
您正在以错误的方式解释数据。
0 是符号,所以数字是正数 100 是指数,实际上是 1 (2^1)。指数是有符号的,可能的值为:
000(数字 0 和非规范化数字)
001 -2
010 -1
011 0
100 1
101 2
110 3
111(无穷大和 NAN)
PS NAN:不是数字(错误代码和东西)
0101 是你的尾数。
这实际上意味着您的数字是 1.0101(有一个隐藏位以提高精度,因为每个数字都必须以“1”开头。实际上并未存储“1”)。
这给了你 (1+5/16)*2 = 2.625
最重要的“1”不被编码。因此,您需要在转换时添加它。
在这种情况下,数字是“0101”,因此添加“1”将得到“1.0101”。那么指数是4,但是需要偏移3,所以实际的乘数就是2^1。
这给出了“10.101”的结果,实际上是 2.625
[扩展 JasonD 的答案]
我认为可以安全地假设您理解,或者理所当然地认为浮点数可以具有负指数。
但如果你仔细想想,这实际上是如何发生的?这就是“偏见”发挥作用的地方,我认为这是你理解中缺失的环节。在您的链接中,他们提到了以下用于计算偏差的定律:
2^(k-1) - 1
其中 k 是指数字段中的位数。在您的示例中,k 为 3 位,因此偏差为 3。通过这种方式,您可以对 [-3,4](含)范围内的任何指数进行编码。
所以现在希望很清楚,当你解码数字时,你必须首先“消除”指数。因此,正如 JasonD 所说,您的 2^4 实际上是 2^1。
浮点数是 45(以 16 为底),即 01000101(以 2 为底)。
0101 是尾数部分,100 是指数部分...
在恢复领先的尾数时,尾数被更新为 1.0101...
从指数中减去偏差,在 8 位表示的情况下为 3,指数变为 1...
二进制表示为 1.0101 * 2^1...
反规范化我们得到 10.101,它是 2.625 的二进制表示......