C++ feclearexcept() 함수란?
feclearexcept() 함수는 <fenv.h> 헤더에 정의된 함수로, 인자로 전달된 excepts 비트 마스크에 해당하는 지원되는 부동 소수점 예외(floating-point exception)들을 초기화(클리어)하는 데 사용됩니다.
이 함수는 모든 예외가 성공적으로 해제되었거나 전달된 예외 값이 0인 경우 0을 반환합니다. 반면 일부 예외가 해제되지 못하면 0이 아닌 값(nonzero)을 반환합니다.
또한 이 함수를 사용하려면 먼저 FENV_ACCESS를 활성화해야 합니다. 이를 통해 프로그램이 부동 소수점 환경(floating-point environment)에 접근할 수 있게 되어, 발생한 예외를 테스트하고 제어할 수 있습니다.
주요 부동 소수점 예외 매크로
- FE_INVALID – 잘못된 연산 예외 (예: 음수의 제곱근)
- FE_DIVBYZERO – 0으로 나누기 예외
- FE_OVERFLOW – 오버플로우 예외
- FE_UNDERFLOW – 언더플로우 예외
- FE_INEXACT – 부정확한 결과 예외
- FE_ALL_EXCEPT – 위의 모든 예외를 포함하는 매크로
예제 코드
#include <fenv.h>
#include <iostream>
#include <cmath>
#pragma STDC FENV_ACCESS on
using namespace std;
int main() {
feclearexcept(FE_ALL_EXCEPT);
sqrt(-5);
if (fetestexcept(FE_INVALID))
cout << "sqrt(-5) will generate FE_INVALID" << endl;
}출력 결과
sqrt(-5) will generate FE_INVALID
코드 설명
위 예제의 동작 순서는 다음과 같습니다.
#pragma STDC FENV_ACCESS on을 선언하여 프로그램이 부동 소수점 환경에 접근할 수 있도록 활성화합니다.feclearexcept(FE_ALL_EXCEPT)를 호출하여 기존에 발생했던 모든 부동 소수점 예외 플래그를 초기화합니다.sqrt(-5)를 실행하면 음수에 대한 제곱근 연산은 수학적으로 정의되지 않으므로 FE_INVALID 예외가 발생합니다.fetestexcept(FE_INVALID)로 해당 예외가 설정되었는지 검사하고, 조건이 참이면 메시지를 출력합니다.
이처럼 feclearexcept()는 새로운 연산을 수행하기 전에 이전 예외 상태를 깨끗하게 지워야 할 때 유용하게 사용됩니다. 특히 수치 계산 라이브러리나 과학 연산 코드에서 오류 상태를 정확하게 추적하는 데 필수적인 함수입니다.