4

私は次のPythonスクリプトを持っています:

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

この一見無限ループは、xが浮動小数点数の場合、非常に迅速に終了します。しかし、代わりにxを300000000に変更すると、無限ループに入ります(私のテストでは1分より長く実行されます)。

これは、メモリで表現できる浮動小数点数の精度を使い果たしているという事実に関係していると思います。誰かがこれがなぜであるかについてより詳細な説明を提供できますか?

4

3 に答える 3

11
  • に初期化xすると300000000、プログラム全体で整数演算が使用されます。
  • に初期化xすると300000000.0、代わりに浮動小数点演算が使用されます。

Python では、整数は任意に大きくなる可能性があります。(より正確には、使用可能なメモリによって制限されます。) これは、プログラムの整数バージョンが終了するのに非常に長い時間がかかることを意味します。

最大floatは約1.8e308です。この値を超えるには、浮動小数点バージョンのループを約 1000 回反復する必要があり、その時点でx正の無限大に設定され、プログラムが終了します。

于 2012-05-02T13:44:51.733 に答える
6

これは、浮動小数点のオーバーフローが発生するためです。その場合、IEEE754 に従ってx正の無限大という値が採用されます。これは定義上、他の何よりも小さくありません。

>>> x = float("inf")
>>> x
inf
>>> x + x
inf
>>> x < x + x
False
于 2012-05-02T13:45:34.350 に答える
4

x各ステップの後に 2 倍になります。有限数xが と等しくなることはありません2 * x。ただし、浮動小数点型の最大指数を超えると、倍増はxになり+infinityます。そして+infinity = 2*+infinity。したがって、ループはその時点で終了します。

于 2012-05-02T13:45:40.570 に答える