xref: /netbsd/external/lgpl3/gmp/dist/tests/mpf/t-dm2exp.c (revision 671ea119)
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