Open In App

fegetenv() function in C/C++

Last Updated : 25 Sep, 2018
Comments
Improve
Suggest changes
Like Article
Like
Report
The fegetenv() function in C/C++ is specified in header file cfenv.h and attempts to store the current state of the floating-point environment in the object pointed by envp. The floating point environment is a set of status flags and control modes which includes both floating point exception and the rounding direction mode. Syntax:
int fegetenv( fenv_t* envp )
Parameter : The function accepts one mandatory parameter envp which specifies an object where the state of the floating-point environment is stored. Return value: The function returns two values as below:
  • On success, It returns zero.
  • On failure, It returns nonzero.
Below programs illustrate the above function: Program 1 : CPP
// 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;
}
Output:
Initial environment :
Exception raised -> 
None
Rounding mode is ->FE_TONEAREST

Final environment :
Exception raised -> 
FE_INVALID 
Rounding mode is ->FE_DOWNWARD
Program 2 : CPP
// 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;
}
Output:
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

Next Article
Article Tags :
Practice Tags :

Similar Reads