2014-11-23 16 views
0

По какой-то причине через некоторое время мой код поднимается, OverflowError: cannot convert float infinity to integer. я не вижу никаких причин, почему было бы сделать это, есть небольшое использование поплавков и не использование инфа,inf не конвертируется в поплавок

def bugsInCode(begin): 
    bugs = begin 
    while bugs != 0: 
     print "%s bugs in the code, %s bugs\ntake one down patch it around, %s bugs in the code!" % (bugs, bugs, int(bugs * 1.5)) 
     bugs = int(bugs * 1.5) 

Однако замена 1.5 с 1 или через 2 работ. Зачем?

+0

Я только что заметил, что код немного самореалистичен! – tox123

ответ

3

bugs * 1.5 - операция с плавающей запятой из-за операнда с плавающей запятой (1.5), которую вы конвертируете обратно в целое число. Примечание bugs * 2 и bugs * 1 являются целыми операциями из-за целочисленных операндов.

Он постоянно растет с экспоненциальной скоростью (bugs = int(bugs * 1.5)).

В конечном итоге bugs будет целочисленным достаточно большим, чтобы bugs * 1.5 превысил максимально допустимое значение числа с плавающей запятой и, таким образом, будет «бесконечным». Затем вы пытаетесь преобразовать это обратно в целое число, следовательно, сообщение об ошибке, которое является точным.

bugs * 2 (целочисленная операция, как указано) работает, потому что нет понятия «бесконечность» или ошибка переполнения для целых чисел. bugs * 1, конечно, просто работает вечно. bugs * 2.0, однако, не получится.

+1

«целые числа, которые просто обертываются», немного вводят в заблуждение: нет целочисленного wraparound (в смысле автоматического сокращения по модулю некоторой мощности 2) в простом Python. (Разумеется, NumPy - это другой вопрос.) –

+0

Итак, если бы я хотел, чтобы он рос со скоростью 1,5, что мне делать? – tox123

+0

@ tox123 Я бы сказал, не конвертируем его в int. Но я не могу дать больше советов, чем это. Я действительно не знаю питона. Я уверен, что есть способ распечатать float с 0 десятичными знаками; вероятно, ''% .0f ошибок в коде ... "'. –