Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
MATH_ERRNO MATH_ERRNOEXCEPT
(C99) (C99)
math_errhandling
(C99)

Fast operation indicators
헤더 파일에 정의됨 <math.h>
#define MATH_ERRNO        1
(C99부터)
#define MATH_ERREXCEPT    2
(C99부터)
#define math_errhandling  /*implementation defined*/
(C99부터)

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

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

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

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

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

조건 설명 errno floating-point exception 예제
Domain error 인자가 연산이 수학적으로 정의된 범위를 벗어난 경우 ( 각 함수 의 설명에서 필요한 도메인 오류를 나열함) EDOM FE_INVALID acos ( 2 )
Pole error 함수의 수학적 결과가 정확히 무한대이거나 정의되지 않은 경우 ERANGE FE_DIVBYZERO log ( 0.0 ) , 1.0 / 0.0
Range error due to overflow 수학적 결과는 유한하지만, 반올림 후 무한대가 되거나 내림 후 표현 가능한 최대 유한 값이 되는 경우 ERANGE FE_OVERFLOW pow ( DBL_MAX , 2 )
Range error due to underflow 결과가 0이 아니지만 반올림 후 0이 되거나, 정밀도 손실과 함께 서브노멀이 되는 경우 ERANGE 또는 변경 없음 (구현 정의) FE_UNDERFLOW 또는 없음 (구현 정의) DBL_TRUE_MIN / 2
Inexact result 결과가 대상 타입에 맞도록 반올림되어야 하는 경우 변경 없음 FE_INEXACT 또는 없음 (명시되지 않음) sqrt ( 2 ) , 1.0 / 10.0

목차

참고 사항

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

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

예제

#include <stdio.h>
#include <fenv.h>
#include <math.h>
#include <errno.h>
#pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("MATH_ERRNO is %s\n", math_errhandling & MATH_ERRNO ? "set" : "not set");
    printf("MATH_ERREXCEPT is %s\n",
           math_errhandling & MATH_ERREXCEPT ? "set" : "not set");
    feclearexcept(FE_ALL_EXCEPT);
    errno = 0;
    printf("log(0) = %f\n", log(0));
    if(errno == ERANGE)
        perror("errno == ERANGE");
    if(fetestexcept(FE_DIVBYZERO))
        puts("FE_DIVBYZERO (pole error) reported");
}

가능한 출력:

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

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 170)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (p: 377)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 233)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (p: 517)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 214)
  • F.9/4 MATH_ERREXCEPT, math_errhandling> (p: 454)

참고 항목

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