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

Floating point 为什么小数点5.875在浮点数学中最终转换为101.111?,floating-point,Floating Point,好的,在学习系统编程时,我跳过了浮点。我有点兴奋掌握这些,因为它将有助于更快地学习其他语言。不幸的是:我被卡住了,特别是小数点5.875并将其转换为浮点 我已经使用的直观方法是将每个数字除以2(取决于我所在的位置),因此,我将5除以2,得到余数1。 我用8除以2得到余数0。 我把7除以2,得到余数1。 最后,将5除以2,得到余数1表示。等等 1.011 所以,我检查了在线转换器,结果是101.111。 我不知道这是为什么,所以我去谷歌搜索正确的数学,至少有六种不同的数学解释,都处理不同的十进制表

好的,在学习系统编程时,我跳过了浮点。我有点兴奋掌握这些,因为它将有助于更快地学习其他语言。不幸的是:我被卡住了,特别是小数点5.875并将其转换为浮点

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

1.011

所以,我检查了在线转换器,结果是101.111。 我不知道这是为什么,所以我去谷歌搜索正确的数学,至少有六种不同的数学解释,都处理不同的十进制表示法


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

101.111作为二进制数字表示1•22+0•21+1•20+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
  • (五)−1) /2=2,这是偶数,因此第二个最低位是0
  • (二)−0)/2=1,这是奇数,因此第三个最低位是1
  • (一)−1) /2=0,因此我们停止。结果是101
分数的算法是:

  • 把这个数字乘以二。根据数字是小于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是0,所以我们停下来。结果是0.111
这些算法是正确的,有数学上的原因,如果需要,可以详细说明


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

“通常,人们会分别转换整数部分(5)和小数部分(.875)。”。这是Irc,但不,也不。FWW,David M. Gay的SttoDo()被移植到其他语言,而不是C或C++,也被java,python和php使用。谢谢,@ ErICSpyRelistChin短:5被编码为101(4 + 0 +1)…875是7/8,编码为7*0.001b,因此为0.111b(111b=7,0.001b=1/8,b表示二进制)。另见我的答案:。用5.2来演示它是如何工作的。@Rudy_Velthuis谢谢你,Rudy。