【问题标题】:Proof that the last non-zero digit to the right of the decimal point in a non whole number float is always 5?证明非整数浮点数中小数点右侧的最后一个非零数字始终为 5?
【发布时间】:2021-10-12 15:54:33
【问题描述】:

非整数浮点数中小数点右边的最后一个非零数字是否总是5?可以/有人正式证明[编辑]这一点吗?此外,需要在小数点右侧连续多少个 0 才能得出在右侧没有更多非零数字的结论——我见过 #s 例如 1.23450678500000 (一个例子,可能不是真实的float),所以我知道它至少是两个。

【问题讨论】:

    标签: floating-point number-theory


    【解决方案1】:

    关于第二个问题(叙述): >>> 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
    【解决方案2】:

    非整数浮点数中小数点右边最后一个非零数字是否总是5?

    在二进制浮点格式中,如果数字不是整数,则其十进制数字的最后一个非零位为 5。

    通常,浮点格式将数字表示为某个整数M乘以固定基数b的幂eMbe,对Me有各种限制时间>。如果 b 为 2,我们称其为二进制格式。二进制浮点格式是目前最常见的。一些平台提供十进制格式,其中 b 是 10。其他基数在数学上是可能的,但很少使用,尽管过去使用了 16。

    要查看最后一位数字是 5,请考虑以下形式 Mbe。这可以是非整数的唯一方法是 e 为负数。如果 M 是偶数,我们可以将形式简化为 (M/2)•be -1,并且,如果 M/2 也是偶数,我们可以进一步减少并继续减少,直到我们得到一个奇数乘以 2 的负幂。这相当于除乘以 2 的正幂。那么我们可以看到最后一位是 5:

    • 如果我们除以 21,则数字是 0.5、1.5、2.5、3.5,依此类推。
    • 如果我们除以 22,则该数字是其中之一的一半,因此是 0.25、0.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。

    此外,小数点右侧需要连续多少个 0 才能断定右侧不再有非零数字……

    这取决于具体的浮点格式。高精度格式可以表示非常接近某个数字 .xxxx500 但不等于它的数字。对于任何给定的浮点格式,必须对非零数字之前的零数量有所限制,但可能需要一些工作才能弄清楚。如果您担心找到准确表示浮点数所需的位数,还有其他方法可以解决。

    【讨论】:

    • 关于所述第二Q:V1 = 0.0625000000000000277555756156289135105907917022705078125,V2 = 0.06250000000000001387778780781445675529539585113525390625,两者都是确切(也许这第二个问题应是一个独立Q〜如何一个凡人从检查结束(VS实际的转换),该一非整数浮点数是否准确显示?)
    猜你喜欢
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多