MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
Определено в заголовке
<cmath>
|
||
|
#define MATH_ERRNO 1
|
(начиная с C++11) | |
|
#define MATH_ERREXCEPT 2
|
(начиная с C++11) | |
|
#define math_errhandling /*определено реализацией*/
|
(начиная с C++11) | |
Макроконстанта
math_errhandling
раскрывается в выражение типа
int
, которое может быть равно либо
MATH_ERRNO
, либо
MATH_ERREXCEPT
, либо их побитовому ИЛИ (
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 должно быть ненулевым.
Распознаются следующие условия ошибок с плавающей точкой:
| Условие | Объяснение | 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 ) |
| Ошибка диапазона из-за потери значимости | Результат ненулевой, но становится нулевым после округления, или становится субнормальным с потерей точности | ERANGE или неизмененным (определяется реализацией) | FE_UNDERFLOW или ничего (определяется реализацией) | DBL_TRUE_MIN / 2 |
| Неточный результат | Результат должен быть округлен для соответствия целевому типу | Неизмененным | FE_INEXACT или ничего (не указано) | std:: sqrt ( 2 ) , 1.0 / 10.0 |
Примечания
Будет ли FE_INEXACT возбуждаться математическими библиотечными функциями, в общем случае не специфицировано, но может быть явно указано в описании функции (например, std::rint против 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-совместимую thread-local переменную номера ошибки
(макропеременная) |
|
|
Документация C
для
math_errhandling
|
|