FloatingPointError란 무엇인가?
FloatingPointError는 부동 소수점(floating point) 연산 과정에서 오류가 발생했을 때 raise되는 파이썬 내장 예외입니다. 다만, 이 예외는 아무 조건에서나 발생하는 것이 아니라 부동 소수점 예외 제어(fpectl) 기능이 활성화되어 있을 때에만 동작한다는 점이 특징입니다.
fpectl 기능을 사용하려면 파이썬 인터프리터 자체가 빌드 시점에 --with-fpectl 플래그와 함께 컴파일되어 있어야 합니다. 즉, 일반적인 배포판으로 설치한 파이썬에서는 이 예외가 발생하지 않을 수 있습니다.
예제 코드로 확인하기
아래 코드는 try-except 구문으로 예외를 처리하고, 발생한 예외의 타입까지 출력하도록 작성되었습니다.
import sys
import math
import fpectl
try:
print('Control off:', math.exp(700))
fpectl.turnon_sigfpe()
print('Control on:', math.exp(1000))
except Exception as e:
print(e)
print(type(e))
코드 설명
math.exp(700)은 표현 가능한 범위 안에 있으므로 정상적으로 계산됩니다. 그러나 fpectl.turnon_sigfpe()로 부동 소수점 예외 제어를 켠 상태에서 math.exp(1000)처럼 오버플로우가 발생하는 연산을 수행하면 FloatingPointError가 raise됩니다.
실행 결과
Control off: 1.01423205474e+304 Control on: in math_1 <class 'FloatingPointError'>
출력 결과를 보면, 예외 제어가 꺼져 있을 때는 큰 숫자도 문제없이 계산되지만, 제어를 켠 후에는 오버플로우가 발생하여 FloatingPointError 예외가 잡힌 것을 확인할 수 있습니다.
주의 사항
이 방식은 주로 구버전 파이썬(Python 2 환경)에서 사용되던 방법입니다. fpectl 모듈은 Python 3.7부터 공식적으로 폐기(deprecated)되었으며, 최신 버전에서는 사용이 권장되지 않습니다. 최신 파이썬에서는 대신 decimal.Decimal 모듈이나 NumPy의 np.errstate() 등을 활용해 부동 소수점 오류를 보다 안전하게 제어하는 것이 좋습니다.