| Functions | ||||
(C99) | ||||
(C99) | ||||
(C99) | ||||
(C99)(C99) | ||||
(C99)(C99) | ||||
(C99) | ||||
(C99) | ||||
(C99) | ||||
| Macro constants | ||||
FE_DOWNWARDFE_TONEARESTFE_TOWARDZEROFE_UPWARD (C99) | ||||
(C99) |
Defined in header <fenv.h> | ||
#define FE_DOWNWARD /*implementation defined*/ | (since C99) | |
#define FE_TONEAREST /*implementation defined*/ | (since C99) | |
#define FE_TOWARDZERO /*implementation defined*/ | (since C99) | |
#define FE_UPWARD /*implementation defined*/ | (since C99) | |
Each of these macro constants expands to a nonnegative integer constant expression, which can be used withfesetround andfegetround to indicate one of the supported floating-point rounding modes. The implementation may define additional rounding mode constants in<fenv.h>, which should all begin withFE_ followed by at least one uppercase letter. Each macro is only defined if it is supported.
| Constant | Explanation |
FE_DOWNWARD | rounding towards negative infinity |
FE_TONEAREST | rounding towards nearest representable value |
FE_TOWARDZERO | rounding towards zero |
FE_UPWARD | rounding towards positive infinity |
Additional rounding modes may be supported by an implementation.
The current rounding mode affects the following:
double x=1;x/10;// 0.09999999999999999167332731531132594682276248931884765625 or// 0.1000000000000000055511151231257827021181583404541015625
sqrt(2);// 1.41421356237309492343001693370752036571502685546875 or// 1.4142135623730951454746218587388284504413604736328125
double d=1+DBL_EPSILON;float f= d;// 1.00000000000000000000000 or// 1.00000011920928955078125
lrint(2.1);// 2 or 3
The current rounding mode does NOT affect the following:
As with anyfloating-point environment functionality, rounding is only guaranteed if#pragma STDC FENV_ACCESS ON is set.
Compilers that do not support the pragma may offer their own ways to support current rounding mode. For example Clang and GCC have the option-frounding-math intended to disable optimizations that would change the meaning of rounding-sensitive code.
#include <fenv.h>#include <math.h>#include <stdio.h>#include <stdlib.h> // #pragma STDC FENV_ACCESS ON int main(){fesetround(FE_DOWNWARD);puts("rounding down: ");printf(" pi = %.22f\n", acosf(-1));printf("strtof(\"1.1\") = %.22f\n",strtof("1.1",NULL));printf(" rint(2.1) = %.22f\n\n", rintf(2.1));fesetround(FE_UPWARD);puts("rounding up: ");printf(" pi = %.22f\n", acosf(-1));printf("strtof(\"1.1\") = %.22f\n",strtof("1.1",NULL));printf(" rint(2.1) = %.22f\n", rintf(2.1));}
Output:
rounding down: pi = 3.1415925025939941406250strtof("1.1") = 1.0999999046325683593750 rint(2.1) = 2.0000000000000000000000 rounding up: pi = 3.1415927410125732421875strtof("1.1") = 1.1000000238418579101563 rint(2.1) = 3.0000000000000000000000(C99)(C99) | gets or sets rounding direction (function)[edit] |
C++ documentation forfloating-point rounding macros | |