MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовке
<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
|
|