首页 文章

无法将浮点转换为二进制表示

提问于
浏览
1

以下是我想要遵循的教程 .

当试图将数字转换回其二进制表示时,我弄错了 . 有人能告诉我我做错了什么吗?

-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

正规化时,我们将基数直接放在第一个右边的右边?偏向127到指数,127 9 = 136:

10001000

二进制表示:

s eeeeeeee mmmmmmmmmmmmmm
0 10001000 10011111111011

1 回答

  • 0

    第一个值

    (转述)将-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
    

相关问题