【问题标题】:Exhausting floating point precision in a (seemingly) infinite loop在(看似)无限循环中耗尽浮点精度
【发布时间】:2012-05-02 13:41:49
【问题描述】:

我有以下 Python 脚本:

x = 300000000.0
while (x < x + x):
    x = x + x
    print "exec: " + str(x)
print "terminated" + str(x)

如果 x 是浮点数,这个看似无限的循环会很快终止。但是,如果我将 x 更改为 300000000,它会进入无限循环(在我的测试中运行时间超过一分钟)。

我认为这是因为它耗尽了可以在内存中表示的浮点数的精度。有人可以提供更详细的解释吗?

【问题讨论】:

    标签: python floating-point floating-accuracy floating-point-precision


    【解决方案1】:
    • 当您将 x 初始化为 300000000 时,整个程序都会使用整数数学运算。
    • 当您将 x 初始化为 300000000.0 时,会改为使用浮点数学。

    在 Python 中,整数可以任意增长。 (更准确地说,它们受到可用内存的限制。)这意味着您的程序的整数版本需要很长时间才能终止。

    最大的float 大约是1.8e308。循环的浮点版本大约需要 1000 次迭代才能超过该值,此时 x 被设置为正无穷大,程序终止。

    【讨论】:

    • 投票为正确答案,因为这实际上解释了它不会在整数情况下终止的原因,而其他答案只是解释了当 x = inf 如果 x 是浮点数时它会终止的明显原因
    【解决方案2】:

    这是因为发生了浮点溢出。在这种情况下,as per IEEE754x 将采用正无穷大的值,根据定义,它不小于其他任何值:

    >>> x = float("inf")
    >>> x
    inf
    >>> x + x
    inf
    >>> x < x + x
    False
    

    【讨论】:

      【解决方案3】:

      x 在每一步后加倍。有限数x 永远不会等于2 * x。但是一旦超过浮点类型的最大指数,加倍会将x 变为+infinity。和+infinity = 2*+infinity。所以循环在那个时候终止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 2016-07-26
        • 2013-05-30
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多