14a1767b4Smrg /* Test mpf_div, mpf_div_2exp, mpf_mul_2exp.
24a1767b4Smrg
34a1767b4Smrg Copyright 1996, 2000, 2001 Free Software Foundation, Inc.
44a1767b4Smrg
5d25e02daSmrg This file is part of the GNU MP Library test suite.
64a1767b4Smrg
7d25e02daSmrg The GNU MP Library test suite is free software; you can redistribute it
8d25e02daSmrg and/or modify it under the terms of the GNU General Public License as
9d25e02daSmrg published by the Free Software Foundation; either version 3 of the License,
10d25e02daSmrg or (at your option) any later version.
114a1767b4Smrg
12d25e02daSmrg The GNU MP Library test suite is distributed in the hope that it will be
13d25e02daSmrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14d25e02daSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15d25e02daSmrg Public License for more details.
164a1767b4Smrg
17d25e02daSmrg You should have received a copy of the GNU General Public License along with
18*f81b1c5bSmrg the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
194a1767b4Smrg
204a1767b4Smrg #include <stdio.h>
214a1767b4Smrg #include <stdlib.h>
224a1767b4Smrg
234a1767b4Smrg #include "gmp-impl.h"
244a1767b4Smrg #include "tests.h"
254a1767b4Smrg
264a1767b4Smrg #ifndef SIZE
274a1767b4Smrg #define SIZE 16
284a1767b4Smrg #endif
294a1767b4Smrg
304a1767b4Smrg int
main(int argc,char ** argv)314a1767b4Smrg main (int argc, char **argv)
324a1767b4Smrg {
334a1767b4Smrg int reps = 100000;
344a1767b4Smrg int i;
354a1767b4Smrg mpf_t u, v, w1, w2, w3;
364a1767b4Smrg mp_size_t bprec = 100;
374a1767b4Smrg mpf_t rerr, limit_rerr;
384a1767b4Smrg mp_size_t un;
394a1767b4Smrg mp_exp_t ue;
404a1767b4Smrg
414a1767b4Smrg tests_start ();
424a1767b4Smrg
434a1767b4Smrg if (argc > 1)
444a1767b4Smrg {
454a1767b4Smrg reps = strtol (argv[1], 0, 0);
464a1767b4Smrg if (argc > 2)
474a1767b4Smrg bprec = strtol (argv[2], 0, 0);
484a1767b4Smrg }
494a1767b4Smrg
504a1767b4Smrg mpf_set_default_prec (bprec);
514a1767b4Smrg
524a1767b4Smrg mpf_init (rerr);
534a1767b4Smrg mpf_init (limit_rerr);
544a1767b4Smrg
554a1767b4Smrg mpf_init (u);
564a1767b4Smrg mpf_init (v);
574a1767b4Smrg mpf_init (w1);
584a1767b4Smrg mpf_init (w2);
594a1767b4Smrg mpf_init (w3);
604a1767b4Smrg
614a1767b4Smrg for (i = 0; i < reps; i++)
624a1767b4Smrg {
634a1767b4Smrg unsigned long int res_prec;
644a1767b4Smrg unsigned long int pow2;
654a1767b4Smrg
664a1767b4Smrg res_prec = urandom () % (bprec + 100);
674a1767b4Smrg mpf_set_prec (w1, res_prec);
684a1767b4Smrg mpf_set_prec (w2, res_prec);
694a1767b4Smrg mpf_set_prec (w3, res_prec);
704a1767b4Smrg
714a1767b4Smrg mpf_set_ui (limit_rerr, 1);
724a1767b4Smrg mpf_div_2exp (limit_rerr, limit_rerr, res_prec);
734a1767b4Smrg
744a1767b4Smrg pow2 = urandom () % 0x10000;
754a1767b4Smrg mpf_set_ui (v, 1);
764a1767b4Smrg mpf_mul_2exp (v, v, pow2);
774a1767b4Smrg
784a1767b4Smrg un = urandom () % (2 * SIZE) - SIZE;
794a1767b4Smrg ue = urandom () % SIZE;
804a1767b4Smrg mpf_random2 (u, un, ue);
814a1767b4Smrg
824a1767b4Smrg mpf_div_2exp (w1, u, pow2);
834a1767b4Smrg mpf_div (w2, u, v);
844a1767b4Smrg mpf_reldiff (rerr, w1, w2);
854a1767b4Smrg if (mpf_cmp (rerr, limit_rerr) > 0)
864a1767b4Smrg {
874a1767b4Smrg printf ("ERROR in mpf_div or mpf_div_2exp after %d tests\n", i);
884a1767b4Smrg printf (" u = "); mpf_dump (u);
894a1767b4Smrg printf (" v = "); mpf_dump (v);
904a1767b4Smrg printf (" w1 = "); mpf_dump (w1);
914a1767b4Smrg printf (" w2 = "); mpf_dump (w2);
924a1767b4Smrg abort ();
934a1767b4Smrg }
944a1767b4Smrg mpf_mul_2exp (w3, w1, pow2);
954a1767b4Smrg mpf_reldiff (rerr, u, w3);
964a1767b4Smrg if (mpf_cmp (rerr, limit_rerr) > 0)
974a1767b4Smrg {
984a1767b4Smrg printf ("ERROR in mpf_mul_2exp after %d tests\n", i);
994a1767b4Smrg printf (" u = "); mpf_dump (u);
1004a1767b4Smrg printf (" v = "); mpf_dump (v);
1014a1767b4Smrg printf (" w1 = "); mpf_dump (w1);
1024a1767b4Smrg printf (" w3 = "); mpf_dump (w3);
1034a1767b4Smrg abort ();
1044a1767b4Smrg }
1054a1767b4Smrg }
1064a1767b4Smrg
1074a1767b4Smrg mpf_clear (rerr);
1084a1767b4Smrg mpf_clear (limit_rerr);
1094a1767b4Smrg
1104a1767b4Smrg mpf_clear (u);
1114a1767b4Smrg mpf_clear (v);
1124a1767b4Smrg mpf_clear (w1);
1134a1767b4Smrg mpf_clear (w2);
1144a1767b4Smrg mpf_clear (w3);
1154a1767b4Smrg
1164a1767b4Smrg tests_end ();
1174a1767b4Smrg exit (0);
1184a1767b4Smrg }
119