- 채점
- 런타임 에러
- 런타임 에러 (OverflowError)
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을 제곱근을 출력하는 소스
101234는 float
으로 표현할 수 없는 값이기 때문에, 다음과 같은 런타임 에러가 발생합니다.
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의 결과는 메모리 초과입니다.