Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
math_errhandling MATH_ERRNO MATH_ERREXCEPT
(C++11)
(C++11)
(C++11)
헤더 파일에 정의됨 <cmath>
#define MATH_ERRNO        1
(C++11부터)
#define MATH_ERREXCEPT    2
(C++11부터)
#define math_errhandling  /*implementation defined*/
(C++11부터)

매크로 상수 math_errhandling int 타입의 표현식으로 확장되며, 이는 MATH_ERRNO 와 같거나, MATH_ERREXCEPT 와 같거나, 또는 이들의 비트 OR ( MATH_ERRNO | MATH_ERREXCEPT )과 같습니다.

math_errhandling 의 값은 부동 소수점 연산자와 함수들 에 의해 수행되는 오류 처리 유형을 나타냅니다:

상수 설명
MATH_ERREXCEPT 부동 소수점 예외가 사용됨을 나타냅니다: 최소한 FE_DIVBYZERO , FE_INVALID , 그리고 FE_OVERFLOW <cfenv> 에 정의되어 있습니다.
MATH_ERRNO 부동 소수점 연산이 errno 변수를 사용하여 오류를 보고함을 나타냅니다.

구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우, math_errhandling & MATH_ERREXCEPT 는 0이 아니어야 합니다.

다음 부동 소수점 오류 조건이 인식됩니다:

조건 설명 errno 부동 소수점 예외 예시
정의역 오류 인수가 연산이 수학적으로 정의된 범위를 벗어남 ( 각 함수 설명에서 필요한 정의역 오류 목록을 확인) EDOM FE_INVALID std:: acos ( 2 )
극점 오류 함수의 수학적 결과가 정확히 무한대이거나 정의되지 않음 ERANGE FE_DIVBYZERO std:: log ( 0.0 ) , 1.0 / 0.0
오버플로로 인한 범위 오류 수학적 결과는 유한하지만, 반올림 후 무한대가 되거나 내림 후 표현 가능한 최대 유한 값이 됨 ERANGE FE_OVERFLOW std:: pow ( DBL_MAX , 2 )
언더플로로 인한 범위 오류 결과가 0이 아니지만 반올림 후 0이 되거나, 정밀도 손실과 함께 비정규 수가 됨 ERANGE 또는 변경 없음 (구현 정의) FE_UNDERFLOW 또는 없음 (구현 정의) DBL_TRUE_MIN / 2
부정확한 결과 결과가 대상 타입에 맞도록 반올림되어야 함 변경 없음 FE_INEXACT 또는 없음 (명시되지 않음) std:: sqrt ( 2 ) , 1.0 / 10.0

참고 사항

수학 라이브러리 함수들에 의해 FE_INEXACT 가 발생하는지 여부는 일반적으로 명시되어 있지 않지만, 함수 설명에서 명시적으로 지정될 수 있습니다 (예: std::rint vs std::nearbyint ).

C++11 이전에는 부동 소수점 예외가 명시되지 않았으며, EDOM 은 모든 정의역 오류에 필요했고, ERANGE 은 오버플로우에 필요했으며 언더플로우는 구현에 따라 정의되었습니다.

예제

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::cout << "MATH_ERRNO is "
              << (math_errhandling & MATH_ERRNO ? "set" : "not set") << '\n'
              << "MATH_ERREXCEPT is "
              << (math_errhandling & MATH_ERREXCEPT ? "set" : "not set") << '\n';
    std::feclearexcept(FE_ALL_EXCEPT);
    errno = 0;
    std::cout <<  "log(0) = " << std::log(0) << '\n';
    if (errno == ERANGE)
        std::cout << "errno = ERANGE (" << std::strerror(errno) << ")\n";
    if (std::fetestexcept(FE_DIVBYZERO))
        std::cout << "FE_DIVBYZERO (pole error) reported\n";
}

가능한 출력:

MATH_ERRNO is set
MATH_ERREXCEPT is set
log(0) = -inf
errno = ERANGE (Numerical result out of range)
FE_DIVBYZERO (pole error) reported

참고 항목

부동소수점 예외
(매크로 상수)
POSIX-호환 스레드 지역 오류 번호 변수로 확장되는 매크로
(매크로 변수)
C 문서 for math_errhandling