diff options
Diffstat (limited to 'tests/mpcheck-template2.c')
-rw-r--r-- | tests/mpcheck-template2.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/tests/mpcheck-template2.c b/tests/mpcheck-template2.c new file mode 100644 index 0000000..fdb26c3 --- /dev/null +++ b/tests/mpcheck-template2.c @@ -0,0 +1,77 @@ +/* template for complex -> real function, for example abs + +Copyright (C) 2020 INRIA + +This file is part of GNU MPC. + +GNU MPC is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program. If not, see http://www.gnu.org/licenses/ . +*/ + +#define CAT1(X,Y) X ## Y +#define CAT2(X,Y) CAT1(X,Y) +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) + +#define FUN CAT2(test_,FOO) +#define MPC_FOO CAT2(mpc_,FOO) +#define CFOO CAT2(c,FOO) +#define BAR TOSTRING(FOO) + +static void +FUN (mpfr_prec_t p, unsigned long n) +{ + unsigned long i = 0; + mpc_t x; + mpfr_t z, t; + double complex xx; + double zz; + int inex; + unsigned long errors = 0, max_err = 0; + + gmp_randseed_ui (state, seed); + + mpc_init2 (x, p); + mpfr_init2 (z, p); + mpfr_init2 (t, p); + for (i = 0; i < n; i++) + { + mpc_urandom (x, state); + inex = MPC_FOO (z, x, MPC_RNDNN); + mpfr_subnormalize (z, inex, MPFR_RNDN); + xx = mpc_get_dc (x, MPC_RNDNN); + zz = CFOO (xx); + mpfr_set_d (t, zz, MPFR_RNDN); + if (mpfr_cmp (z, t) != 0) + { + unsigned long err = ulp_error (t, z); + if (verbose > 0 && err > max_err) + { + mpfr_printf (" mpc_%s and c%s differ by %lu ulp(s)\n for x=(%Re,%Re)\n", + BAR, BAR, err, + mpc_realref (x), mpc_imagref (x)); + mpfr_printf (" mpc_%s gives %Re\n", BAR, z); + mpfr_printf (" c%s gives %Re\n", BAR, t); + } + errors++; + if (err > max_err) + max_err = err; + } + } + mpc_clear (x); + mpfr_clear (z); + mpfr_clear (t); + printf ("Number of errors for %s: %lu/%lu (max %lu)\n", BAR, errors, n, max_err); +} + +#undef FOO |