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

时间:2016-02-21 04:22:19

标签: floating-point mantissa

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

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

-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)

第一个值

  

(释义)将-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