1a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <fenv.h>
2a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <limits.h>
3a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <math.h>
4a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdint.h>
5a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#include <stdio.h>
6a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
7a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesstatic void DivideByZero() {
8a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  // volatile to prevent compiler optimizations.
9a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  volatile float zero = 0.0f;
10a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes  volatile float result __attribute__((unused)) = 123.0f / zero;
11a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}
12a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
13a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughesint main () {
14a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Testing lrint. */
15a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode.
16a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_UPWARD)\n");
17a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("lrint(1234.01): %ld\n", lrint(1234.01));
18a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f));
19a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("lrintl(1234.01): %ld\n", lrintl(1234.01));
20a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode.
21a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_TOWARDZERO)\n");
22a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("lrint(1234.01): %ld\n", lrint(1234.01));
23a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("lrintf(1234.01f): %ld\n", lrintf(1234.01f));
24a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("lrintl(1234.01): %ld\n", lrintl(1234.01));
25a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode.
26a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_UPWARD)\n");
27a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("llrint(1234.01): %lld\n", llrint(1234.01));
28a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f));
29a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("llrintf(1234.01f): %lld\n", llrintl(1234.01));
30a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode.
31a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_TOWARDZERO)\n");
32a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("llrint(1234.01): %lld\n", llrint(1234.01));
33a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("llrintf(1234.01f): %lld\n", llrintf(1234.01f));
34a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("llrintl(1234.01): %lld\n", llrintl(1234.01));
35a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
36a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Tesing rint. */
37a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_UPWARD); // rint/rintf/rintl obey the rounding mode.
38a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_UPWARD)\n");
39a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
40a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("feclearexcept(FE_ALL_EXCEPT)\n");
41a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rint(1234.0): %f\n", rint(1234.0));
42a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
43a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
44a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rint(1234.01): %f\n", rint(1234.01));
45a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
46a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
47a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
48a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
49a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("feclearexcept(FE_ALL_EXCEPT)\n");
50a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rintf(1234.0f): %f\n", rintf(1234.0f));
51a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
52a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
53a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rintf(1234.01f): %f\n", rintf(1234.01f));
54a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
55a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
56a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
57a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
58a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("feclearexcept(FE_ALL_EXCEPT)\n");
59a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rintl(1234.0): %Lf\n", rintl(1234.0));
60a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
61a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
62a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rintl(1234.01): %Lf\n", rintl(1234.01));
63a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("(fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT): %d\n",
64a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes           (fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT));
65a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
66a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_TOWARDZERO); // rint/rintf obey the rounding mode.
67a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_TOWARDZERO)\n");
68a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rint(1234.01): %f\n", rint(1234.01));
69a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rintf(1234.01f): %f\n", rintf(1234.01f));
70a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("rintl(1234.01): %Lf\n", rintl(1234.01));
71a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
72a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Testing nearbyint. */
73a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_UPWARD); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
74a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_UPWARD)\n");
75a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
76a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("feclearexcept(FE_ALL_EXCEPT)\n");
77a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyint(1234.0): %f\n", nearbyint(1234.0));
78a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyint(1234.01): %f\n", nearbyint(1234.01));
79a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
80a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   feclearexcept(FE_ALL_EXCEPT);
81a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("feclearexcept(FE_ALL_EXCEPT)\n");
82a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyintf(1234.0f): %f\n", nearbyintf(1234.0f));
83a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f));
84a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
85a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
86a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("feclearexcept(FE_ALL_EXCEPT)\n");
87a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyintl(1234.0f): %Lf\n", nearbyintl(1234.0f));
88a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyintl(1234.01f): %Lf\n", nearbyintl(1234.01f));
89a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
90a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   fesetround(FE_TOWARDZERO); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
91a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("fesetround(FE_TOWARDZERO)\n");
92a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyint(1234.01): %f\n", nearbyint(1234.01));
93a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyintf(1234.01f): %f\n", nearbyintf(1234.01f));
94a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("nearbyintl(1234.01): %Lf\n", nearbyintl(1234.01));
95a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
96a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Test log. */
97a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("log(M_E): %lf\n", log(M_E));
98a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
99a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Test tgamma. */
100a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("tgamma(5.0): %lf\n", tgamma(5.0));
101a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
102a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Test cbrt. */
103a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("cbrt(27.0): %lf\n", cbrt(27.0));
104a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
105a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   /* Test dividing by zero. */
106a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // Clearing clears.
107a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("feclearexcept(FE_ALL_EXCEPT): %d\n", feclearexcept(FE_ALL_EXCEPT));
108a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
109a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   // Dividing by zero sets FE_DIVBYZERO.
110a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   DivideByZero();
111a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   int raised = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW);
112a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   printf("raised: %d\n", raised);
113a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
114a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes   return 0;
115a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes}
116