【发布时间】:2013-03-10 11:41:19
【问题描述】:
我使用过该网站:http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html 他们说2.625 是0_100_0101,基于指数是4 和尾数是5/16。所以号码是(5/16) * 2^4,这绝对不是2.625。
所以应该是这样的。
【问题讨论】:
标签: floating-point binary decimal
我使用过该网站:http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html 他们说2.625 是0_100_0101,基于指数是4 和尾数是5/16。所以号码是(5/16) * 2^4,这绝对不是2.625。
所以应该是这样的。
【问题讨论】:
标签: floating-point binary decimal
您以错误的方式解释数据。
0 是符号,所以数字是正数 100 是指数,实际上是 1 (2^1)。指数是有符号的,可能的值为:
000(数字 0 和非规范化数字)
001 -2
010 -1
011 0
100 1
101 2
110 3
111(无穷大和 NAN)
附: 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
【讨论】:
浮点数是 45(以 16 为底),即 01000101(以 2 为底)..
0101 是尾数部分,100 是指数部分...
在恢复前导时,尾数被更新为 1.0101...
从指数中减去偏差,在 8 位表示的情况下为 3,指数变为 1...
二进制表示为 1.0101 * 2^1...
反规范化我们得到 10.101,它是 2.625 的二进制表示...
【讨论】:
[扩展 JasonD 的答案]
我认为可以安全地假设您理解或者理所当然地认为浮点数可以具有负指数。
但如果你仔细想想,这实际上是如何发生的?这就是“偏见”发挥作用的地方,我认为这是你理解中缺失的环节。在您的链接中,他们提到了计算偏差的以下定律:
2^(k-1) - 1
其中 k 是指数字段中的位数。在您的示例中,k 为 3 位,因此偏差为 3。通过这种方式,您可以对 [-3,4](含)范围内的任何指数进行编码。
所以现在希望清楚的是,当您解码数字时,您必须首先“消除”指数。所以你的 2^4 实际上是 JasonD 所说的 2^1。
【讨论】: