以下是我正在尝试遵循的教程。
当试图将数字转换回二进制表示时,我弄错了。有人能告诉我我做错了什么吗?
-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
答案 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