clean up compiler warnings
[libc-test] / src / math / lrint.c
1 #include "test.h"
2 #include <math.h>
3 #include <stdint.h>
4 #include <fenv.h>
5 #include <stdio.h>
6 #include <float.h>
7
8 static struct {
9         int flag;
10         char *s;
11 } eflags[] = {
12         {FE_INVALID, "FE_INVALID"},
13         {FE_DIVBYZERO, "FE_DIVBYZERO"},
14         {FE_OVERFLOW, "FE_OVERFLOW"},
15         {FE_UNDERFLOW, "FE_UNDERFLOW"},
16         {FE_INEXACT, "FE_INEXACT"},
17 };
18 static int ne = sizeof eflags / sizeof *eflags;
19
20 static struct {
21         int flag;
22         char *s;
23 } rflags[] = {
24         {FE_TONEAREST,"FE_TONEAREST,"},
25         {FE_DOWNWARD,"FE_DOWNWARD,"},
26         {FE_UPWARD,"FE_UPWARD,"},
27         {FE_TOWARDZERO,"FE_TOWARDZERO,"},
28 };
29 static int nr = sizeof rflags / sizeof *rflags;
30
31 void printexcept(int f) {
32         int i, all=0;
33
34         for (i = 0; i < ne; i++)
35                 if (f & eflags[i].flag) {
36                         printf("%s%s", all ? "|" : "", eflags[i].s);
37                         all |= eflags[i].flag;
38                 }
39         if (all != f) {
40                 printf("%s%d", all ? "|" : "", f & ~all);
41                 all = f;
42         }
43         printf("%s,", all ? "" : "0");
44 }
45
46 void printround(int f) {
47         int i;
48
49         for (i = 0; i < nr; i++)
50                 if (f == rflags[i].flag) {
51                         printf("%s ", rflags[i].s);
52                         return;
53                 }
54         printf("%d, ", f);
55 }
56
57 /*
58 struct {double x;} t[] = {
59 0.0,
60 0.25,
61 -0.25,
62 0.5,
63 -0.5,
64 0.75,
65 -0.75,
66 1.0,
67 -1.0,
68 1.25,
69 -1.25,
70 0x1p30,
71 -0x1p30,
72 0x1p31-1,
73 -0x1p31+1,
74 0x1p31,
75 -0x1p31,
76 0x1p31+1,
77 -0x1p31-1,
78 0x1p31-0.5,
79 -0x1p31+0.5,
80 0x1p31+0.5,
81 -0x1p31-0.5,
82 0x1p32,
83 -0x1p32,
84 0x1p32 - 0.5,
85 -0x1p32 + 0.5,
86 };
87
88 void test_gendata()
89 {
90         int f, i, j;
91         long n;
92
93         for (i = 0; i < sizeof t/sizeof *t; i++) {
94                 for (j = 0; j < nr; j++) {
95                         fesetround(rflags[j].flag);
96                         feclearexcept(FE_ALL_EXCEPT);
97                         n = lrint(t[i].x);
98                         f = fetestexcept(FE_ALL_EXCEPT);
99                         if (f == FE_INVALID)
100                                 n = 0;
101
102                         printround(rflags[j].flag);
103                         printf("%18a, %11ld, ", t[i].x, n);
104                         printexcept(f);
105                         printf("\n");
106                 }
107         }
108 }
109 */
110
111 static struct {
112         int round;
113         double x;
114         long n;
115         int except;
116 } t[] = {
117 FE_TONEAREST,             0x0p+0,           0, 0,
118 FE_DOWNWARD,              0x0p+0,           0, 0,
119 FE_UPWARD,                0x0p+0,           0, 0,
120 FE_TOWARDZERO,            0x0p+0,           0, 0,
121 FE_TONEAREST,             0x1p-2,           0, FE_INEXACT,
122 FE_DOWNWARD,              0x1p-2,           0, FE_INEXACT,
123 FE_UPWARD,                0x1p-2,           1, FE_INEXACT,
124 FE_TOWARDZERO,            0x1p-2,           0, FE_INEXACT,
125 FE_TONEAREST,            -0x1p-2,           0, FE_INEXACT,
126 FE_DOWNWARD,             -0x1p-2,          -1, FE_INEXACT,
127 FE_UPWARD,               -0x1p-2,           0, FE_INEXACT,
128 FE_TOWARDZERO,           -0x1p-2,           0, FE_INEXACT,
129 FE_TONEAREST,             0x1p-1,           0, FE_INEXACT,
130 FE_DOWNWARD,              0x1p-1,           0, FE_INEXACT,
131 FE_UPWARD,                0x1p-1,           1, FE_INEXACT,
132 FE_TOWARDZERO,            0x1p-1,           0, FE_INEXACT,
133 FE_TONEAREST,            -0x1p-1,           0, FE_INEXACT,
134 FE_DOWNWARD,             -0x1p-1,          -1, FE_INEXACT,
135 FE_UPWARD,               -0x1p-1,           0, FE_INEXACT,
136 FE_TOWARDZERO,           -0x1p-1,           0, FE_INEXACT,
137 FE_TONEAREST,           0x1.8p-1,           1, FE_INEXACT,
138 FE_DOWNWARD,            0x1.8p-1,           0, FE_INEXACT,
139 FE_UPWARD,              0x1.8p-1,           1, FE_INEXACT,
140 FE_TOWARDZERO,          0x1.8p-1,           0, FE_INEXACT,
141 FE_TONEAREST,          -0x1.8p-1,          -1, FE_INEXACT,
142 FE_DOWNWARD,           -0x1.8p-1,          -1, FE_INEXACT,
143 FE_UPWARD,             -0x1.8p-1,           0, FE_INEXACT,
144 FE_TOWARDZERO,         -0x1.8p-1,           0, FE_INEXACT,
145 FE_TONEAREST,             0x1p+0,           1, 0,
146 FE_DOWNWARD,              0x1p+0,           1, 0,
147 FE_UPWARD,                0x1p+0,           1, 0,
148 FE_TOWARDZERO,            0x1p+0,           1, 0,
149 FE_TONEAREST,            -0x1p+0,          -1, 0,
150 FE_DOWNWARD,             -0x1p+0,          -1, 0,
151 FE_UPWARD,               -0x1p+0,          -1, 0,
152 FE_TOWARDZERO,           -0x1p+0,          -1, 0,
153 FE_TONEAREST,           0x1.4p+0,           1, FE_INEXACT,
154 FE_DOWNWARD,            0x1.4p+0,           1, FE_INEXACT,
155 FE_UPWARD,              0x1.4p+0,           2, FE_INEXACT,
156 FE_TOWARDZERO,          0x1.4p+0,           1, FE_INEXACT,
157 FE_TONEAREST,          -0x1.4p+0,          -1, FE_INEXACT,
158 FE_DOWNWARD,           -0x1.4p+0,          -2, FE_INEXACT,
159 FE_UPWARD,             -0x1.4p+0,          -1, FE_INEXACT,
160 FE_TOWARDZERO,         -0x1.4p+0,          -1, FE_INEXACT,
161 FE_TONEAREST,            0x1p+30,  1073741824, 0,
162 FE_DOWNWARD,             0x1p+30,  1073741824, 0,
163 FE_UPWARD,               0x1p+30,  1073741824, 0,
164 FE_TOWARDZERO,           0x1p+30,  1073741824, 0,
165 FE_TONEAREST,           -0x1p+30, -1073741824, 0,
166 FE_DOWNWARD,            -0x1p+30, -1073741824, 0,
167 FE_UPWARD,              -0x1p+30, -1073741824, 0,
168 FE_TOWARDZERO,          -0x1p+30, -1073741824, 0,
169 FE_TONEAREST,   0x1.fffffffcp+30,  2147483647, 0,
170 FE_DOWNWARD,    0x1.fffffffcp+30,  2147483647, 0,
171 FE_UPWARD,      0x1.fffffffcp+30,  2147483647, 0,
172 FE_TOWARDZERO,  0x1.fffffffcp+30,  2147483647, 0,
173 FE_TONEAREST,  -0x1.fffffffcp+30, -2147483647, 0,
174 FE_DOWNWARD,   -0x1.fffffffcp+30, -2147483647, 0,
175 FE_UPWARD,     -0x1.fffffffcp+30, -2147483647, 0,
176 FE_TOWARDZERO, -0x1.fffffffcp+30, -2147483647, 0,
177 FE_TONEAREST,            0x1p+31,           0, FE_INVALID,
178 FE_DOWNWARD,             0x1p+31,           0, FE_INVALID,
179 FE_UPWARD,               0x1p+31,           0, FE_INVALID,
180 FE_TOWARDZERO,           0x1p+31,           0, FE_INVALID,
181 FE_TONEAREST,           -0x1p+31, -2147483648, 0,
182 FE_DOWNWARD,            -0x1p+31, -2147483648, 0,
183 FE_UPWARD,              -0x1p+31, -2147483648, 0,
184 FE_TOWARDZERO,          -0x1p+31, -2147483648, 0,
185 FE_TONEAREST,   0x1.00000002p+31,           0, FE_INVALID,
186 FE_DOWNWARD,    0x1.00000002p+31,           0, FE_INVALID,
187 FE_UPWARD,      0x1.00000002p+31,           0, FE_INVALID,
188 FE_TOWARDZERO,  0x1.00000002p+31,           0, FE_INVALID,
189 FE_TONEAREST,  -0x1.00000002p+31,           0, FE_INVALID,
190 FE_DOWNWARD,   -0x1.00000002p+31,           0, FE_INVALID,
191 FE_UPWARD,     -0x1.00000002p+31,           0, FE_INVALID,
192 FE_TOWARDZERO, -0x1.00000002p+31,           0, FE_INVALID,
193 FE_TONEAREST,   0x1.fffffffep+30,           0, FE_INVALID,
194 FE_DOWNWARD,    0x1.fffffffep+30,  2147483647, FE_INEXACT,
195 FE_UPWARD,      0x1.fffffffep+30,           0, FE_INVALID,
196 FE_TOWARDZERO,  0x1.fffffffep+30,  2147483647, FE_INEXACT,
197 FE_TONEAREST,  -0x1.fffffffep+30, -2147483648, FE_INEXACT,
198 FE_DOWNWARD,   -0x1.fffffffep+30, -2147483648, FE_INEXACT,
199 FE_UPWARD,     -0x1.fffffffep+30, -2147483647, FE_INEXACT,
200 FE_TOWARDZERO, -0x1.fffffffep+30, -2147483647, FE_INEXACT,
201 FE_TONEAREST,   0x1.00000001p+31,           0, FE_INVALID,
202 FE_DOWNWARD,    0x1.00000001p+31,           0, FE_INVALID,
203 FE_UPWARD,      0x1.00000001p+31,           0, FE_INVALID,
204 FE_TOWARDZERO,  0x1.00000001p+31,           0, FE_INVALID,
205 FE_TONEAREST,  -0x1.00000001p+31, -2147483648, FE_INEXACT,
206 FE_DOWNWARD,   -0x1.00000001p+31,           0, FE_INVALID,
207 FE_UPWARD,     -0x1.00000001p+31, -2147483648, FE_INEXACT,
208 FE_TOWARDZERO, -0x1.00000001p+31, -2147483648, FE_INEXACT,
209 FE_TONEAREST,            0x1p+32,           0, FE_INVALID,
210 FE_DOWNWARD,             0x1p+32,           0, FE_INVALID,
211 FE_UPWARD,               0x1p+32,           0, FE_INVALID,
212 FE_TOWARDZERO,           0x1p+32,           0, FE_INVALID,
213 FE_TONEAREST,           -0x1p+32,           0, FE_INVALID,
214 FE_DOWNWARD,            -0x1p+32,           0, FE_INVALID,
215 FE_UPWARD,              -0x1p+32,           0, FE_INVALID,
216 FE_TOWARDZERO,          -0x1p+32,           0, FE_INVALID,
217 FE_TONEAREST,   0x1.ffffffffp+31,           0, FE_INVALID,
218 FE_DOWNWARD,    0x1.ffffffffp+31,           0, FE_INVALID,
219 FE_UPWARD,      0x1.ffffffffp+31,           0, FE_INVALID,
220 FE_TOWARDZERO,  0x1.ffffffffp+31,           0, FE_INVALID,
221 FE_TONEAREST,  -0x1.ffffffffp+31,           0, FE_INVALID,
222 FE_DOWNWARD,   -0x1.ffffffffp+31,           0, FE_INVALID,
223 FE_UPWARD,     -0x1.ffffffffp+31,           0, FE_INVALID,
224 FE_TOWARDZERO, -0x1.ffffffffp+31,           0, FE_INVALID,
225 };
226
227 void test_lrint()
228 {
229         int f, i;
230         long n;
231
232         for (i = 0; i < sizeof t/sizeof *t; i++) {
233                 fesetround(t[i].round);
234                 feclearexcept(FE_ALL_EXCEPT);
235                 n = lrint(t[i].x);
236                 f = fetestexcept(FE_ALL_EXCEPT);
237
238                 if (t[i].except != FE_INVALID && n != t[i].n) {
239                         error("round=");
240                         printround(t[i].round);
241                         printf("lrint(%a) want %ld got %ld\n", t[i].x, t[i].n, n);
242                 }
243                 if (f != t[i].except) {
244                         error("round=");
245                         printround(t[i].round);
246                         printf("lrint(%a)==%ld want except=", t[i].x, t[i].n);
247                         printexcept(t[i].except);
248                         printf(" got except=");
249                         printexcept(f);
250                         printf("\n");
251                 }
252         }
253 }
254
255 void bench_lrint_simple(int N)
256 {
257         int i;
258         volatile int n;
259
260         for (i = 0; i < N; i++) {
261                 n = lrint(1.25);
262         }
263 }
264
265 void bench_lrint_hard(int N)
266 {
267         int i;
268         volatile int n;
269
270         for (i = 0; i < N; i++) {
271 //              feclearexcept(FE_ALL_EXCEPT);
272 //              n = lrint(1.5);
273 //              n = lrint(0x1p32);
274 //              n = lrint(-0x1p31);
275                 n = lrint(0x1p31+0.5);
276         }
277 }