std::fegetround,std::fesetround(3)

NAME
std::fegetround,std::fesetround - std::fegetround,std::fesetround

Synopsis
   Defined in header <cfenv>
   int fesetround( int round ) (1) (since C++11)
   int fegetround() (2) (since C++11)
   Manages the floating-point rounding direction.
   1) Attempts to establish the floating-point rounding direction equal to the argument
   round, which is expected to be one of the floating point rounding macros.
   2) Returns the value of the floating point rounding macro that corresponds to the
   current rounding direction.

Parameters
   round - rounding direction, one of floating point rounding macros

Return value
   1) 0 on success, non-zero otherwise.
   2) The floating point rounding macro describing the current rounding direction or a
   negative value if the direction cannot be determined.

Notes
   The current rounding mode, reflecting the effects of the most recent fesetround, can
   also be queried with FLT_ROUNDS.
   See floating-point rounding macros for the effects of rounding.

Example
// Run this code
 #include <cfenv>
 #include <cmath>
 #include <iomanip>
 #include <iostream>
 #include <utility>
 // #pragma STDC FENV_ACCESS ON
 int main()
 {
     static constexpr std::pair<const char*, const double> samples[]
     {
         {" 12.0", 12.0}, {" 12.1", 12.1}, {"-12.1", -12.1}, {" 12.5", 12.5},
         {"-12.5", -12.5}, {" 12.9", 12.9}, {"-12.9", -12.9}, {" 13.0", 13.0}
     };
     std::cout <<
         "│ sample │ FE_DOWNWARD │ FE_UPWARD │ FE_TONEAREST │ FE_TOWARDZERO │\n";
     for (const auto& [str, fp] : samples)
     {
         std::cout << "│ " << std::setw(6) << str << " │ ";
         for (const int dir : {FE_DOWNWARD, FE_UPWARD, FE_TONEAREST, FE_TOWARDZERO})
         {
             std::fesetround(dir);
             std::cout << std::setw(10) << std::fixed << std::nearbyint(fp) << " │ ";
         }
         std::cout << '\n';
     }
 }

Output:
 │ sample │ FE_DOWNWARD │ FE_UPWARD │ FE_TONEAREST │ FE_TOWARDZERO │
 │ 12.0 │ 12.000000 │ 12.000000 │ 12.000000 │ 12.000000 │
 │ 12.1 │ 12.000000 │ 13.000000 │ 12.000000 │ 12.000000 │
 │ -12.1 │ -13.000000 │ -12.000000 │ -12.000000 │ -12.000000 │
 │ 12.5 │ 12.000000 │ 13.000000 │ 12.000000 │ 12.000000 │
 │ -12.5 │ -13.000000 │ -12.000000 │ -12.000000 │ -12.000000 │
 │ 12.9 │ 12.000000 │ 13.000000 │ 13.000000 │ 12.000000 │
 │ -12.9 │ -13.000000 │ -12.000000 │ -13.000000 │ -12.000000 │
 │ 13.0 │ 13.000000 │ 13.000000 │ 13.000000 │ 13.000000 │

See also
   nearbyint
   nearbyintf
   nearbyintl nearest integer using current rounding mode
   (C++11) (function)
   (C++11)
   (C++11)
   rint
   rintf
   rintl
   lrint
   lrintf
   lrintl
   llrint
   llrintf nearest integer using current rounding mode with
   llrintl exception if the result differs
   (C++11) (function)
   (C++11)
   (C++11)
   (C++11)
   (C++11)
   (C++11)
   (C++11)
   (C++11)
   (C++11)
   C documentation for
   fegetround,
   fesetround