MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
| Common mathematical functions | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Mathematical special functions (C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Mathematical constants (C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Basic linear algebra algorithms (C++26) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Data-parallel types (SIMD) (C++26) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Floating-point environment (C++11) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Complex numbers | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric array (
valarray
)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Pseudo-random number generation | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bit manipulation (C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Saturation arithmetic (C++26) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Factor operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Interpolations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Generic numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| C-style checked integer arithmetic | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Nearest integer floating point operations | |||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| Floating point manipulation functions | |||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| Classification and comparison | |||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||
| Types | |||||||||||||||||||||||||||||||||||||||||
| Macro constants | |||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<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
|
|