【发布时间】:2021-10-12 15:54:33
【问题描述】:
非整数浮点数中小数点右边的最后一个非零数字是否总是5?可以/有人正式证明[编辑]这一点吗?此外,需要在小数点右侧连续多少个 0 才能得出在右侧没有更多非零数字的结论——我见过 #s 例如 1.23450678500000 (一个例子,可能不是真实的float),所以我知道它至少是两个。
【问题讨论】:
标签: floating-point number-theory
非整数浮点数中小数点右边的最后一个非零数字是否总是5?可以/有人正式证明[编辑]这一点吗?此外,需要在小数点右侧连续多少个 0 才能得出在右侧没有更多非零数字的结论——我见过 #s 例如 1.23450678500000 (一个例子,可能不是真实的float),所以我知道它至少是两个。
【问题讨论】:
标签: floating-point number-theory
关于第二个问题(叙述): >>> 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???)**
【讨论】:
x 可以用 IEEE 754 binary64 格式表示并满足 2**(e-1) <= x < 2**e 需要在点后最多 max(53 - e, 0) 位以精确表示为十进制。例如,对于[0.5, 1.0) 中的x,点后最多需要53 位数字; x 中的 [0.25, 0.5) 最多 54 位; x 中的 [1.0, 2.0) 最多 52 位,依此类推。您可能还想知道,对于 IEEE 754 binary64 格式,任何十进制扩展中连续零(两端由非零数字括起来)的最大数量为 20。请参阅stackoverflow.com/q/20273877/270986。
非整数浮点数中小数点右边最后一个非零数字是否总是5?
在二进制浮点格式中,如果数字不是整数,则其十进制数字的最后一个非零位为 5。
通常,浮点格式将数字表示为某个整数M乘以固定基数b的幂e:M•be,对M和e有各种限制时间>。如果 b 为 2,我们称其为二进制格式。二进制浮点格式是目前最常见的。一些平台提供十进制格式,其中 b 是 10。其他基数在数学上是可能的,但很少使用,尽管过去使用了 16。
要查看最后一位数字是 5,请考虑以下形式 M•be。这可以是非整数的唯一方法是 e 为负数。如果 M 是偶数,我们可以将形式简化为 (M/2)•be -1,并且,如果 M/2 也是偶数,我们可以进一步减少并继续减少,直到我们得到一个奇数乘以 2 的负幂。这相当于除乘以 2 的正幂。那么我们可以看到最后一位是 5:
另外,我们可以看到,将一个数字乘以 2,即使重复,也永远不会使数字位置为 0,除非它是 0 或 5。乘以 1、2、3、4、6、7、8 或 9,将分别产生 2、4、6、8、2、4、6 和 8,将它们乘以 2 会产生来自同一集合的数字。所以,如果一个非整数乘以 2 的幂得到一个整数,它的最后一个非零数字必须是 5。
此外,小数点右侧需要连续多少个 0 才能断定右侧不再有非零数字……
这取决于具体的浮点格式。高精度格式可以表示非常接近某个数字 .xxxx500 但不等于它的数字。对于任何给定的浮点格式,必须对非零数字之前的零数量有所限制,但可能需要一些工作才能弄清楚。如果您担心找到准确表示浮点数所需的位数,还有其他方法可以解决。
【讨论】: