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  /*определено реализацией*/
(начиная с 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