4

У меня есть следующий сценарий Python:вытяжкойСтолы с плавающей точкой точность в (казалось бы) бесконечный цикл

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

Это, казалось бы, бесконечный цикл, заканчивается довольно быстро, если х является числом с плавающей точкой. Но если я заменю x на 300000000 вместо этого, он попадает в бесконечный цикл (пробегает больше минуты в моем тесте).

Я думаю, что это связано с тем, что он исчерпывает точность числа с плавающей запятой, которое может быть представлено в памяти. Может ли кто-нибудь дать более подробное объяснение, почему это так?

ответ

11
  • Когда вы инициализируете x до 300000000, целочисленная математика используется во всей программе.
  • Когда вы инициализируете x до 300000000.0, вместо этого используется математика с плавающей запятой.

В Python целые числа могут расти сколь угодно большими. (Точнее, они ограничены доступной памятью.) Это означает, что целочисленная версия вашей программы занимает очень много времени, чтобы завершить работу.

Крупнейший float - около 1.8e308. Требуется около 1000 итераций версии цикла с плавающей точкой, чтобы превысить это значение, после чего x получает положительную бесконечность, и программа завершается.

+0

проголосовал за правильный ответ, так как на самом деле почему он объясняет, что он не заканчивается для целочисленного случая, где другие ответы только объясняют очевидное, что он заканчивается, когда x = inf, если x является поплавком –

6

Это связано с переполнением с плавающей запятой. В этом случае, as per IEEE754, x примет значение положительной бесконечности, которое по определению не меньше, чем все остальное:

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

x двойников после каждого шага. Конечное число x никогда не равно 2 * x. Но как только вы превысите максимальный показатель вашего типа с плавающей запятой, удвоение превратится в x в +infinity. И +infinity = 2*+infinity. Таким образом, цикл заканчивается в этой точке.

Смежные вопросы