MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
Definido en el encabezado
<cmath>
|
||
|
#define MATH_ERRNO 1
|
(desde C++11) | |
|
#define MATH_ERREXCEPT 2
|
(desde C++11) | |
|
#define math_errhandling /*implementation defined*/
|
(desde C++11) | |
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 <cfenv> . |
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 | std:: acos ( 2 ) |
| Error de polo | El resultado matemático de la función es exactamente infinito o indefinido | ERANGE | FE_DIVBYZERO | std:: 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 | std:: 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) | std:: sqrt ( 2 ) , 1.0 / 10.0 |
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, std::rint versus std::nearbyint ).
Antes de C++11, 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 <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"; }
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
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 C
para
math_errhandling
|
|