#include <float.h>
#include <fenv.h>
#include <stdio.h>
int main ( )
{
volatile double one = 1.f, three = 3.f; /* volatiles are not folded */
double one_third;
one_third = 1. / 3.; /* folded */
printf ("1/3 with compile-time rounding = %.17f\n", one_third);
fesetround (FE_TOWARDZERO);
one_third = one / three; /* not folded */
printf ("1/3 with execution-time rounding to zero = %.17f\n", one_third);
fesetround (FE_TONEAREST);
one_third = one / three; /* not folded */
printf ("1/3 with execution-time rounding to nearest = %.17f\n", one_third);
fesetround (FE_UPWARD);
one_third = one / three; /* not folded */
printf ("1/3 with execution-time rounding to +infinity = %.17f\n", one_third);
fesetround (FE_DOWNWARD);
one_third = one / three; /* not folded */
printf ("1/3 with execution-time rounding to -infinity = %.17f\n", one_third);
return 0;
}
1/3 with compile-time rounding = 0.33333333333333331 1/3 with execution-time rounding to zero = 0.33333333333333331 1/3 with execution-time rounding to nearest = 0.33333333333333331 1/3 with execution-time rounding to +infinity = 0.33333333333333337 1/3 with execution-time rounding to -infinity = 0.33333333333333331Because the fourth computation changes the rounding mode to round-to-infinity, the results are slightly different from the first computation, which is performed at compile time, using round-to-nearest. If you do not use the -qfloat=nofold option to suppress all compile-time folding of floating-point computations, it is recommended that you use the -y compiler option with the appropriate suboption to match compile-time and runtime rounding modes. In the previous example, compiling with -yp (round-to-infinity) produces the following result for the first computation:
1/3 with compile-time rounding = 0.33333333333333337
In general, if the rounding mode is changed to +infinity or -infinity, it is recommended that you also use the -qfloat=rrm option.