Namespaces
Variants

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From es.cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
MATH_ERRNO MATH_ERRNOEXCEPT
(C99) (C99)
math_errhandling
(C99)

Fast operation indicators
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