【问题标题】:How to convert binary floating point number to decimal number如何将二进制浮点数转换为十进制数
【发布时间】: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


    【解决方案1】:

    您以错误的方式解释数据。

    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

    【讨论】:

    • 更正:指数的符号实际上是由偏置而不是符号位完成的。因此,111 是有效指数 (4) 而不是(无穷大)。
    • 我很确定在这种情况下 111 是无穷大。然而,问题是 000 应该是 0 和非规范化的数字。我没有看到你们两个句子之间的联系,以及第一个句子与我所写的内容有何矛盾:)
    【解决方案2】:

    最重要的“1”未编码。所以你需要在转换时添加它。

    在这种情况下,数字是“0101”,因此添加“1”将得到“1.0101”。那么指数是4,但是需要偏移3,所以实际乘数就是2^1。

    这给出了“10.101”的结果,实际上是 2.625

    【讨论】:

    • 你能解释一下 10.101 确实是 2.625 吗?
    【解决方案3】:

    浮点数是 45(以 16 为底),即 01000101(以 2 为底)..

    0101 是尾数部分,100 是指数部分...

    在恢复前导时,尾数被更新为 1.0101...

    从指数中减去偏差,在 8 位表示的情况下为 3,指数变为 1...

    二进制表示为 1.0101 * 2^1...

    反规范化我们得到 10.101,它是 2.625 的二进制表示...

    【讨论】:

      【解决方案4】:

      [扩展 JasonD 的答案]

      我认为可以安全地假设您理解或者理所当然地认为浮点数可以具有负指数。

      但如果你仔细想想,这实际上是如何发生的?这就是“偏见”发挥作用的地方,我认为这是你理解中缺失的环节。在您的链接中,他们提到了计算偏差的以下定律:

      2^(k-1) - 1

      其中 k 是指数字段中的位数。在您的示例中,k 为 3 位,因此偏差为 3。通过这种方式,您可以对 [-3,4](含)范围内的任何指数进行编码。

      所以现在希望清楚的是,当您解码数字时,您必须首先“消除”指数。所以你的 2^4 实际上是 JasonD 所说的 2^1。

      【讨论】:

        猜你喜欢
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 2014-03-01
        • 2016-12-25
        • 2015-10-11
        • 2021-08-01
        相关资源
        最近更新 更多