t-expr.c revision 1.1.1.2 1 1.1 mrg /* Test expression evaluation (print nothing and exit 0 if successful).
2 1.1 mrg
3 1.1.1.2 mrg Copyright 2000-2004 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of the GNU MP Library.
6 1.1 mrg
7 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify
8 1.1.1.2 mrg it under the terms of either:
9 1.1.1.2 mrg
10 1.1.1.2 mrg * the GNU Lesser General Public License as published by the Free
11 1.1.1.2 mrg Software Foundation; either version 3 of the License, or (at your
12 1.1.1.2 mrg option) any later version.
13 1.1.1.2 mrg
14 1.1.1.2 mrg or
15 1.1.1.2 mrg
16 1.1.1.2 mrg * the GNU General Public License as published by the Free Software
17 1.1.1.2 mrg Foundation; either version 2 of the License, or (at your option) any
18 1.1.1.2 mrg later version.
19 1.1.1.2 mrg
20 1.1.1.2 mrg or both in parallel, as here.
21 1.1 mrg
22 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but
23 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24 1.1.1.2 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 1.1.1.2 mrg for more details.
26 1.1 mrg
27 1.1.1.2 mrg You should have received copies of the GNU General Public License and the
28 1.1.1.2 mrg GNU Lesser General Public License along with the GNU MP Library. If not,
29 1.1.1.2 mrg see https://www.gnu.org/licenses/. */
30 1.1 mrg
31 1.1 mrg #include <stdio.h>
32 1.1 mrg #include <stdlib.h>
33 1.1 mrg
34 1.1 mrg #include "gmp.h"
35 1.1 mrg #include "tests.h"
36 1.1 mrg #include "expr-impl.h"
37 1.1 mrg
38 1.1 mrg
39 1.1 mrg int option_trace = 0;
40 1.1 mrg
41 1.1 mrg
42 1.1 mrg struct data_t {
43 1.1 mrg int base;
44 1.1 mrg const char *expr;
45 1.1 mrg const char *want;
46 1.1 mrg };
47 1.1 mrg
48 1.1 mrg #define numberof(x) (sizeof (x) / sizeof ((x)[0]))
49 1.1 mrg
50 1.1 mrg
51 1.1 mrg /* These data_xxx[] arrays are tables to be tested with one or more of the
52 1.1 mrg mp?_t types. z=mpz_t, q=mpz_t, f=mpf_t. */
53 1.1 mrg
54 1.1 mrg struct data_t data_zqf[] = {
55 1.1 mrg
56 1.1 mrg /* various deliberately wrong expressions */
57 1.1 mrg { 0, "", NULL },
58 1.1 mrg { 0, "1+", NULL },
59 1.1 mrg { 0, "+2", NULL },
60 1.1 mrg { 0, "1,2", NULL },
61 1.1 mrg { 0, "foo(1,2)", NULL },
62 1.1 mrg { 0, "1+foo", NULL },
63 1.1 mrg { 10, "0fff", NULL },
64 1.1 mrg { 0, "!", NULL },
65 1.1 mrg { 0, "10!", NULL },
66 1.1 mrg { 0, "-10!", NULL },
67 1.1 mrg { 0, "gcd((4,6))", NULL },
68 1.1 mrg { 0, "()", NULL },
69 1.1 mrg { 0, "fac(2**1000)", NULL },
70 1.1 mrg { 0, "$", NULL },
71 1.1 mrg { 0, "$-", NULL },
72 1.1 mrg
73 1.1 mrg /* some basics */
74 1.1 mrg { 10, "123", "123" },
75 1.1 mrg { 10, "-123", "-123" },
76 1.1 mrg { 10, "1+2", "3" },
77 1.1 mrg { 10, "1+2+3", "6" },
78 1.1 mrg { 10, "1+2*3", "7" },
79 1.1 mrg { 10, "3*2+1", "7" },
80 1.1 mrg { 10, "$a", "55" },
81 1.1 mrg { 10, "b", "99" },
82 1.1 mrg { 16, "b", "11" },
83 1.1 mrg { 10, "4**3 * 2 + 1", "129" },
84 1.1 mrg { 10, "1<2", "1" },
85 1.1 mrg { 10, "1>2", "0" },
86 1.1 mrg
87 1.1 mrg { 10, "(123)", "123" },
88 1.1 mrg
89 1.1 mrg { 10, "sgn(-123)", "-1" },
90 1.1 mrg { 10, "5-7", "-2" },
91 1.1 mrg
92 1.1 mrg { 0, "cmp(0,0)", "0" },
93 1.1 mrg { 0, "cmp(1,0)", "1" },
94 1.1 mrg { 0, "cmp(0,1)", "-1" },
95 1.1 mrg { 0, "cmp(-1,0)", "-1" },
96 1.1 mrg { 0, "cmp(0,-1)", "1" },
97 1.1 mrg
98 1.1 mrg { 10, "0 ? 123 : 456", "456" },
99 1.1 mrg { 10, "1 ? 4+5 : 6+7", "9" },
100 1.1 mrg
101 1.1 mrg { 10, "(123)", "123" },
102 1.1 mrg { 10, "(2+3)", "5" },
103 1.1 mrg { 10, "(4+5)*(5+6)", "99" },
104 1.1 mrg
105 1.1 mrg { 0, "1 << 16", "65536" },
106 1.1 mrg { 0, "256 >> 4", "16" },
107 1.1 mrg { 0, "-256 >> 4", "-16" },
108 1.1 mrg
109 1.1 mrg { 0, "!1", "0" },
110 1.1 mrg { 0, "!9", "0" },
111 1.1 mrg { 0, "!0", "1" },
112 1.1 mrg
113 1.1 mrg { 0, "2**2**2", "16" },
114 1.1 mrg { 0, "-2**2**2", "-16" },
115 1.1 mrg
116 1.1 mrg { 0, "0x100", "256" },
117 1.1 mrg { 10, "0x100", NULL },
118 1.1 mrg { 10, "0x 100", NULL },
119 1.1 mrg
120 1.1 mrg { 0, " max ( 1, 2, 3, 4, 5, 6, 7, 8)", "8" },
121 1.1 mrg { 0, " max ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "9" },
122 1.1 mrg { 0, " min ( 1, 9, 2, 3, 4, 5, 6, 7, 8)", "1" },
123 1.1 mrg
124 1.1 mrg { 10, "abs(123)", "123" },
125 1.1 mrg { 10, "abs(-123)", "123" },
126 1.1 mrg { 10, "abs(0)", "0" },
127 1.1 mrg
128 1.1 mrg /* filling data stack */
129 1.1 mrg { 0, "1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))", "16" },
130 1.1 mrg
131 1.1 mrg /* filling control stack */
132 1.1 mrg { 0, "----------------------------------------------------1", "1" },
133 1.1 mrg };
134 1.1 mrg
135 1.1 mrg
136 1.1 mrg const struct data_t data_z[] = {
137 1.1 mrg { 0, "divisible_p(333,3)", "1" },
138 1.1 mrg { 0, "congruent_p(7,1,3)", "1" },
139 1.1 mrg
140 1.1 mrg { 0, "cmpabs(0,0)", "0" },
141 1.1 mrg { 0, "cmpabs(1,0)", "1" },
142 1.1 mrg { 0, "cmpabs(0,1)", "-1" },
143 1.1 mrg { 0, "cmpabs(-1,0)", "1" },
144 1.1 mrg { 0, "cmpabs(0,-1)", "-1" },
145 1.1 mrg
146 1.1 mrg { 0, "odd_p(1)", "1" },
147 1.1 mrg { 0, "odd_p(0)", "0" },
148 1.1 mrg { 0, "odd_p(-1)", "1" },
149 1.1 mrg
150 1.1 mrg { 0, "even_p(1)", "0" },
151 1.1 mrg { 0, "even_p(0)", "1" },
152 1.1 mrg { 0, "even_p(-1)", "0" },
153 1.1 mrg
154 1.1 mrg { 0, "fac(0)", "1" },
155 1.1 mrg { 0, "fac(1)", "1" },
156 1.1 mrg { 0, "fac(2)", "2" },
157 1.1 mrg { 0, "fac(3)", "6" },
158 1.1 mrg { 0, "fac(10)", "3628800" },
159 1.1 mrg
160 1.1 mrg { 10, "root(81,4)", "3" },
161 1.1 mrg
162 1.1 mrg { 10, "gcd(4,6)", "2" },
163 1.1 mrg { 10, "gcd(4,6,9)", "1" },
164 1.1 mrg
165 1.1 mrg { 10, "powm(3,2,9)", "0" },
166 1.1 mrg { 10, "powm(3,2,8)", "1" },
167 1.1 mrg
168 1.1 mrg /* filling data stack */
169 1.1 mrg { 0, "1 ? 1 : 1 || 1 && 1 | 1 ^ 1 & 1 == 1 >= 1 << 1 - 1 * 1 ** 1", "1" },
170 1.1 mrg
171 1.1 mrg /* filling control stack */
172 1.1 mrg { 0, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1", "1" },
173 1.1 mrg
174 1.1 mrg { 0, "fib(10)", "55" },
175 1.1 mrg
176 1.1 mrg { 0, "setbit(0,5)", "32" },
177 1.1 mrg { 0, "clrbit(32,5)", "0" },
178 1.1 mrg { 0, "tstbit(32,5)", "1" },
179 1.1 mrg { 0, "tstbit(32,4)", "0" },
180 1.1 mrg { 0, "scan0(7,0)", "3" },
181 1.1 mrg { 0, "scan1(7,0)", "0" },
182 1.1 mrg };
183 1.1 mrg
184 1.1 mrg const struct data_t data_zq[] = {
185 1.1 mrg /* expecting failure */
186 1.1 mrg { 0, "1.2", NULL },
187 1.1 mrg };
188 1.1 mrg
189 1.1 mrg const struct data_t data_q[] = {
190 1.1 mrg { 10, "(1/2 + 1/3 + 1/4 + 1/5 + 1/6)*20", "29" },
191 1.1 mrg { 0, "num(5/9)", "5" },
192 1.1 mrg { 0, "den(5/9)", "9" },
193 1.1 mrg };
194 1.1 mrg
195 1.1 mrg const struct data_t data_zf[] = {
196 1.1 mrg { 10, "sqrt ( 49 )", "7" },
197 1.1 mrg { 10, "sqrt ( 49 ) + 1", "8" },
198 1.1 mrg { 10, "sqrt((49))", "7" },
199 1.1 mrg { 10, "sqrt((((((((49))))))))", "7" },
200 1.1 mrg };
201 1.1 mrg
202 1.1 mrg const struct data_t data_f[] = {
203 1.1 mrg { 0, "1@10", "10000000000" },
204 1.1 mrg { 0, "1.5@10", "15000000000" },
205 1.1 mrg { 0, "1000@-1", "100" },
206 1.1 mrg { 0, "10.00@-1", "1" },
207 1.1 mrg
208 1.1 mrg { 0, "1e10", "10000000000" },
209 1.1 mrg { 0, "1.5e10", "15000000000" },
210 1.1 mrg { 0, "1000e-1", "100" },
211 1.1 mrg { 0, "10.00e-1", "1" },
212 1.1 mrg
213 1.1 mrg { 16, "1@9", "68719476736" },
214 1.1 mrg
215 1.1 mrg { 16, "1@10", "18446744073709551616" },
216 1.1 mrg { -16, "1@10", "1099511627776" },
217 1.1 mrg
218 1.1 mrg { 0, "ceil(0)", "0" },
219 1.1 mrg { 0, "ceil(0.25)", "1" },
220 1.1 mrg { 0, "ceil(0.5)", "1" },
221 1.1 mrg { 0, "ceil(1.5)", "2" },
222 1.1 mrg { 0, "ceil(-0.5)", "0" },
223 1.1 mrg { 0, "ceil(-1.5)", "-1" },
224 1.1 mrg
225 1.1 mrg /* only simple cases because mpf_eq currently only works on whole limbs */
226 1.1 mrg { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,64)", "1" },
227 1.1 mrg { 0, "eq(0xFFFFFFFFFFFFFFFF1111111111111111,0xFFFFFFFFFFFFFFFF2222222222222222,128)", "0" },
228 1.1 mrg
229 1.1 mrg { 0, "floor(0)", "0" },
230 1.1 mrg { 0, "floor(0.25)", "0" },
231 1.1 mrg { 0, "floor(0.5)", "0" },
232 1.1 mrg { 0, "floor(1.5)", "1" },
233 1.1 mrg { 0, "floor(-0.5)", "-1" },
234 1.1 mrg { 0, "floor(-1.5)", "-2" },
235 1.1 mrg
236 1.1 mrg { 0, "integer_p(1)", "1" },
237 1.1 mrg { 0, "integer_p(0.5)", "0" },
238 1.1 mrg
239 1.1 mrg { 0, "trunc(0)", "0" },
240 1.1 mrg { 0, "trunc(0.25)", "0" },
241 1.1 mrg { 0, "trunc(0.5)", "0" },
242 1.1 mrg { 0, "trunc(1.5)", "1" },
243 1.1 mrg { 0, "trunc(-0.5)", "0" },
244 1.1 mrg { 0, "trunc(-1.5)", "-1" },
245 1.1 mrg };
246 1.1 mrg
247 1.1 mrg struct datalist_t {
248 1.1 mrg const struct data_t *data;
249 1.1 mrg int num;
250 1.1 mrg };
251 1.1 mrg
252 1.1 mrg #define DATALIST(data) { data, numberof (data) }
253 1.1 mrg
254 1.1 mrg struct datalist_t list_z[] = {
255 1.1 mrg DATALIST (data_z),
256 1.1 mrg DATALIST (data_zq),
257 1.1 mrg DATALIST (data_zf),
258 1.1 mrg DATALIST (data_zqf),
259 1.1 mrg };
260 1.1 mrg
261 1.1 mrg struct datalist_t list_q[] = {
262 1.1 mrg DATALIST (data_q),
263 1.1 mrg DATALIST (data_zq),
264 1.1 mrg DATALIST (data_zqf),
265 1.1 mrg };
266 1.1 mrg
267 1.1 mrg struct datalist_t list_f[] = {
268 1.1 mrg DATALIST (data_zf),
269 1.1 mrg DATALIST (data_zqf),
270 1.1 mrg DATALIST (data_f),
271 1.1 mrg };
272 1.1 mrg
273 1.1 mrg
274 1.1 mrg void
275 1.1 mrg check_z (void)
276 1.1 mrg {
277 1.1 mrg const struct data_t *data;
278 1.1 mrg mpz_t a, b, got, want;
279 1.1 mrg int l, i, ret;
280 1.1 mrg
281 1.1 mrg mpz_init (got);
282 1.1 mrg mpz_init (want);
283 1.1 mrg mpz_init_set_ui (a, 55);
284 1.1 mrg mpz_init_set_ui (b, 99);
285 1.1 mrg
286 1.1 mrg for (l = 0; l < numberof (list_z); l++)
287 1.1 mrg {
288 1.1 mrg data = list_z[l].data;
289 1.1 mrg
290 1.1 mrg for (i = 0; i < list_z[l].num; i++)
291 1.1 mrg {
292 1.1 mrg if (option_trace)
293 1.1 mrg printf ("mpz_expr \"%s\"\n", data[i].expr);
294 1.1 mrg
295 1.1 mrg ret = mpz_expr (got, data[i].base, data[i].expr, a, b, NULL);
296 1.1 mrg
297 1.1 mrg if (data[i].want == NULL)
298 1.1 mrg {
299 1.1 mrg /* expect to fail */
300 1.1 mrg if (ret == MPEXPR_RESULT_OK)
301 1.1 mrg {
302 1.1 mrg printf ("mpz_expr wrong return value, got %d, expected failure\n", ret);
303 1.1 mrg goto error;
304 1.1 mrg }
305 1.1 mrg }
306 1.1 mrg else
307 1.1 mrg {
308 1.1 mrg if (mpz_set_str (want, data[i].want, 0) != 0)
309 1.1 mrg {
310 1.1 mrg printf ("Cannot parse wanted value string\n");
311 1.1 mrg goto error;
312 1.1 mrg }
313 1.1 mrg if (ret != MPEXPR_RESULT_OK)
314 1.1 mrg {
315 1.1 mrg printf ("mpz_expr failed unexpectedly\n");
316 1.1 mrg printf (" return value %d\n", ret);
317 1.1 mrg goto error;
318 1.1 mrg }
319 1.1 mrg if (mpz_cmp (got, want) != 0)
320 1.1 mrg {
321 1.1 mrg printf ("mpz_expr wrong result\n");
322 1.1 mrg printf (" got "); mpz_out_str (stdout, 10, got);
323 1.1 mrg printf ("\n");
324 1.1 mrg printf (" want "); mpz_out_str (stdout, 10, want);
325 1.1 mrg printf ("\n");
326 1.1 mrg goto error;
327 1.1 mrg }
328 1.1 mrg }
329 1.1 mrg }
330 1.1 mrg }
331 1.1 mrg mpz_clear (a);
332 1.1 mrg mpz_clear (b);
333 1.1 mrg mpz_clear (got);
334 1.1 mrg mpz_clear (want);
335 1.1 mrg return;
336 1.1 mrg
337 1.1 mrg error:
338 1.1 mrg printf (" base %d\n", data[i].base);
339 1.1 mrg printf (" expr \"%s\"\n", data[i].expr);
340 1.1 mrg if (data[i].want != NULL)
341 1.1 mrg printf (" want \"%s\"\n", data[i].want);
342 1.1 mrg abort ();
343 1.1 mrg }
344 1.1 mrg
345 1.1 mrg void
346 1.1 mrg check_q (void)
347 1.1 mrg {
348 1.1 mrg const struct data_t *data;
349 1.1 mrg mpq_t a, b, got, want;
350 1.1 mrg int l, i, ret;
351 1.1 mrg
352 1.1 mrg mpq_init (got);
353 1.1 mrg mpq_init (want);
354 1.1 mrg mpq_init (a);
355 1.1 mrg mpq_init (b);
356 1.1 mrg
357 1.1 mrg mpq_set_ui (a, 55, 1);
358 1.1 mrg mpq_set_ui (b, 99, 1);
359 1.1 mrg
360 1.1 mrg for (l = 0; l < numberof (list_q); l++)
361 1.1 mrg {
362 1.1 mrg data = list_q[l].data;
363 1.1 mrg
364 1.1 mrg for (i = 0; i < list_q[l].num; i++)
365 1.1 mrg {
366 1.1 mrg if (option_trace)
367 1.1 mrg printf ("mpq_expr \"%s\"\n", data[i].expr);
368 1.1 mrg
369 1.1 mrg ret = mpq_expr (got, data[i].base, data[i].expr, a, b, NULL);
370 1.1 mrg
371 1.1 mrg if (data[i].want == NULL)
372 1.1 mrg {
373 1.1 mrg /* expect to fail */
374 1.1 mrg if (ret == MPEXPR_RESULT_OK)
375 1.1 mrg {
376 1.1 mrg printf ("mpq_expr wrong return value, got %d, expected failure\n", ret);
377 1.1 mrg goto error;
378 1.1 mrg }
379 1.1 mrg }
380 1.1 mrg else
381 1.1 mrg {
382 1.1 mrg if (mpz_set_str (mpq_numref(want), data[i].want, 0) != 0)
383 1.1 mrg {
384 1.1 mrg printf ("Cannot parse wanted value string\n");
385 1.1 mrg goto error;
386 1.1 mrg }
387 1.1 mrg mpz_set_ui (mpq_denref(want), 1);
388 1.1 mrg
389 1.1 mrg if (ret != MPEXPR_RESULT_OK)
390 1.1 mrg {
391 1.1 mrg printf ("mpq_expr failed unexpectedly\n");
392 1.1 mrg printf (" return value %d\n", ret);
393 1.1 mrg goto error;
394 1.1 mrg }
395 1.1 mrg if (mpq_cmp (got, want) != 0)
396 1.1 mrg {
397 1.1 mrg printf ("mpq_expr wrong result\n");
398 1.1 mrg printf (" got "); mpq_out_str (stdout, 10, got);
399 1.1 mrg printf ("\n");
400 1.1 mrg printf (" want "); mpq_out_str (stdout, 10, want);
401 1.1 mrg printf ("\n");
402 1.1 mrg goto error;
403 1.1 mrg }
404 1.1 mrg }
405 1.1 mrg }
406 1.1 mrg }
407 1.1 mrg mpq_clear (a);
408 1.1 mrg mpq_clear (b);
409 1.1 mrg mpq_clear (got);
410 1.1 mrg mpq_clear (want);
411 1.1 mrg return;
412 1.1 mrg
413 1.1 mrg error:
414 1.1 mrg printf (" base %d\n", data[i].base);
415 1.1 mrg printf (" expr \"%s\"\n", data[i].expr);
416 1.1 mrg if (data[i].want != NULL)
417 1.1 mrg printf (" want \"%s\"\n", data[i].want);
418 1.1 mrg abort ();
419 1.1 mrg }
420 1.1 mrg
421 1.1 mrg void
422 1.1 mrg check_f (void)
423 1.1 mrg {
424 1.1 mrg const struct data_t *data;
425 1.1 mrg mpf_t a, b, got, want;
426 1.1 mrg int l, i, ret;
427 1.1 mrg
428 1.1 mrg mpf_set_default_prec (200L);
429 1.1 mrg
430 1.1 mrg mpf_init (got);
431 1.1 mrg mpf_init (want);
432 1.1 mrg mpf_init_set_ui (a, 55);
433 1.1 mrg mpf_init_set_ui (b, 99);
434 1.1 mrg
435 1.1 mrg for (l = 0; l < numberof (list_f); l++)
436 1.1 mrg {
437 1.1 mrg data = list_f[l].data;
438 1.1 mrg
439 1.1 mrg for (i = 0; i < list_f[l].num; i++)
440 1.1 mrg {
441 1.1 mrg if (option_trace)
442 1.1 mrg printf ("mpf_expr \"%s\"\n", data[i].expr);
443 1.1 mrg
444 1.1 mrg ret = mpf_expr (got, data[i].base, data[i].expr, a, b, NULL);
445 1.1 mrg
446 1.1 mrg if (data[i].want == NULL)
447 1.1 mrg {
448 1.1 mrg /* expect to fail */
449 1.1 mrg if (ret == MPEXPR_RESULT_OK)
450 1.1 mrg {
451 1.1 mrg printf ("mpf_expr wrong return value, got %d, expected failure\n", ret);
452 1.1 mrg goto error;
453 1.1 mrg }
454 1.1 mrg }
455 1.1 mrg else
456 1.1 mrg {
457 1.1 mrg if (mpf_set_str (want, data[i].want, 0) != 0)
458 1.1 mrg {
459 1.1 mrg printf ("Cannot parse wanted value string\n");
460 1.1 mrg goto error;
461 1.1 mrg }
462 1.1 mrg
463 1.1 mrg if (ret != MPEXPR_RESULT_OK)
464 1.1 mrg {
465 1.1 mrg printf ("mpf_expr failed unexpectedly\n");
466 1.1 mrg printf (" return value %d\n", ret);
467 1.1 mrg goto error;
468 1.1 mrg }
469 1.1 mrg if (mpf_cmp (got, want) != 0)
470 1.1 mrg {
471 1.1 mrg printf ("mpf_expr wrong result\n");
472 1.1 mrg printf (" got "); mpf_out_str (stdout, 10, 20, got);
473 1.1 mrg printf ("\n");
474 1.1 mrg printf (" want "); mpf_out_str (stdout, 10, 20, want);
475 1.1 mrg printf ("\n");
476 1.1 mrg goto error;
477 1.1 mrg }
478 1.1 mrg }
479 1.1 mrg }
480 1.1 mrg }
481 1.1 mrg mpf_clear (a);
482 1.1 mrg mpf_clear (b);
483 1.1 mrg mpf_clear (got);
484 1.1 mrg mpf_clear (want);
485 1.1 mrg return;
486 1.1 mrg
487 1.1 mrg error:
488 1.1 mrg printf (" base %d\n", data[i].base);
489 1.1 mrg printf (" expr \"%s\"\n", data[i].expr);
490 1.1 mrg if (data[i].want != NULL)
491 1.1 mrg printf (" want \"%s\"\n", data[i].want);
492 1.1 mrg abort ();
493 1.1 mrg }
494 1.1 mrg
495 1.1 mrg
496 1.1 mrg int
497 1.1 mrg main (int argc, char *argv[])
498 1.1 mrg {
499 1.1 mrg tests_start ();
500 1.1 mrg
501 1.1 mrg if (argc >= 2)
502 1.1 mrg option_trace = 1;
503 1.1 mrg
504 1.1 mrg check_z ();
505 1.1 mrg check_q ();
506 1.1 mrg check_f ();
507 1.1 mrg
508 1.1 mrg tests_end ();
509 1.1 mrg exit (0);
510 1.1 mrg }
511