Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
math_errhandling MATH_ERRNO MATH_ERREXCEPT
(C++11)
(C++11)
(C++11)
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