OverflowError

OverflowError는 산술 연산의 결과가 표현하기에는 너무 클 때 발생하는 에러입니다. Python은 정수 크기의 제한이 없기 때문에, 이 에러가 발생하지 않습니다. 하지만, 정수에서도 요구하는 범위를 벗어나는 것과 같은 일부 경우에 발생할 수도 있습니다.

소스 1. 1010을 6으로 나눈 결과를 출력하는 소스

소스 1은 정상적으로 1666666666.6666667을 출력합니다. 여기서 a의 값을 매우 크게 변경해 소스 2를 만들었습니다.

소스 2. 1012345을 6으로 나눈 결과를 출력하는 소스

소스 2는 런타임 에러가 발생합니다. Python의 float은 IEEE 754을 사용하고 있고, a/b의 결과는 float의 범위를 벗어나는 값이기 때문입니다. 런타임 에러 메시지는 다음과 같습니다.

Traceback (most recent call last):
  File "Main.py", line 3, in <module>
    print(a/b)
OverflowError: integer division result too large for a float

비슷한 예시로는 소스 3이 있습니다.

소스 3. 101234을 제곱근을 출력하는 소스

101234float으로 표현할 수 없는 값이기 때문에, 다음과 같은 런타임 에러가 발생합니다.

Traceback (most recent call last):
  File "Main.py", line 3, in <module>
    print(math.sqrt(n))
OverflowError: int too large to convert to float

정수

정수의 경우에도 발생할 수 있습니다.

소스 4. 재귀의 최대 깊이를 1012로 설정하는 소스

sys.setrecursionlimit은 C의 int로 변환할 수 있는 값만 넣을 수 있게 되어 있습니다. 따라서, 소스 4는 런타임 에러가 발생하고, 메시지는 다음과 같습니다.

Traceback (most recent call last):
  File "Main.py", line 2, in <module>
    sys.setrecursionlimit(10**12)
OverflowError: Python int too large to convert to C int

소스 5. 곱셈 연산을 무한번 반복하는 소스

Python은 정수 크기의 제한이 없기 때문에, 소스 5는 메모리 할당이 가능한 동안 계속 실행이 됩니다. 더 이상 할당할 메모리가 없으면, 다음과 같은 에러를 발생시킵니다.

Traceback (most recent call last):
  File "Main.py", line 4, in <module>
    a = a * a
MemoryError

BOJ에서 MemoryError는 메모리 초과로 보여주고 있기 때문에, 소스 5의 결과는 메모리 초과입니다.