fenv — 부동 소수점 환경

fenv — 부동 소수점 환경 (Floating-point environment)

**부동 소수점 환경(floating-point environment)**은 구현이 지원하는 **부동 소수점 상태 플래그(status flags)와 제어 모드(control modes)**의 집합이에요.

스레드 지역(thread-local)이에요. 각 스레드는 부모 스레드로부터 자기 부동 소수점 환경의 초기 상태를 상속받아요. 부동 소수점 연산은 상태 플래그를 수정해 비정상 결과나 보조 정보를 나타내요. 제어 모드의 상태는 일부 부동 소수점 연산의 결과에 영향을 줘요.

출처: cppreference

본문

부동 소수점 환경 관리는 <cfenv>(C의 <fenv.h>) 헤더가 제공해요.

상태 플래그 (Status flags)

연산 결과를 나타내는 플래그들이에요.

플래그 설명
FE_INEXACT 결과가 정확하지 않음 (반올림 발생)
FE_UNDERFLOW 언더플로
FE_OVERFLOW 오버플로
FE_DIVBYZERO 0으로 나눔
FE_INVALID 잘못된 연산 (예: √-1)
#include <cfenv>
#include <cmath>

std::feclearexcept(FE_ALL_EXCEPT);   // 플래그 초기화

double x = std::sqrt(-1.0);          // NaN — FE_INVALID 발생
if (std::fetestexcept(FE_INVALID)) {
    // 잘못된 연산 플래그 확인
}

제어 모드 (Control modes)

반올림 방향 같은 연산 결과에 영향을 주는 설정이에요.

모드 설명
FE_TONEAREST 가장 가까운 값으로 반올림 (기본)
FE_DOWNWARD 아래로 (음의 무한 방향)
FE_UPWARD 위로 (양의 무한 방향)
FE_TOWARDZERO 0 방향으로
#include <cfenv>
#include <cmath>

std::fesetround(FE_UPWARD);          // 반올림 방향 설정
double r = std::round(2.5);          // 3.0 (위로)
std::fesetround(FE_TONEAREST);

특징

  • 부동 소수점 환경은 스레드 지역이에요. 한 스레드에서 바꿔도 다른 스레드에 영향 없음.
  • 상태 플래그와 제어 모드는 구현이 지원하지 않을 수도 있고, <cfenv>의 매크로로 확인·제어돼요.
  • 정밀한 수치 해석(금융, 과학 계산)에 유용해요.

부동 소수점 환경을 다루는 것은 반올림 오차와 특수 값(NaN, 무한대)을 정밀하게 제어해야 하는 수치 코드에서 중요해요.

더 알아보기 (Learn more)

cppreference