证明非整数浮点数中小数点右侧的最后一个非零数字始终为 5?
Proof that the last non-zero digit to the right of the decimal point in a non whole number float is always 5?
非整数浮点数小数点右边的最后一个非零数字是否总是5? Can/has 有人正式证明了这一点?此外,需要在小数点右侧连续多少个 0 才能得出结论,即右侧不再有非零数字——我见过 #s,例如 1.23450678500000(示例,可能不是真实的浮动),所以我知道它至少是两个。
Is it true that the last non-zero digit to the right of the decimal point in a non whole number float is always 5?
在二进制浮点数格式中,如果一个数字不是整数,则其十进制数字的最后一个非零数字是 5。
通常,浮点格式将数字表示为某个整数 M 乘以固定基数 e 的幂 e =]b: M•be,对 M 和 e 有各种限制。如果 b 是二,我们称之为二进制格式。二进制浮点格式目前是最常见的。一些平台提供十进制格式,其中 b 是 10。其他基数在数学上是可能的但很少使用,尽管 16 在过去有点使用。
要查看最后一位数字是 5,请考虑以下形式 M•be 。这可以是非整数的唯一方法是 e 为负数。如果M是偶数,我们可以将形式简化为(M/2)•be−1,如果M/2也是偶数,我们可以进一步减少,继续减少直到我们有一个奇数乘以2的负次方。这相当于除以2的正次方。然后我们可以看到最后一位是5:
- 如果我们除以 21,则数字为 .5、1.5、2.5、3.5,依此类推。
- 如果我们除以 22,数字是其中之一的一半,所以它是 .25、.75、1.25、1.75,依此类推。
- 如果我们除以 2 的任何更大的幂,我们总是将某个以 5 结尾的数字除以 2,这意味着我们将 ½ 分数从 5 所在的位置带到下一个位置,产生那里是 10 的一半,而 10 的一半是 5。
或者,我们可以看到,将数字乘以 2,即使重复,也永远不会使数字位置为 0,除非它是 0 或 5。将 1、2、3、4、6、7、8 或9, 将分别产生 2、4、6、8、2、4、6 和 8,并将它们乘以 2 产生同一组中的数字。因此,如果一个非整数乘以 2 的幂产生一个整数,则它的最后一个非零数字必须是 5.
Also, how many 0s in a row to the right of the decimal point are needed to conclude that there are no more non-zero digits farther to the right…
这取决于具体的浮点格式。高精度格式可以表示非常接近某个数字 .xxxx500 但不等于它的数字。对于任何给定的浮点格式,在非零数字之前可以有的零的数量必须有一些限制,但可能需要一些工作才能弄清楚。如果您担心找到准确表示浮点数所需的位数,还有其他方法可以解决这个问题。
关于第二个问题(叙述):
>>> v
1.5000005
#确定
>>> print("%f") % (v)
1.500001
**# Maybe not...**
>>> print("%.15f") % (v)
1.500000500000000
**# Ends in 5, so OK now, right? No! It should've rounded to even. Huh?**
>>> print("%.16f") % (v)
1.5000005000000001
**# "16 decimal digits is accuracy", I learned in school**
>>> print("%.31f") % (v)
1.5000005000000000698889834893635
**#NOT SO FAST; but now I found the real value since it ends in 5--see, "I'm smart, and I want respect" (Fraedo)**
>>> print("%.2000f") % (v)
1.50000050000000006988898348936345428228378295898437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
**# I should have listened to mom, and been a Mail Man! (are there yet more lurking non-zero digits???)**
非整数浮点数小数点右边的最后一个非零数字是否总是5? Can/has 有人正式证明了这一点?此外,需要在小数点右侧连续多少个 0 才能得出结论,即右侧不再有非零数字——我见过 #s,例如 1.23450678500000(示例,可能不是真实的浮动),所以我知道它至少是两个。
Is it true that the last non-zero digit to the right of the decimal point in a non whole number float is always 5?
在二进制浮点数格式中,如果一个数字不是整数,则其十进制数字的最后一个非零数字是 5。
通常,浮点格式将数字表示为某个整数 M 乘以固定基数 e 的幂 e =]b: M•be,对 M 和 e 有各种限制。如果 b 是二,我们称之为二进制格式。二进制浮点格式目前是最常见的。一些平台提供十进制格式,其中 b 是 10。其他基数在数学上是可能的但很少使用,尽管 16 在过去有点使用。
要查看最后一位数字是 5,请考虑以下形式 M•be 。这可以是非整数的唯一方法是 e 为负数。如果M是偶数,我们可以将形式简化为(M/2)•be−1,如果M/2也是偶数,我们可以进一步减少,继续减少直到我们有一个奇数乘以2的负次方。这相当于除以2的正次方。然后我们可以看到最后一位是5:
- 如果我们除以 21,则数字为 .5、1.5、2.5、3.5,依此类推。
- 如果我们除以 22,数字是其中之一的一半,所以它是 .25、.75、1.25、1.75,依此类推。
- 如果我们除以 2 的任何更大的幂,我们总是将某个以 5 结尾的数字除以 2,这意味着我们将 ½ 分数从 5 所在的位置带到下一个位置,产生那里是 10 的一半,而 10 的一半是 5。
或者,我们可以看到,将数字乘以 2,即使重复,也永远不会使数字位置为 0,除非它是 0 或 5。将 1、2、3、4、6、7、8 或9, 将分别产生 2、4、6、8、2、4、6 和 8,并将它们乘以 2 产生同一组中的数字。因此,如果一个非整数乘以 2 的幂产生一个整数,则它的最后一个非零数字必须是 5.
Also, how many 0s in a row to the right of the decimal point are needed to conclude that there are no more non-zero digits farther to the right…
这取决于具体的浮点格式。高精度格式可以表示非常接近某个数字 .xxxx500 但不等于它的数字。对于任何给定的浮点格式,在非零数字之前可以有的零的数量必须有一些限制,但可能需要一些工作才能弄清楚。如果您担心找到准确表示浮点数所需的位数,还有其他方法可以解决这个问题。
关于第二个问题(叙述): >>> v 1.5000005 #确定
>>> print("%f") % (v)
1.500001
**# Maybe not...**
>>> print("%.15f") % (v)
1.500000500000000
**# Ends in 5, so OK now, right? No! It should've rounded to even. Huh?**
>>> print("%.16f") % (v)
1.5000005000000001
**# "16 decimal digits is accuracy", I learned in school**
>>> print("%.31f") % (v)
1.5000005000000000698889834893635
**#NOT SO FAST; but now I found the real value since it ends in 5--see, "I'm smart, and I want respect" (Fraedo)**
>>> print("%.2000f") % (v)
1.50000050000000006988898348936345428228378295898437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
**# I should have listened to mom, and been a Mail Man! (are there yet more lurking non-zero digits???)**