为什么小数点5.875在浮点数学中最终转换为101.111?

时间:2018-10-06 12:22:26

标签: floating-point

好的,因此在研究系统编程时,我已经跳到了浮点数上。我很高兴掌握这些知识,因为这将有助于更快地学习其他语言。不幸的是:我被卡住了,尤其是十进制的5.875,并将其转换为浮点数。

我已经使用的直观方法是将每个数字除以2(取决于我在哪里),因此,我将5除以2得到余数1。 我将8除以2得到余数0。 我将7除以2,得到余数1。 最后,将5除以2,得到的余数1。 。等待它。 。 。

1.011

因此,我检查了在线转换器,答案实际上是101.111。 我不确定为什么会这样,所以我去谷歌搜索正确的数学,并且至少有六种不同的数学解释都处理不同的小数表示形式。

很显然,我的数学是错误的:如何正确地将小数转换为二进制并通过扩展浮点数?我已经知道二进制表示形式如何转换为浮点表示形式,但是我对使用浮点数的十进制表示形式如何转换为二进制表示形式有些困惑。

1 个答案:

答案 0 :(得分:3)

101.111(作为二进制数字)表示1•2 2 + 0•2 1 + 1•2 0 + 1•2 −1 + 1•2 −2 + 1•2 -3 = 4 + 0 + 1 +½+¼+ + = 5 + .5 + .25 + .125 = 5.875。

这里没有浮点数。

将十进制数字转换为二进制的过程不是检查单个数字以查看它们是否是偶数和奇数。通常,将整数部分(5)和小数部分(.875)分别转换。整数部分的算法为:

  • 根据数字是偶数还是奇数,最低位是0或1。
  • 从数字中减去该位,将其除以2,然后重复上述操作以找到第二个最低位,然后是第三个位,依此类推。
  • 数字为零时停止。

例如,您的电话号码为5:

  • 5是奇数,所以最低位是1。
  • (5-1)/ 2 = 2,它是偶数,因此第二个最低位是0。
  • (2-0)/ 2 = 1,这是奇数,因此第三低的位是1。
  • (1-1)/ 2 = 0,所以我们停止。结果是101。

分数算法是:

  • 将数字乘以2。根据数字是小于1还是介于1(含1和2)之间,最高位是0或1。
  • 减去该位并重复上面的操作,找到第二高的位,然后是第三高,依此类推。
  • 当数字为零或您有任意位数时停止。

例如,使用.875:

  • .875•2 = 1.75,等于或大于1,因此该分数的最高位为1。
  • (1.75-1−)•2 = 1.5,等于1或更大,因此下一位为1。
  • (1.5−1)•2 = 1,等于1或更大,因此下一位为1。
  • 1-1是0,所以我们停止。结果是.111。

这些算法正确的原因有数学上的原因,可以根据需要进行详细说明。

如果您正在查看在线转换器,它们可能会显示浮点数如何编码。浮点格式不只是将数字转换为二进制。他们以某些方式移动和操纵数字以对其进行编码。这些编码的讨论与将数字转换为二进制的讨论是分开的。