【问题标题】:Having trouble converting a floating point to its binary representation将浮点数转换为其二进制表示时遇到问题
【发布时间】:2016-02-21 04:22:19
【问题描述】:

以下是我正在尝试遵循的教程。

当试图将数字转换回它的二进制表示时,我弄错了。谁能告诉我我做错了什么?

-0.21875

二进制表示:

.00111 = 1.11 * 2^-3

因为..

0.5^3 + 0.5^4 + 0.5^5 = 0.21875

指数为..

-3 + 127 = 124

因此二进制表示应该是:

s eeeeeeee mmmmmmmmmmmmmm
1 01111100 11100000000000

但为什么我以同样的方式转换 639.6875 得到正确答案?:

整数值的表示:

1001111111

十进制值的表示:

1011

合并和归一化:

1001111111.1011 = 1.0011111111011 * 2^9

规范化的时候,我们把基数直接放在第一个1的右边吧? 以 127 为指数偏置,127+9 = 136:

10001000

二进制表示:

s eeeeeeee mmmmmmmmmmmmmm
0 10001000 10011111111011

【问题讨论】:

    标签: floating-point mantissa


    【解决方案1】:

    第一个值

    (释义)将 -0.21875 转换回二进制时,我得到了错误的答案。为什么?

    对于规范化浮点数,前导“1”不写入位表示。例如,对二进制数 1.0001101 进行编码会得到尾数 0001101(...)。

    关于标准化 FP 数字的事实在您发布的演示幻灯片中有所介绍 - 即它是名为 (1 + f) 的部分(而不仅仅是 f)。

    因此,-0.21875 的二进制表示必须有尾数位 11000000000000000000000(在右侧填充到 23 位长)。

    第二个值

    但是为什么我以同样的方式转换 639.6875 得到正确答案?

    你没有得到正确的答案。 639.6875的正确表示是:

    s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
    0 10001000 00111111110110000000000
    

    代码检查

    我们可以使用 Java 方便地确认这些值:

    printFloat(0b1_01111100_11000000000000000000000);  // -0.21875
    printFloat(0b0_10001000_00111111110110000000000);  // 639.6875
    printFloat(0b0_10001000_10011111111011000000000);  // 831.84375
    
    void printFloat(int bits) { 
        System.out.println(Float.intBitsToFloat(bits));
    }
    

    更正

    我可以看到这行的意图:

    0.5^3 + 0.5^4 + 0.5^5 = 0.21875
    

    但应该这样写:

    0.5 * 2^-3 + 0.5 * 2^-4 + 0.5 * 2^-5 = 0.21875
    

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 2014-02-10
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2014-11-24
      • 2015-12-02
      • 2017-06-24
      • 2011-03-07
      相关资源
      最近更新 更多