MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<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
|
|