11b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <fenv.h>
21b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <limits.h>
31b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <math.h>
41b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <stdint.h>
51b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj#include <stdio.h>
61b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
71b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanjstatic void DivideByZero() {
81b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj  // volatile to prevent compiler optimizations.
91b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj  volatile float zero = 0.0f;
101b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj  volatile float result __attribute__((unused)) = 123.0f / zero;
111b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj}
121b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
131b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanjint main () {
141b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   /* Testing lrint. */
151b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode.
161b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_UPWARD)\n");
171b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("lrint(1234.01): %ld\n", lrint(1234.01));
181b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f));
191b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("lrintl(1234.01): %ld\n", lrintl(1234.01));
201b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode.
211b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_TOWARDZERO)\n");
221b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("lrint(1234.01): %ld\n", lrint(1234.01));
231b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f));
241b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("lrintl(1234.01): %ld\n", lrintl(1234.01));
251b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode.
261b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_UPWARD)\n");
271b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("llrint(1234.01): %lld\n", llrint(1234.01));
281b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f));
291b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("llrintf(1234.01f): %lld\n", llrintl(1234.01));
301b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode.
311b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_TOWARDZERO)\n");
321b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("llrint(1234.01): %lld\n", llrint(1234.01));
331b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f));
341b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("llrintl(1234.01): %lld\n", llrintl(1234.01));
351b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
361b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   /* Tesing rint. */
371b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_UPWARD); // rint/rintf/rintl obey the rounding mode.
381b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_UPWARD)\n");
391b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
401b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("feclearexcept(FE_ALL_EXCEPT)\n");
411b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rint(1234.0): %f\n", rint(1234.0));
421b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
431b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
441b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rint(1234.01): %f\n", rint(1234.01));
451b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
461b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
471b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
481b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
491b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("feclearexcept(FE_ALL_EXCEPT)\n");
501b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rintf(1234.0f): %f\n", rintf(1234.0f));
511b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
521b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
531b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rintf(1234.01f): %f\n", rintf(1234.01f));
541b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
551b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
561b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
571b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
581b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("feclearexcept(FE_ALL_EXCEPT)\n");
591b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rintl(1234.0): %Lf\n", rintl(1234.0));
601b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
611b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
621b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rintl(1234.01): %Lf\n", rintl(1234.01));
631b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
641b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
651b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
661b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_TOWARDZERO); // rint/rintf obey the rounding mode.
671b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_TOWARDZERO)\n");
681b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rint(1234.01): %f\n", rint(1234.01));
691b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rintf(1234.01f): %f\n", rintf(1234.01f));
701b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("rintl(1234.01): %Lf\n", rintl(1234.01));
711b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
721b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   /* Testing nearbyint. */
731b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_UPWARD); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
741b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_UPWARD)\n");
751b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
761b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("feclearexcept(FE_ALL_EXCEPT)\n");
771b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyint(1234.0): %f\n", nearbyint(1234.0));
781b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyint(1234.01): %f\n", nearbyint(1234.01));
791b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
801b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   feclearexcept(FE_ALL_EXCEPT);
811b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("feclearexcept(FE_ALL_EXCEPT)\n");
821b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyintf(1234.0f): %f\n", nearbyintf(1234.0f));
831b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f));
841b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
851b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
861b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("feclearexcept(FE_ALL_EXCEPT)\n");
871b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyintl(1234.0f): %Lf\n", nearbyintl(1234.0f));
881b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyintl(1234.01f): %Lf\n", nearbyintl(1234.01f));
891b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
901b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   fesetround(FE_TOWARDZERO); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
911b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("fesetround(FE_TOWARDZERO)\n");
921b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyint(1234.01): %f\n", nearbyint(1234.01));
931b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f));
941b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("nearbyintl(1234.01): %Lf\n", nearbyintl(1234.01));
951b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
961b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   /* Test log. */
971b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("log(M_E): %lf\n", log(M_E));
981b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
991b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   /* Test tgamma. */
1001b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("tgamma(5.0): %lf\n", tgamma(5.0));
1011b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
1021b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   /* Test cbrt. */
1031b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("cbrt(27.0): %lf\n", cbrt(27.0));
1041b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
1051b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   /* Test dividing by zero. */
1061b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   // Clearing clears.
1071b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("feclearexcept(FE_ALL_EXCEPT): %d\n", feclearexcept(FE_ALL_EXCEPT));
1081b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
1091b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   // Dividing by zero sets FE_DIVBYZERO.
1101b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   DivideByZero();
1111b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW);
1121b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   printf("raised: %d\n", raised);
1131b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj
1141b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj   return 0;
1151b9c249b2be7ef0def5ccb50e5bc2417f5f29ce8dejanj}
116