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

Макроконстанта math_errhandling раскрывается в выражение типа int , которое может быть равно либо MATH_ERRNO , либо MATH_ERREXCEPT , либо их побитовому ИЛИ ( 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 должно быть ненулевым значением.

Распознаются следующие условия ошибок с плавающей точкой:

Условие Объяснение errno исключение с плавающей точкой Пример
Ошибка области определения аргумент находится вне диапазона, в котором операция математически определена (описание каждой функции перечисляет требуемые ошибки области определения) EDOM FE_INVALID acos ( 2 )
Ошибка полюса математический результат функции является точно бесконечным или неопределенным ERANGE FE_DIVBYZERO log ( 0.0 ) , 1.0 / 0.0
Ошибка диапазона из-за переполнения математический результат конечен, но становится бесконечным после округления или становится наибольшим представимым конечным значением после округления вниз ERANGE FE_OVERFLOW pow ( DBL_MAX , 2 )
Ошибка диапазона из-за потери значимости результат ненулевой, но становится нулевым после округления или становится субнормальным с потерей точности ERANGE или неизмененным (определяется реализацией) FE_UNDERFLOW или ничего (определяется реализацией) DBL_TRUE_MIN / 2
Неточный результат результат должен быть округлен для соответствия целевому типу неизмененным FE_INEXACT или ничего (не указано) sqrt ( 2 ) , 1.0 / 10.0

Содержание

Примечания

Вызывает ли FE_INEXACT математические библиотечные функции, в общем случае не специфицировано, но может быть явно указано в описании функции (например, rint против 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 (стр: 170)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (стр: 377)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (стр: 233)
  • F.10/4 MATH_ERREXCEPT, math_errhandling (стр: 517)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (стр: 214)
  • F.9/4 MATH_ERREXCEPT, math_errhandling> (стр: 454)

Смотрите также

исключения с плавающей точкой
(макроконстанта)
макрос, раскрывающийся в POSIX-совместимую thread-local переменную номера ошибки
(макропеременная)
Документация C++ для math_errhandling