Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ feclearexcept() 함수 완벽 가이드 – 부동 소수점 예외 초기화 방법

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

코드 설명

위 예제의 동작 순서는 다음과 같습니다.

  1. #pragma STDC FENV_ACCESS on을 선언하여 프로그램이 부동 소수점 환경에 접근할 수 있도록 활성화합니다.
  2. feclearexcept(FE_ALL_EXCEPT)를 호출하여 기존에 발생했던 모든 부동 소수점 예외 플래그를 초기화합니다.
  3. sqrt(-5)를 실행하면 음수에 대한 제곱근 연산은 수학적으로 정의되지 않으므로 FE_INVALID 예외가 발생합니다.
  4. fetestexcept(FE_INVALID)로 해당 예외가 설정되었는지 검사하고, 조건이 참이면 메시지를 출력합니다.

이처럼 feclearexcept()는 새로운 연산을 수행하기 전에 이전 예외 상태를 깨끗하게 지워야 할 때 유용하게 사용됩니다. 특히 수치 계산 라이브러리나 과학 연산 코드에서 오류 상태를 정확하게 추적하는 데 필수적인 함수입니다.