feholdexcept() en C/C++

La función feholdexcept() en C/C++ primero guarda el entorno de coma flotante actual en el objeto de fenv_t y luego restablece los valores actuales de todas las banderas de estado de coma flotante. La función feholdexcept() se define en el archivo de encabezado cfenv en C++ y en el archivo de encabezado fenv.h en C
Sintaxis: 
 

int feholdexcept( fenv_t* envp )

Parámetros: la función acepta un solo parámetro obligatorio envp que es un puntero a un objeto 
de tipo fenv_t que almacena el estado actual del entorno de coma flotante.
Valor devuelto: la función devuelve un valor int en dos condiciones: 
 

  • Si la función se completó con éxito, devuelve 0.
  • En caso de falla, devuelve un entero distinto de cero.

Los siguientes programas ilustran la función anterior. 
Programa 1: 
 

CPP

// C++ program to illustrate the
// feholdexcept() function
#include <bits/stdc++.h>
#pragma STDC FENV_ACCESS on
 
// function to divide
double divide(double x, double y)
{
    // environment variable
    fenv_t envp;
 
    // do the division
    double ans = x / y;
 
    // use the function feholdexcept
    feholdexcept(&envp);
 
    // clears exception
    feclearexcept(FE_OVERFLOW | FE_DIVBYZERO);
 
    return ans;
}
 
int main()
{
    // It is a combination of all of
    // the possible floating-point exception
    feclearexcept(FE_ALL_EXCEPT);
    double x = 10;
    double y = 0;
 
    // it returns the division of x and y
    printf("x/y = %f\n", divide(x, y));
 
    // the function does not throw
    // any exception on division by 0
    if (!fetestexcept(FE_ALL_EXCEPT)) {
        printf("No exceptions raised");
    }
    return 0;
}
Producción: 

x/y = inf
No exceptions raised

 

Programa 2: 
 

CPP

// C++ program to illustrate the
// feholdexcept() function
#include <bits/stdc++.h>
#pragma STDC FENV_ACCESS on
using namespace std;
 
// function to print raised exceptions
void raised_exceptions()
{
    cout << "Exceptions raised are : ";
 
    if (fetestexcept(FE_DIVBYZERO))
        cout << " FE_DIVBYZERO\n";
    else if (fetestexcept(FE_INVALID))
        cout << " FE_INVALID\n";
    else if (fetestexcept(FE_OVERFLOW))
        cout << " FE_OVERFLOW\n";
    else if (fetestexcept(FE_UNDERFLOW))
        cout << " FE_UNDERFLOW\n";
    else
        cout << " No exception found\n";
 
    return;
}
 
// Driver code
int main()
{
    // environment variable
    fenv_t envp;
 
    // raise certain exceptions
    feraiseexcept(FE_DIVBYZERO);
    // print the raised exception
    raised_exceptions();
 
    // saves and clears current
    // exceptions by feholdexcept function
    feholdexcept(&envp);
    // no exception found
    raised_exceptions();
 
    // restores the previously
    // saved exceptions
    feupdateenv(&envp);
    raised_exceptions();
 
    return 0;
}
Producción: 

Exceptions raised are :  FE_DIVBYZERO
Exceptions raised are :  No exception found
Exceptions raised are :  FE_DIVBYZERO

 

Publicación traducida automáticamente

Artículo escrito por Aman Goyal 2 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 *