función fegetenv() en C/C++

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;
}
Producción:

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;
}
Producción:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *