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