feholdexcept
|
Definido en el encabezado
<fenv.h>
|
||
|
int
feholdexcept
(
fenv_t
*
envp
)
;
|
(desde C99) | |
Primero, guarda el entorno de punto flotante actual en el objeto apuntado por
envp
(similar a
fegetenv
), luego borra todas las banderas de estado de punto flotante, y después instala el modo no interrumpible: las futuras excepciones de punto flotante no interrumpirán la ejecución (no generarán trampas), hasta que el entorno de punto flotante sea restaurado por
feupdateenv
o
fesetenv
.
Esta función puede utilizarse al comienzo de una subrutina que debe ocultar las excepciones de punto flotante que pueda generar al llamador. Si solo se deben suprimir algunas excepciones, mientras que otras deben reportarse, el modo no-stop generalmente termina con una llamada a feupdateenv después de limpiar las excepciones no deseadas.
Contenidos |
Parámetros
| envp | - | puntero al objeto de tipo fenv_t donde se almacenará el entorno de punto flotante |
Valor de retorno
0 en caso de éxito, distinto de cero en caso contrario.
Ejemplo
#include <stdio.h> #include <fenv.h> #include <float.h> #pragma STDC FENV_ACCESS ON void show_fe_exceptions(void) { printf("current 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"); if(fetestexcept(FE_ALL_EXCEPT)==0) printf(" none"); printf("\n"); } double x2 (double x) /* times two */ { fenv_t curr_excepts; /* Save and clear current f-p environment. */ feholdexcept(&curr_excepts); /* Raise inexact and overflow exceptions. */ printf("In x2(): x = %f\n", x=x*2.0); show_fe_exceptions(); feclearexcept(FE_INEXACT); /* hide inexact exception from caller */ /* Merge caller's exceptions (FE_INVALID) */ /* with remaining x2's exceptions (FE_OVERFLOW). */ feupdateenv(&curr_excepts); return x; } int main(void) { feclearexcept(FE_ALL_EXCEPT); feraiseexcept(FE_INVALID); /* some computation with invalid argument */ show_fe_exceptions(); printf("x2(DBL_MAX) = %f\n", x2(DBL_MAX)); show_fe_exceptions(); return 0; }
Salida:
current exceptions raised: FE_INVALID In x2(): x = inf current exceptions raised: FE_INEXACT FE_OVERFLOW x2(DBL_MAX) = inf current exceptions raised: FE_INVALID FE_OVERFLOW
Referencias
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.6.4.2 La función feholdexcept (p: 213-214)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.6.4.2 La función feholdexcept (p: 194-195)
Véase también
|
(C99)
|
restaura el entorno de punto flotante y genera las excepciones previamente generadas
(función) |
|
(C99)
|
guarda o restaura el entorno actual de punto flotante
(función) |
|
(C99)
|
entorno predeterminado de punto flotante
(constante macro) |
|
Documentación de C++
para
feholdexcept
|
|