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

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

10001000

二进制表示:

s eeeeeeee mmmmmmmmmmmmmm
0 10001000 10011111111011
4

1 回答 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
于 2016-02-21T04:50:28.463 回答