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"},
18 static int ne = sizeof eflags / sizeof *eflags;
24 {FE_TONEAREST,"FE_TONEAREST,"},
25 {FE_DOWNWARD,"FE_DOWNWARD,"},
26 {FE_UPWARD,"FE_UPWARD,"},
27 {FE_TOWARDZERO,"FE_TOWARDZERO,"},
29 static int nr = sizeof rflags / sizeof *rflags;
31 void printexcept(int f) {
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;
40 printf("%s%d", all ? "|" : "", f & ~all);
43 printf("%s,", all ? "" : "0");
46 void printround(int f) {
49 for (i = 0; i < nr; i++)
50 if (f == rflags[i].flag) {
51 printf("%s ", rflags[i].s);
58 struct {double x;} t[] = {
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);
98 f = fetestexcept(FE_ALL_EXCEPT);
102 printround(rflags[j].flag);
103 printf("%18a, %11ld, ", t[i].x, n);
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,
232 for (i = 0; i < sizeof t/sizeof *t; i++) {
233 fesetround(t[i].round);
234 feclearexcept(FE_ALL_EXCEPT);
236 f = fetestexcept(FE_ALL_EXCEPT);
238 if (t[i].except != FE_INVALID && n != t[i].n) {
240 printround(t[i].round);
241 printf("lrint(%a) want %ld got %ld\n", t[i].x, t[i].n, n);
243 if (f != t[i].except) {
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=");
255 void bench_lrint_simple(int N)
260 for (i = 0; i < N; i++) {
265 void bench_lrint_hard(int N)
270 for (i = 0; i < N; i++) {
271 // feclearexcept(FE_ALL_EXCEPT);
273 // n = lrint(0x1p32);
274 // n = lrint(-0x1p31);
275 n = lrint(0x1p31+0.5);