La función fegetenv() en C/C++ se especifica en el archivo de encabezado cfenv.h e intenta almacenar el estado actual del entorno de coma flotante en el objeto señalado por envp . El entorno de punto flotante es un conjunto de indicadores de estado y modos de control que incluye tanto la excepción de punto flotante como el modo de dirección de redondeo.
Sintaxis:
int fegetenv( fenv_t* envp )
Parámetro: la función acepta un parámetro obligatorio envp que especifica un objeto donde se almacena el estado del entorno de coma flotante.
Valor de retorno: la función devuelve dos valores como se muestra a continuación:
- En caso de éxito, devuelve cero.
- En caso de falla, devuelve distinto de cero.
Los siguientes programas ilustran la función anterior:
Programa 1:
// C++ program to illustrate // fegetenv() function #include <bits/stdc++.h> using namespace std; // rounding direction mode void rounding_mode() { cout << "Rounding mode is ->"; switch (fegetround()) { case FE_TONEAREST: // Round to nearest cout << "FE_TONEAREST" << endl; break; case FE_DOWNWARD: // Round downward cout << "FE_DOWNWARD" << endl; break; case FE_UPWARD: // Round upward cout << "FE_UPWARD" << endl; break; case FE_TOWARDZERO: // Round toward zero cout << "FE_TOWARDZERO" << endl; break; default: cout << "unknown" << endl; }; } int main(void) { fenv_t envp; // initial environment cout << "Initial environment :" << endl; // print the exception raised initially cout << "Exception raised -> \n"; if (fetestexcept(FE_ALL_EXCEPT)) { if (fetestexcept(FE_DIVBYZERO)) cout << "FE_DIVBYZERO " << endl; if (fetestexcept(FE_INEXACT)) cout << "FE_INEXACT " << endl; if (fetestexcept(FE_INVALID)) cout << "FE_INVALID " << endl; if (fetestexcept(FE_OVERFLOW)) cout << "FE_OVERFLOW " << endl; if (fetestexcept(FE_UNDERFLOW)) cout << "FE_UNDERFLOW " << endl; } else cout << "None" << endl; // print the rounding direction mode rounding_mode(); // Current environment fegetenv(&envp); feraiseexcept(FE_INVALID); // Set rounding direction mode fesetround(FE_DOWNWARD); // after environment is change cout << endl << "Final environment :" << endl; // print the exception raised cout << "Exception raised -> \n"; if (fetestexcept(FE_ALL_EXCEPT)) { if (fetestexcept(FE_DIVBYZERO)) cout << "FE_DIVBYZERO " << endl; if (fetestexcept(FE_INEXACT)) cout << "FE_INEXACT " << endl; if (fetestexcept(FE_INVALID)) cout << "FE_INVALID " << endl; if (fetestexcept(FE_OVERFLOW)) cout << "FE_OVERFLOW " << endl; if (fetestexcept(FE_UNDERFLOW)) cout << "FE_UNDERFLOW " << endl; } else cout << "None" << endl; // print the rounding direction mode rounding_mode(); return 0; }
Initial environment : Exception raised -> None Rounding mode is ->FE_TONEAREST Final environment : Exception raised -> FE_INVALID Rounding mode is ->FE_DOWNWARD
Programa 2:
// C++ program to illustrate // fegetenv() function #include <bits/stdc++.h> using namespace std; // rounding direction mode void rounding_mode() { cout << "Rounding mode is ->"; switch (fegetround()) { case FE_TONEAREST: // Round to nearest cout << "FE_TONEAREST" << endl; break; case FE_DOWNWARD: // Round downward cout << "FE_DOWNWARD" << endl; break; case FE_UPWARD: // Round upward cout << "FE_UPWARD" << endl; break; case FE_TOWARDZERO: // Round toward zero cout << "FE_TOWARDZERO" << endl; break; default: cout << "unknown" << endl; }; } int main(void) { fenv_t envp; // initial environment cout << "Initial environment :" << endl; // print the exception raised initially cout << "Exception raised -> \n"; if (fetestexcept(FE_ALL_EXCEPT)) { if (fetestexcept(FE_DIVBYZERO)) cout << "FE_DIVBYZERO " << endl; if (fetestexcept(FE_INEXACT)) cout << "FE_INEXACT " << endl; if (fetestexcept(FE_INVALID)) cout << "FE_INVALID " << endl; if (fetestexcept(FE_OVERFLOW)) cout << "FE_OVERFLOW " << endl; if (fetestexcept(FE_UNDERFLOW)) cout << "FE_UNDERFLOW " << endl; } else cout << "None" << endl; // print the rounding direction mode rounding_mode(); // Current environment fegetenv(&envp); feraiseexcept(FE_ALL_EXCEPT); // Set rounding direction mode fesetround(FE_DOWNWARD); // after environment is change cout << endl << "Final environment :" << endl; // print the exception raised cout << "Exception raised -> \n"; if (fetestexcept(FE_ALL_EXCEPT)) { if (fetestexcept(FE_DIVBYZERO)) cout << "FE_DIVBYZERO " << endl; if (fetestexcept(FE_INEXACT)) cout << "FE_INEXACT " << endl; if (fetestexcept(FE_INVALID)) cout << "FE_INVALID " << endl; if (fetestexcept(FE_OVERFLOW)) cout << "FE_OVERFLOW " << endl; if (fetestexcept(FE_UNDERFLOW)) cout << "FE_UNDERFLOW " << endl; } else cout << "None" << endl; // print the rounding direction mode rounding_mode(); return 0; }
Initial environment : Exception raised -> None Rounding mode is ->FE_TONEAREST Final environment : Exception raised -> FE_DIVBYZERO FE_INEXACT FE_INVALID FE_OVERFLOW FE_UNDERFLOW Rounding mode is ->FE_DOWNWARD
Publicación traducida automáticamente
Artículo escrito por AmanSrivastava1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA