1 /* File for generic tests.
3 Copyright (C) 2008, 2009 Philippe Th\'eveny, Andreas Enge, Paul Zimmermann
5 This file is part of the MPC Library.
7 The MPC Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or (at your
10 option) any later version.
12 The MPC Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the MPC Library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20 MA 02111-1307, USA. */
22 /* #include <stdlib.h> */
24 #include "mpc-tests.h"
26 /* Warning: unlike the MPFR macro (defined in mpfr-impl.h), this one returns
27 true when b is singular */
28 #define MPFR_CAN_ROUND(b,err,prec,rnd) \
29 (mpfr_zero_p (b) || mpfr_inf_p (b) \
30 || mpfr_can_round (b, (long)mpfr_get_prec (b) - (err), (rnd), \
31 GMP_RNDZ, (prec) + ((rnd)==GMP_RNDN)))
34 tgeneric_cc (mpc_function *function, mpc_ptr op, mpc_ptr rop,
35 mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
37 known_signs_t ks = {1, 1};
39 /* We compute the result with four times the precision and check whether the
40 rounding is correct. Error reports in this part of the algorithm might
41 still be wrong, though, since there are two consecutive roundings (but we
42 try to avoid them). */
43 function->pointer.CC (rop4, op, rnd);
44 function->pointer.CC (rop, op, rnd);
46 /* can't use the mpfr_can_round function when argument is singular,
47 use a custom macro instead. */
48 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
50 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
52 mpc_set (rop4rnd, rop4, rnd);
54 /* avoid double rounding error */
57 if (same_mpc_value (rop, rop4rnd, ks))
61 printf ("Rounding in %s might be incorrect for\n", function->name);
64 printf ("with rounding mode (%s, %s)",
65 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
66 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
68 printf ("\n%s gives ", function->name);
70 printf ("%s quadruple precision gives ", function->name);
72 printf ("and is rounded to ");
79 tgeneric_fc (mpc_function *function, mpc_ptr op, mpfr_ptr rop,
80 mpfr_ptr rop4, mpfr_ptr rop4rnd, mpfr_rnd_t rnd)
82 function->pointer.FC (rop4, op, rnd);
83 function->pointer.FC (rop, op, rnd);
84 if (MPFR_CAN_ROUND (rop4, 1, MPFR_PREC (rop), rnd))
85 mpfr_set (rop4rnd, rop4, rnd);
89 if (same_mpfr_value (rop, rop4rnd, 1))
92 printf ("Rounding in %s might be incorrect for\n", function->name);
94 printf ("with rounding mode %s", mpfr_print_rnd_mode (rnd));
96 printf ("\n%s gives ", function->name);
98 printf ("%s quadruple precision gives ", function->name);
100 printf ("and is rounded to ");
107 tgeneric_cfc (mpc_function *function, mpfr_ptr op1, mpc_ptr op2,
108 mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
110 known_signs_t ks = {1, 1};
112 function->pointer.CFC (rop4, op1, op2, rnd);
113 function->pointer.CFC (rop, op1, op2, rnd);
114 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
116 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
118 mpc_set (rop4rnd, rop4, rnd);
122 if (same_mpc_value (rop, rop4rnd, ks))
125 printf ("Rounding in %s might be incorrect for\n", function->name);
128 printf ("with rounding mode (%s, %s)",
129 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
130 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
132 printf ("\n%s gives ", function->name);
134 printf ("%s quadruple precision gives ", function->name);
136 printf ("and is rounded to ");
143 tgeneric_ccf (mpc_function *function, mpc_ptr op1, mpfr_ptr op2,
144 mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
146 known_signs_t ks = {1, 1};
148 function->pointer.CCF (rop4, op1, op2, rnd);
149 function->pointer.CCF (rop, op1, op2, rnd);
150 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
152 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
154 mpc_set (rop4rnd, rop4, rnd);
158 if (same_mpc_value (rop, rop4rnd, ks))
161 printf ("Rounding in %s might be incorrect for\n", function->name);
164 printf ("with rounding mode (%s, %s)",
165 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
166 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
168 printf ("\n%s gives ", function->name);
170 printf ("%s quadruple precision gives ", function->name);
172 printf ("and is rounded to ");
179 tgeneric_ccc (mpc_function *function, mpc_ptr op1, mpc_ptr op2,
180 mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
182 known_signs_t ks = {1, 1};
184 /* We compute the result with four times the precision and check whether the
185 rounding is correct. Error reports in this part of the algorithm might
186 still be wrong, though, since there are two consecutive roundings (but we
187 try to avoid them). */
188 function->pointer.CCC (rop4, op1, op2, rnd);
189 function->pointer.CCC (rop, op1, op2, rnd);
191 /* can't use mpfr_can_round when argument is singular */
192 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
194 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
196 mpc_set (rop4rnd, rop4, rnd);
198 /* avoid double rounding error */
201 if (same_mpc_value (rop, rop4rnd, ks))
204 /* rounding failed */
205 printf ("Rounding in %s might be incorrect for\n", function->name);
208 printf ("with rounding mode (%s, %s)",
209 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
210 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
212 printf ("\n%s gives ", function->name);
214 printf ("%s quadruple precision gives ", function->name);
216 printf ("and is rounded to ");
223 tgeneric_ccu (mpc_function *function, mpc_ptr op1, unsigned long int op2,
224 mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
226 known_signs_t ks = {1, 1};
228 function->pointer.CCU (rop4, op1, op2, rnd);
229 function->pointer.CCU (rop, op1, op2, rnd);
230 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
232 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
234 mpc_set (rop4rnd, rop4, rnd);
238 if (same_mpc_value (rop, rop4rnd, ks))
241 printf ("Rounding in %s might be incorrect for\n", function->name);
243 printf ("op2=%lu\n", op2);
244 printf ("with rounding mode (%s, %s)",
245 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
246 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
248 printf ("\n%s gives ", function->name);
250 printf ("%s quadruple precision gives ", function->name);
252 printf ("and is rounded to ");
259 tgeneric_cuc (mpc_function *function, unsigned long int op1, mpc_ptr op2,
260 mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
262 known_signs_t ks = {1, 1};
264 function->pointer.CUC (rop4, op1, op2, rnd);
265 function->pointer.CUC (rop, op1, op2, rnd);
266 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
268 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
270 mpc_set (rop4rnd, rop4, rnd);
274 if (same_mpc_value (rop, rop4rnd, ks))
277 printf ("Rounding in %s might be incorrect for\n", function->name);
278 printf ("op1=%lu\n", op1);
280 printf ("with rounding mode (%s, %s)",
281 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
282 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
284 printf ("\n%s gives ", function->name);
286 printf ("%s quadruple precision gives ", function->name);
288 printf ("and is rounded to ");
295 tgeneric_ccs (mpc_function *function, mpc_ptr op1, long int op2,
296 mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
298 known_signs_t ks = {1, 1};
300 function->pointer.CCS (rop4, op1, op2, rnd);
301 function->pointer.CCS (rop, op1, op2, rnd);
302 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
304 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
306 mpc_set (rop4rnd, rop4, rnd);
310 if (same_mpc_value (rop, rop4rnd, ks))
313 printf ("Rounding in %s might be incorrect for\n", function->name);
315 printf ("op2=%ld\n", op2);
316 printf ("with rounding mode (%s, %s)",
317 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
318 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
320 printf ("\n%s gives ", function->name);
322 printf ("%s quadruple precision gives ", function->name);
324 printf ("and is rounded to ");
332 tgeneric_cci (mpc_function *function, mpc_ptr op1, int op2,
333 mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
335 known_signs_t ks = {1, 1};
337 function->pointer.CCI (rop4, op1, op2, rnd);
338 function->pointer.CCI (rop, op1, op2, rnd);
339 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
341 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
343 mpc_set (rop4rnd, rop4, rnd);
347 if (same_mpc_value (rop, rop4rnd, ks))
350 printf ("Rounding in %s might be incorrect for\n", function->name);
352 printf ("op2=%d\n", op2);
353 printf ("with rounding mode (%s, %s)",
354 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
355 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
357 printf ("\n%s gives ", function->name);
359 printf ("%s quadruple precision gives ", function->name);
361 printf ("and is rounded to ");
368 tgeneric_cuuc (mpc_function *function, unsigned long int op1,
369 unsigned long int op2, mpc_ptr op3, mpc_ptr rop,
370 mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
372 known_signs_t ks = {1, 1};
374 function->pointer.CUUC (rop4, op1, op2, op3, rnd);
375 function->pointer.CUUC (rop, op1, op2, op3, rnd);
376 if (MPFR_CAN_ROUND (MPC_RE (rop4), 1, MPFR_PREC (MPC_RE (rop)),
378 && MPFR_CAN_ROUND (MPC_IM (rop4), 1, MPFR_PREC (MPC_IM (rop)),
380 mpc_set (rop4rnd, rop4, rnd);
384 if (same_mpc_value (rop, rop4rnd, ks))
387 printf ("Rounding in %s might be incorrect for\n", function->name);
388 printf ("op1=%lu\n", op1);
389 printf ("op2=%lu\n", op2);
391 printf ("with rounding mode (%s, %s)",
392 mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
393 mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
395 printf ("\n%s gives ", function->name);
397 printf ("%s quadruple precision gives ", function->name);
399 printf ("and is rounded to ");
406 /* Test parameter reuse: the function should not use its output parameter in
407 internal computations. */
409 reuse_cc (mpc_function* function, mpc_srcptr z, mpc_ptr got, mpc_ptr expected)
411 known_signs_t ks = {1, 1};
413 mpc_set (got, z, MPC_RNDNN); /* exact */
414 function->pointer.CC (expected, z, MPC_RNDNN);
415 function->pointer.CC (got, got, MPC_RNDNN);
416 if (!same_mpc_value (got, expected, ks))
418 printf ("Error for %s(z, z) for\n", function->name);
428 reuse_fc (mpc_function* function, mpc_ptr z, mpc_ptr x, mpfr_ptr expected)
430 mpc_set (x, z, MPC_RNDNN); /* exact */
431 function->pointer.FC (expected, z, GMP_RNDN);
432 function->pointer.FC (MPC_RE (x), x, GMP_RNDN);
433 if (!same_mpfr_value (MPC_RE (x), expected, 1))
436 got[0] = MPC_RE(x)[0]; /* display sensible name */
437 printf ("Error for %s(MPC_RE(z), z) for\n", function->name);
444 mpc_set (x, z, MPC_RNDNN); /* exact */
445 function->pointer.FC (MPC_IM (x), x, GMP_RNDN);
446 if (!same_mpfr_value (MPC_IM (x), expected, 1))
449 got[0] = MPC_IM(x)[0]; /* display sensible name */
450 printf ("Error for %s(MPC_IM(z), z) for \n", function->name);
460 reuse_cfc (mpc_function* function, mpc_srcptr z, mpfr_srcptr x, mpc_ptr got,
463 known_signs_t ks = {1, 1};
465 mpc_set (got, z, MPC_RNDNN); /* exact */
466 function->pointer.CFC (expected, x, z, MPC_RNDNN);
467 function->pointer.CFC (got, x, got, MPC_RNDNN);
468 if (!same_mpc_value (got, expected, ks))
470 printf ("Error for %s(z, x, z) for\n", function->name);
481 reuse_ccf (mpc_function* function, mpc_srcptr z, mpfr_srcptr x, mpc_ptr got,
484 known_signs_t ks = {1, 1};
486 mpc_set (got, z, MPC_RNDNN); /* exact */
487 function->pointer.CCF (expected, z, x, MPC_RNDNN);
488 function->pointer.CCF (got, got, x, MPC_RNDNN);
489 if (!same_mpc_value (got, expected, ks))
491 printf ("Error for %s(z, z, x) for\n", function->name);
502 reuse_ccc (mpc_function* function, mpc_srcptr z, mpc_srcptr x,
503 mpc_ptr got, mpc_ptr expected)
505 known_signs_t ks = {1, 1};
507 mpc_set (got, z, MPC_RNDNN); /* exact */
508 function->pointer.CCC (expected, z, x, MPC_RNDNN);
509 function->pointer.CCC (got, got, x, MPC_RNDNN);
510 if (!same_mpc_value (got, expected, ks))
512 printf ("Error for %s(z, z, x) for\n", function->name);
520 mpc_set (got, x, MPC_RNDNN); /* exact */
521 function->pointer.CCC (expected, z, x, MPC_RNDNN);
522 function->pointer.CCC (got, z, got, MPC_RNDNN);
523 if (!same_mpc_value (got, expected, ks))
525 printf ("Error for %s(x, z, x) for\n", function->name);
533 mpc_set (got, x, MPC_RNDNN); /* exact */
534 function->pointer.CCC (expected, x, x, MPC_RNDNN);
535 function->pointer.CCC (got, got, got, MPC_RNDNN);
536 if (!same_mpc_value (got, expected, ks))
538 printf ("Error for %s(x, x, x) for\n", function->name);
548 reuse_ccu (mpc_function* function, mpc_srcptr z, unsigned long ul,
549 mpc_ptr got, mpc_ptr expected)
551 known_signs_t ks = {1, 1};
553 mpc_set (got, z, MPC_RNDNN); /* exact */
554 function->pointer.CCU (expected, z, ul, MPC_RNDNN);
555 function->pointer.CCU (got, got, ul, MPC_RNDNN);
556 if (!same_mpc_value (got, expected, ks))
558 printf ("Error for %s(z, z, n) for\n", function->name);
560 printf ("n=%lu\n", ul);
569 reuse_cuc (mpc_function* function, unsigned long ul, mpc_srcptr z,
570 mpc_ptr got, mpc_ptr expected)
572 known_signs_t ks = {1, 1};
574 mpc_set (got, z, MPC_RNDNN); /* exact */
575 function->pointer.CUC (expected, ul, z,MPC_RNDNN);
576 function->pointer.CUC (got, ul, got, MPC_RNDNN);
577 if (!same_mpc_value (got, expected, ks))
579 printf ("Error for %s(z, n, z) for\n", function->name);
580 printf ("n=%lu\n", ul);
590 reuse_ccs (mpc_function* function, mpc_srcptr z, long lo,
591 mpc_ptr got, mpc_ptr expected)
593 known_signs_t ks = {1, 1};
595 mpc_set (got, z, MPC_RNDNN); /* exact */
596 function->pointer.CCS (expected, z, lo, MPC_RNDNN);
597 function->pointer.CCS (got, got, lo, MPC_RNDNN);
598 if (!same_mpc_value (got, expected, ks))
600 printf ("Error for %s(z, z, n) for\n", function->name);
602 printf ("n=%ld\n", lo);
611 reuse_cci (mpc_function* function, mpc_srcptr z, int i,
612 mpc_ptr got, mpc_ptr expected)
614 known_signs_t ks = {1, 1};
616 mpc_set (got, z, MPC_RNDNN); /* exact */
617 function->pointer.CCI (expected, z, i, MPC_RNDNN);
618 function->pointer.CCI (got, got, i, MPC_RNDNN);
619 if (!same_mpc_value (got, expected, ks))
621 printf ("Error for %s(z, z, n) for\n", function->name);
623 printf ("n=%d\n", i);
632 reuse_cuuc (mpc_function* function, unsigned long ul1, unsigned long ul2,
633 mpc_srcptr z, mpc_ptr got, mpc_ptr expected)
635 known_signs_t ks = {1, 1};
637 mpc_set (got, z, MPC_RNDNN); /* exact */
638 function->pointer.CUUC (expected, ul1, ul2, z,MPC_RNDNN);
639 function->pointer.CUUC (got, ul1, ul2, got, MPC_RNDNN);
640 if (!same_mpc_value (got, expected, ks))
642 printf ("Error for %s(z, m, n, z) for\n", function->name);
643 printf ("m=%lu\n", ul1);
644 printf ("n=%lu\n", ul2);
654 /* tgeneric(prec_min, prec_max, step, exp_max) checks rounding with random
656 - with precision ranging from prec_min to prec_max with an increment of
658 - with exponent between -exp_max and exp_max.
660 It also checks parameter reuse (it is assumed here that either two mpc_t
661 variables are equal or they are different, in the sense that the real part
662 of one of them cannot be the imaginary part of the other). */
664 tgeneric (mpc_function function, mpfr_prec_t prec_min,
665 mpfr_prec_t prec_max, mpfr_prec_t step, mp_exp_t exp_max)
667 unsigned long ul1 = 0, ul2 = 0;
671 mpc_t z1, z2, z3, z4, zzzz;
677 int special, special_cases;
679 mpc_init2 (z1, prec_max);
680 switch (function.type)
683 mpc_init2 (z2, prec_max);
684 mpc_init2 (z3, prec_max);
685 mpc_init2 (z4, prec_max);
686 mpc_init2 (zzzz, 4*prec_max);
690 mpfr_init2 (x1, prec_max);
691 mpfr_init2 (x2, prec_max);
692 mpfr_init2 (xxxx, 4*prec_max);
693 mpc_init2 (z2, prec_max);
697 mpfr_init2 (x1, prec_max);
698 mpc_init2 (z2, prec_max);
699 mpc_init2 (z3, prec_max);
700 mpc_init2 (zzzz, 4*prec_max);
705 mpc_init2 (z2, prec_max);
706 mpc_init2 (z3, prec_max);
707 mpc_init2 (zzzz, 4*prec_max);
711 mpc_init2 (z2, prec_max);
712 mpc_init2 (z3, prec_max);
713 mpc_init2 (zzzz, 4*prec_max);
718 mpc_init2 (z2, prec_max);
719 mpc_init2 (z3, prec_max);
720 mpc_init2 (zzzz, 4*prec_max);
724 exp_min = mpfr_get_emin ();
726 exp_max = mpfr_get_emax ();
727 else if (exp_max > mpfr_get_emax ())
728 exp_max = mpfr_get_emax();
729 if (-exp_max > exp_min)
735 for (prec = prec_min, special = 0;
736 prec <= prec_max && special <= special_cases;
737 prec+=step, special += (prec == prec_max ? 1 : 0))
739 /* when prec == prec_max, test functions with pure real/pure imaginary
742 /* probability of one zero part in 256th (25 is almost 10%) */
743 const unsigned int zero_probability = special != 0 ? 0 : 25;
745 mpc_set_prec (z1, prec);
746 test_default_random (z1, exp_min, exp_max, 128, zero_probability);
748 switch (function.type)
751 mpc_set_prec (z2, prec);
752 test_default_random (z2, exp_min, exp_max, 128, zero_probability);
753 mpc_set_prec (z3, prec);
754 mpc_set_prec (z4, prec);
755 mpc_set_prec (zzzz, 4*prec);
759 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
762 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
765 mpfr_set_ui (MPC_RE (z2), 0, GMP_RNDN);
768 mpfr_set_ui (MPC_IM (z2), 0, GMP_RNDN);
773 mpc_set_prec (z2, prec);
774 mpfr_set_prec (x1, prec);
775 mpfr_set_prec (x2, prec);
776 mpfr_set_prec (xxxx, 4*prec);
780 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
783 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
788 mpc_set_prec (z2, 128);
790 test_default_random (z2, 0, 64, 128, zero_probability);
791 } while (!mpfr_fits_ulong_p (MPC_RE (z2), GMP_RNDN));
792 ul1 = mpfr_get_ui (MPC_RE(z2), GMP_RNDN);
793 mpc_set_prec (z2, prec);
794 mpc_set_prec (z3, prec);
795 mpc_set_prec (zzzz, 4*prec);
799 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
802 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
810 mpc_set_prec (z2, 128);
812 test_default_random (z2, 0, 64, 128, zero_probability);
813 } while (!mpfr_fits_ulong_p (MPC_RE (z2), GMP_RNDN)
814 ||!mpfr_fits_ulong_p (MPC_IM (z2), GMP_RNDN));
815 ul1 = mpfr_get_ui (MPC_RE(z2), GMP_RNDN);
816 ul2 = mpfr_get_ui (MPC_IM(z2), GMP_RNDN);
817 mpc_set_prec (z2, prec);
818 mpc_set_prec (z3, prec);
819 mpc_set_prec (zzzz, 4*prec);
823 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
826 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
837 mpc_set_prec (z2, 128);
839 test_default_random (z2, 0, 64, 128, zero_probability);
840 } while (!mpfr_fits_slong_p (MPC_RE (z2), GMP_RNDN));
841 lo = mpfr_get_si (MPC_RE(z2), GMP_RNDN);
842 mpc_set_prec (z2, prec);
843 mpc_set_prec (z3, prec);
844 mpc_set_prec (zzzz, 4*prec);
848 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
851 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
859 mpc_set_prec (z2, 128);
861 test_default_random (z2, 0, 64, 128, zero_probability);
862 } while (!mpfr_fits_slong_p (MPC_RE (z2), GMP_RNDN));
863 i = (int)mpfr_get_si (MPC_RE(z2), GMP_RNDN);
864 mpc_set_prec (z2, prec);
865 mpc_set_prec (z3, prec);
866 mpc_set_prec (zzzz, 4*prec);
870 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
873 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
881 mpfr_set_prec (x1, prec);
882 mpfr_set (x1, MPC_RE (z1), GMP_RNDN);
883 test_default_random (z1, exp_min, exp_max, 128, zero_probability);
884 mpc_set_prec (z2, prec);
885 mpc_set_prec (z3, prec);
886 mpc_set_prec (zzzz, 4*prec);
890 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
893 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
896 mpfr_set_ui (x1, 0, GMP_RNDN);
902 mpc_set_prec (z2, prec);
903 mpc_set_prec (z3, prec);
904 mpc_set_prec (zzzz, 4*prec);
908 mpfr_set_ui (MPC_RE (z1), 0, GMP_RNDN);
911 mpfr_set_ui (MPC_IM (z1), 0, GMP_RNDN);
916 for (rnd_re = GMP_RNDN; mpfr_print_rnd_mode (rnd_re); ++rnd_re)
917 switch (function.type)
920 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
921 tgeneric_ccc (&function, z1, z2, z3, zzzz, z4,
922 RNDC (rnd_re, rnd_im));
923 reuse_ccc (&function, z1, z2, z3, z4);
926 tgeneric_fc (&function, z1, x1, xxxx, x2, rnd_re);
927 reuse_fc (&function, z1, z2, x1);
930 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
931 tgeneric_cc (&function, z1, z2, zzzz, z3,
932 RNDC (rnd_re, rnd_im));
933 reuse_cc (&function, z1, z2, z3);
936 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
937 tgeneric_cfc (&function, x1, z1, z2, zzzz, z3,
938 RNDC (rnd_re, rnd_im));
939 reuse_cfc (&function, z1, x1, z2, z3);
942 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
943 tgeneric_ccf (&function, z1, x1, z2, zzzz, z3,
944 RNDC (rnd_re, rnd_im));
945 reuse_ccf (&function, z1, x1, z2, z3);
948 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
949 tgeneric_ccu (&function, z1, ul1, z2, zzzz, z3,
950 RNDC (rnd_re, rnd_im));
951 reuse_ccu (&function, z1, ul1, z2, z3);
954 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
955 tgeneric_cuc (&function, ul1, z1, z2, zzzz, z3,
956 RNDC (rnd_re, rnd_im));
957 reuse_cuc (&function, ul1, z1, z2, z3);
960 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
961 tgeneric_ccs (&function, z1, lo, z2, zzzz, z3,
962 RNDC (rnd_re, rnd_im));
963 reuse_ccs (&function, z1, lo, z2, z3);
966 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
967 tgeneric_cci (&function, z1, i, z2, zzzz, z3,
968 RNDC (rnd_re, rnd_im));
969 reuse_cci (&function, z1, i, z2, z3);
972 for (rnd_im = GMP_RNDN; mpfr_print_rnd_mode (rnd_im); ++rnd_im)
973 tgeneric_cuuc (&function, ul1, ul2, z1, z2, zzzz, z3,
974 RNDC (rnd_re, rnd_im));
975 reuse_cuuc (&function, ul1, ul2, z1, z2, z3);
978 printf ("tgeneric not yet implemented for this kind of"
985 switch (function.type)