2014-11-23 5 views
0

잠시 후 내 코드가 올라간다. OverflowError: cannot convert float infinity to integer. 내가이 작업을 수행 할 어떤 이유를 볼 수 없습니다, float로 변환 할 수없는 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 또는 2 작품 1.5 교체, 작은 수레의 사용과 INF없이 사용할 수있다. 왜?

+0

나는 코드가 약간의 자기 참조임을 알아 차렸다. – tox123

답변

3

bugs * 1.5은 정수로 다시 변환되는 부동 소수점 피연산자 (1.5) 때문에 부동 소수점 연산입니다. bugs * 2bugs * 1은 정수 피연산자로 인해 정수 연산입니다.

지수가 항상 증가합니다 (bugs = int(bugs * 1.5)).

결국 bugsbugs * 1.5이 부동 소수점의 허용 가능한 최대 값을 초과하여 "무한대"가 될 정도로 충분히 큰 정수가됩니다. 그런 다음 그것을 다시 정수로 변환하려고합니다. 정확한 오류 메시지입니다.

bugs * 2 (정수 연산은 언급 한 바와 같이) "무한대"개념이나 정수에 대한 오버플로 오류가 없기 때문에 작동합니다. bugs * 1, 물론, 그냥 영원히 실행됩니다. 그러나 bugs * 2.0은 실패합니다.

+1

"정수를 그냥 감싸는 것"은 조금 오도하기 쉽습니다. 평범한 파이썬에서는 자동 감축이라는 감각으로 2의 거듭 제곱의 의미로 감싸는 정수가 없습니다. NumPy는 물론 다른 문제입니다. –

+0

그래서 내가 1.5의 비율로 성장하기를 원한다면 어떻게해야합니까? – tox123

+0

@ tox123 int로 변환하지 마십시오. 그러나 나는 그보다 더 나은 조언을 줄 수는 없다. 나는 실제로 파이썬을 모른다. 소수 자릿수가 0 인 부동 소수점을 인쇄하는 방법이 있다고 확신합니다. 아마도 ""코드에서 % .0f 버그 ... ". –