파이썬에서 산술 연산의 결과가 해당 변수 타입이 표현할 수 있는 범위를 초과하면 OverflowError가 발생합니다. 다만 예외 동작은 데이터 타입에 따라 조금씩 다릅니다.
- 정수(Integer): 일반 정수는 값이 커질 때 필요에 따라 자동으로 long 타입으로 변환되며, long 정수는 값이 증가함에 따라 더 많은 메모리를 동적으로 할당하기 때문에 오버플로우 대신 MemoryError가 발생할 수 있습니다.
- 부동 소수점(Float): 부동 소수점 연산의 오버플로우 처리는 표준화되어 있지 않으며, 표현 가능한 최대값을 초과하면 OverflowError가 발생합니다.
따라서 큰 수를 다루는 부동 소수점 연산을 수행할 때는 try-except 블록을 사용해 OverflowError를 적절히 처리하는 것이 좋습니다.
예제 코드
아래 코드는 반복적으로 거듭제곱 연산을 수행하다가 오버플로우가 발생하면 이를 잡아서(catch) 처리하는 예제입니다.
i = 1
try:
f = 3.0 ** i
for i in range(100):
print(i, f)
f = f ** 2
except OverflowError as err:
print('Overflowed after', f, err)실행 결과
위 코드를 실행하면 부동 소수점 값이 계속 제곱되다가 표현 한계를 초과하는 시점에 OverflowError가 발생하며, 다음과 같은 출력 결과를 얻습니다.
Floating point values: 0 3.0 1 9.0 2 81.0 3 6561.0 4 43046721.0 5 1.85302018885e+15 6 3.43368382029e+30 7 1.17901845777e+61 8 1.39008452377e+122 9 1.93233498323e+244 Overflowed after 1.93233498323e+244 (34, 'Result too large')
코드 설명
f = f ** 2: 매 반복마다 값을 제곱하여 숫자가 기하급수적으로 커집니다.- 값이 부동 소수점으로 표현할 수 있는 최대 범위(약 1.8 × 10308)를 넘어서는 순간 OverflowError가 발생합니다.
except OverflowError as err: 예외 객체를err에 담아 오버플로우가 발생한 시점의 값과 에러 메시지('Result too large')를 함께 출력합니다.
이처럼 try-except 구문을 활용하면 프로그램이 비정상 종료되지 않고, 오버플로우 상황을 감지하여 로그를 남기거나 대체 로직을 실행하는 등 안정적인 예외 처리를 할 수 있습니다.