FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
|
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 | \
|
(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
|
(C99)
(C99)
(C99)
|
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
|
|