MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
| Definido en el archivo de encabezado <cmath>
|
||
#define MATH_ERRNO 1 |
(desde C++11) | |
#define MATH_ERREXCEPT 2 |
(desde C++11) | |
#define math_errhandling /*definido por la implementación*/ |
(desde C++11) | |
La constante de macro 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 lógica 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 se definen en <cfenv>.
|
MATH_ERRNO
|
Indica que las operaciones de punto flotante usan la variable errno para reportar errores. |
Si la implementación admite la aritmética de punto flotante IEEE (IEC 60559), se requiere que math_errhandling & MATH_ERREXCEPT sea 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 se define matemáticamente (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 no definido. | ERANGE | FE_DIVBYZERO | std::log(0.0), 1.0/0.0
|
| Error de rango debido a 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 debido a subdesbordamiento | El resultado es distinto de cero, pero se convierte en cero después del redondeo, o se vuelve subnormal con una pérdida de precisión. | ERANGE o sin cambio (definido por la implementación) | FE_UNDERFLOW o nada (definido por la implementación) | DBL_TRUE_MIN/2
|
| Resultado inexacto | El resultado tiene que ser redondeado para encajar en el tipo de destino. | Sin cambio | FE_INEXACT o nada (no especificado) | std::sqrt(2), 1.0/10.0
|
Notas
En general, no se especifica si FE_INEXACT es generado por las funciones de la biblioteca matemática, pero puede especificarse explícitamente en la descripción de la función (por ejemplo, std::rint frente a std::nearbyint).
Antes de C++11, no se especificaban las excepciones de punto flotante, se requería EDOM para cualquier error de dominio, se requería ERANGE para desbordamientos y definido por la implementación para subdesbordamientos.
Ejemplo
#include <iostream>
#include <cfenv>
#include <cmath>
#include <cerrno>
#include <cstring>
#pragma STDC FENV_ACCESS ON
int main()
{
std::cout << "MATH_ERRNO "
<< (math_errhandling & MATH_ERRNO ? "está establecido" : "no está establecido") << '\n'
<< "MATH_ERREXCEPT "
<< (math_errhandling & MATH_ERREXCEPT ? "está establecido" : "no está establecido") << '\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 << "se informó FE_DIVBYZERO (error de polo)\n";
}
Posible salida:
MATH_ERRNO está establecido
MATH_ERREXCEPT está establecido
log(0) = -inf
errno = ERANGE (Resultado numérico fuera de rango)
se informó FE_DIVBYZERO (error de polo)
Véase también
excepciones de punto flotante Original: floating-point exceptions The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (constante de macro) | |
| Macro que se expande para la variable de número de error local al hilo y compatible con POSIX. (variables macro) | |
Documentación de C para math_errhandling
| |