The default rounding mode used at compile time and run time is round-to-nearest. If your program changes the rounding mode at run time, the results of a floating-point calculation might be slightly different from those that are obtained at compile time. The following example illustrates this:
#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; }
When compiled with the default options, this code produces the following results:
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.33333333333333331
Because 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.