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 with fesetround and fegetround 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 with FE_ followed by at least one uppercase letter. Each macro is only defined if it is supported.
On most implementations, these macro constants expand to the values equal to the values of FLT_ROUNDS and float_round_style.
| Constant | Explanation |
|---|---|
FE_DOWNWARD | rounding towards negative infinity |
FE_TONEAREST | rounding towards nearest integer |
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.4142135623730951454746218587388284504413604736328125double d = 1 + DBL_EPSILON;
float f = d; // 1.00000000000000000000000
// or 1.00000011920928955078125strtof("0.1", NULL); // 0.0999999940395355224609375
// or 0.100000001490116119384765625lrint(2.1); // 2 or 3
The current rounding mode does NOT affect the following:
round, lround, ceil, floor, trunc As with any floating-point environment functionality, rounding is only guaranteed if #pragma STDC FENV_ACCESS ON is set.
#include <stdio.h>
#include <stdlib.h>
#include <fenv.h>
#include <math.h>
int main()
{
#pragma STDC FENV_ACCESS ON
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.1415925025939941406250
strtof("1.1") = 1.0999999046325683593750
rint(2.1) = 2.0000000000000000000000
rounding up:
pi = 3.1415927410125732421875
strtof("1.1") = 1.1000000238418579101563
rint(2.1) = 3.0000000000000000000000|
(C99)(C99) | gets or sets rounding direction (function) |
| C++ documentation for floating point rounding macros | |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/c/numeric/fenv/FE_round