Namespaces
Variants

FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT

From cppreference.net
< c ‎ | numeric ‎ | fenv
Definido en el encabezado <fenv.h>
#define FE_DIVBYZERO    /*implementation defined power of 2*/
(desde C99)
#define FE_INEXACT      /*implementation defined power of 2*/
(desde C99)
#define FE_INVALID      /*implementation defined power of 2*/
(desde C99)
#define FE_OVERFLOW     /*implementation defined power of 2*/
(desde C99)
#define FE_UNDERFLOW    /*implementation defined power of 2*/
(desde C99)
#define FE_ALL_EXCEPT  FE_DIVBYZERO | FE_INEXACT | \

FE_INVALID | FE_OVERFLOW |  \

FE_UNDERFLOW
(desde C99)

Todas estas constantes de macro (excepto FE_ALL_EXCEPT ) se expanden a expresiones constantes enteras que son distintas potencias de 2, que identifican de manera única todas las excepciones de punto flotante soportadas. Cada macro solo se define si está soportada.

La macro constante FE_ALL_EXCEPT , que se expande al OR bit a bit de todas las demás FE_* , siempre está definida y es cero si las excepciones de punto flotante no son compatibles con la implementación.

Constante Explicación
FE_DIVBYZERO error de polo ocurrido en una operación de punto flotante anterior
FE_INEXACT resultado inexacto: fue necesario redondear para almacenar el resultado de una operación de punto flotante anterior
FE_INVALID error de dominio ocurrido en una operación de punto flotante anterior
FE_OVERFLOW el resultado de una operación de punto flotante anterior era demasiado grande para ser representable
FE_UNDERFLOW el resultado de una operación de punto flotante anterior era subnormal con una pérdida de precisión
FE_ALL_EXCEPT OR bit a bit de todas las excepciones de punto flotante soportadas

La implementación puede definir constantes macro adicionales en <fenv.h> para identificar excepciones de punto flotante adicionales. Todas estas constantes comienzan con FE_ seguido de al menos una letra mayúscula.

Consulte math_errhandling para más detalles.

Ejemplo

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
void show_fe_exceptions(void)
{
    printf("exceptions raised:");
    if(fetestexcept(FE_DIVBYZERO)) printf(" FE_DIVBYZERO");
    if(fetestexcept(FE_INEXACT))   printf(" FE_INEXACT");
    if(fetestexcept(FE_INVALID))   printf(" FE_INVALID");
    if(fetestexcept(FE_OVERFLOW))  printf(" FE_OVERFLOW");
    if(fetestexcept(FE_UNDERFLOW)) printf(" FE_UNDERFLOW");
    feclearexcept(FE_ALL_EXCEPT);
    printf("\n");
}
int main(void)
{
    printf("MATH_ERREXCEPT is %s\n",
           math_errhandling & MATH_ERREXCEPT ? "set" : "not set");
    printf("0.0/0.0 = %f\n", 0.0/0.0);
    show_fe_exceptions();
    printf("1.0/0.0 = %f\n", 1.0/0.0);
    show_fe_exceptions();
    printf("1.0/10.0 = %f\n", 1.0/10.0);
    show_fe_exceptions();
    printf("sqrt(-1) = %f\n", sqrt(-1));
    show_fe_exceptions();
    printf("DBL_MAX*2.0 = %f\n", DBL_MAX*2.0);
    show_fe_exceptions();
    printf("nextafter(DBL_MIN/pow(2.0,52),0.0) = %.1f\n",
                      nextafter(DBL_MIN/pow(2.0,52),0.0));
    show_fe_exceptions();
}

Salida posible:

MATH_ERREXCEPT is set
0.0/0.0 = nan
exceptions raised: FE_INVALID
1.0/0.0 = inf
exceptions raised: FE_DIVBYZERO
1.0/10.0 = 0.100000
exceptions raised: FE_INEXACT
sqrt(-1) = -nan
exceptions raised: FE_INVALID
DBL_MAX*2.0 = inf
exceptions raised: FE_INEXACT FE_OVERFLOW
nextafter(DBL_MIN/pow(2.0,52),0.0) = 0.0
exceptions raised: FE_INEXACT FE_UNDERFLOW

Referencias

  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.6/6 Entorno de punto flotante <fenv.h> (p: 207)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.6/5 Entorno de punto flotante <fenv.h> (p: 188)

Véase también

define el mecanismo de manejo de errores utilizado por las funciones matemáticas comunes
(macro constante)
Documentación de C++ para macros de excepción de punto flotante