MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
Definido en el encabezado
<math.h>
|
||
|
#define MATH_ERRNO 1
|
(desde C99) | |
|
#define MATH_ERREXCEPT 2
|
(desde C99) | |
|
#define math_errhandling /*implementation defined*/
|
(desde C99) | |
La macro constante
math_errhandling
se expande a una expresión de tipo
int
que es igual a
MATH_ERRNO
, o igual a
MATH_ERREXCEPT
, o igual a su operación OR bit a bit (
MATH_ERRNO
|
MATH_ERREXCEPT
).
El valor de
math_errhandling
indica el tipo de manejo de errores que realizan los operadores de punto flotante y las
funciones
:
| Constante | Explicación |
MATH_ERREXCEPT
|
indica que se utilizan excepciones de punto flotante: al menos
FE_DIVBYZERO
,
FE_INVALID
, y
FE_OVERFLOW
están definidas en
<fenv.h>
.
|
MATH_ERRNO
|
indica que las operaciones de punto flotante utilizan la variable errno para reportar errores. |
Si la implementación soporta aritmética de punto flotante IEEE (IEC 60559), math_errhandling & MATH_ERREXCEPT debe ser distinto de cero.
Se reconocen las siguientes condiciones de error de punto flotante:
| Condición | Explicación | errno | excepción de punto flotante | Ejemplo |
|---|---|---|---|---|
| Error de dominio | el argumento está fuera del rango en el que la operación está matemáticamente definida (la descripción de cada función enumera los errores de dominio requeridos) | EDOM | FE_INVALID | acos ( 2 ) |
| Error de polo | el resultado matemático de la función es exactamente infinito o indefinido | ERANGE | FE_DIVBYZERO | log ( 0.0 ) , 1.0 / 0.0 |
| Error de rango por desbordamiento | el resultado matemático es finito, pero se vuelve infinito después del redondeo, o se convierte en el mayor valor finito representable después del redondeo hacia abajo | ERANGE | FE_OVERFLOW | pow ( DBL_MAX , 2 ) |
| Error de rango por subdesbordamiento | el resultado es distinto de cero, pero se vuelve cero después del redondeo, o se vuelve subnormal con una pérdida de precisión | ERANGE o sin cambios (definido por la implementación) | FE_UNDERFLOW o nada (definido por la implementación) | DBL_TRUE_MIN / 2 |
| Resultado inexacto | el resultado debe redondearse para ajustarse al tipo de destino | sin cambios | FE_INEXACT o nada (no especificado) | sqrt ( 2 ) , 1.0 / 10.0 |
Contenidos |
Notas
Si las funciones de la biblioteca matemática generan FE_INEXACT no está especificado en general, pero puede estar explícitamente especificado en la descripción de la función (por ejemplo, rint versus nearbyint ).
Antes de C99, las excepciones de punto flotante no estaban especificadas, EDOM era requerido para cualquier error de dominio, ERANGE era requerido para desbordamientos y definido por la implementación para subdesbordamientos.
Ejemplo
#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"); }
Salida posible:
MATH_ERRNO is set MATH_ERREXCEPT is set log(0) = -inf errno = ERANGE: Numerical result out of range FE_DIVBYZERO (pole error) reported
Referencias
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 170)
-
- F.10/4 MATH_ERREXCEPT, math_errhandling (p: 377)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 233)
-
- F.10/4 MATH_ERREXCEPT, math_errhandling (p: 517)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 214)
-
- F.9/4 MATH_ERREXCEPT, math_errhandling> (p: 454)
Véase también
|
excepciones de punto flotante
(constante macro) |
|
|
macro que se expande a variable de número de error local al hilo compatible con POSIX
(variable macro) |
|
|
Documentación de C++
para
math_errhandling
|
|