fesetround() and fegetround() in C++ and their application

fesetround()

It sets the specified floating point rounding direction or the “current rounding direction” which is expected to be one of the floating point rounding macros.
It is used with rint(), nearbyint() and other rounding functions in C++.

Syntax:
int fesetround( int round );
where round can be FE_TONEAREST,
FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO
Header File : cfenv
Return : The fesetround() function returns 
0 on success and the rounding direction is applied to the required number.

Errors and Exceptions : The function takes only FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO as arguments, otherwise it returns an error.

Application : fesetround() function can be used with rint(), nearbyint() and other rounding functions of the math header to apply the “current rounding direction”

// C program to illustrate
// fesetround() function with rint() function

#include <cfenv>
#include <cmath>
#include <iostream>
using namespace std;
// Driver Program
int main()
{
    double x = 3.7, result;
    // setting rounding direction to the nearest integer
    fesetround(FE_TONEAREST);
    result = rint(x);
    cout << result << endl;

    // setting rounding direction towards zero
    fesetround(FE_TOWARDZERO);
    result = rint(x);
    cout << result << endl;

    // setting rounding direction to DOWNWARD
    fesetround(FE_DOWNWARD);
    result = rint(x);
    cout << result << endl;

    // setting rounding direction to UPWARD
    fesetround(FE_UPWARD);
    result = rint(x);
    cout << result << endl;

    return 0;
}

Output:

4
3
3
4

fegetround()

It is used to obtain the value of the floating point rounding macro that corresponds to the current rounding direction. It is used with rint(), nearbyint() and other rounding functions in C++.

Syntax : 
int fegetround();
No parameter
Header File : cfenv
Return : The fegetround() function returns the
floating point rounding macro describing the current 
rounding direction.
Rounding Macros:
1.FE_DOWNWARD
2.FE_TONEAREST
3.FE_TOWARDZERO
4.FE_UPWARD

Errors and Exceptions :

  1. The function does not take any arguments, therefore returns an error if a parameter is passed
  2. If no rounding direction is specified using fesetround(), it returns the macro FE_TONEAREST

Application : fegetround() function can be used with rint(), nearbyint() and other rounding functions of the math header to get the “current rounding direction” using macros.

In this program we will be checking and printing the macro returned by the fegetround() function.

// C program to illustrate
// fegetround() function with
// rint() function using switch case

#include <cfenv>
#include <cmath>
#include <iostream>
#pragma STDC FENV_ACCESS ON
using namespace std;

void direction()
{
    switch (fegetround()) {
    case FE_TONEAREST:
        cout << "FE_TONEAREST";
        break;
    case FE_DOWNWARD:
        cout << "FE_DOWNWARD";
        break;
    case FE_UPWARD:
        cout << "FE_UPWARD";
        break;
    case FE_TOWARDZERO:
        cout << "FE_TOWARDZERO";
        break;
    default:
        cout << "unknown";
    };
    cout << endl;
}
// Driver Program
int main()
{
    double x = 3.7;
    fesetround(FE_UPWARD);
    rint(x);
    direction();

    fesetround(FE_DOWNWARD);
    rint(x);
    direction();

    fesetround(FE_TOWARDZERO);
    rint(x);
    direction();

    fesetround(FE_TONEAREST);
    rint(x);
    direction();

    return 0;
}

Output:

FE_UPWARD
FE_DOWNWARD
FE_TOWARDZERO
FE_TONEAREST

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



0 Average Difficulty : 0/5.0
No votes yet.