t-dm2exp.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:3k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /* Test mpf_div, mpf_div_2exp, mpf_mul_2exp.
  2. Copyright 1996, 2000, 2001 Free Software Foundation, Inc.
  3. This file is part of the GNU MP Library.
  4. The GNU MP Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MP Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. #ifndef SIZE
  20. #define SIZE 16
  21. #endif
  22. int
  23. main (int argc, char **argv)
  24. {
  25.   int reps = 100000;
  26.   int i;
  27.   mpf_t u, v, w1, w2, w3;
  28.   mp_size_t bprec = 100;
  29.   mpf_t rerr, limit_rerr;
  30.   mp_size_t un;
  31.   mp_exp_t ue;
  32.   tests_start ();
  33.   if (argc > 1)
  34.     {
  35.       reps = strtol (argv[1], 0, 0);
  36.       if (argc > 2)
  37. bprec = strtol (argv[2], 0, 0);
  38.     }
  39.   mpf_set_default_prec (bprec);
  40.   mpf_init (rerr);
  41.   mpf_init (limit_rerr);
  42.   mpf_init (u);
  43.   mpf_init (v);
  44.   mpf_init (w1);
  45.   mpf_init (w2);
  46.   mpf_init (w3);
  47.   for (i = 0; i < reps; i++)
  48.     {
  49.       unsigned long int res_prec;
  50.       unsigned long int pow2;
  51.       res_prec = urandom () % (bprec + 100);
  52.       mpf_set_prec (w1, res_prec);
  53.       mpf_set_prec (w2, res_prec);
  54.       mpf_set_prec (w3, res_prec);
  55.       mpf_set_ui (limit_rerr, 1);
  56.       mpf_div_2exp (limit_rerr, limit_rerr, res_prec);
  57.       pow2 = urandom () % 0x10000;
  58.       mpf_set_ui (v, 1);
  59.       mpf_mul_2exp (v, v, pow2);
  60.       un = urandom () % (2 * SIZE) - SIZE;
  61.       ue = urandom () % SIZE;
  62.       mpf_random2 (u, un, ue);
  63.       mpf_div_2exp (w1, u, pow2);
  64.       mpf_div (w2, u, v);
  65.       mpf_reldiff (rerr, w1, w2);
  66.       if (mpf_cmp (rerr, limit_rerr) > 0)
  67. {
  68.   printf ("ERROR in mpf_div or mpf_div_2exp after %d testsn", i);
  69.   printf ("   u = "); mpf_dump (u);
  70.   printf ("   v = "); mpf_dump (v);
  71.   printf ("  w1 = "); mpf_dump (w1);
  72.   printf ("  w2 = "); mpf_dump (w2);
  73.   abort ();
  74. }
  75.       mpf_mul_2exp (w3, w1, pow2);
  76.       mpf_reldiff (rerr, u, w3);
  77.       if (mpf_cmp (rerr, limit_rerr) > 0)
  78. {
  79.   printf ("ERROR in mpf_mul_2exp after %d testsn", i);
  80.   printf ("   u = "); mpf_dump (u);
  81.   printf ("   v = "); mpf_dump (v);
  82.   printf ("  w1 = "); mpf_dump (w1);
  83.   printf ("  w3 = "); mpf_dump (w3);
  84.   abort ();
  85. }
  86.     }
  87.   mpf_clear (rerr);
  88.   mpf_clear (limit_rerr);
  89.   mpf_clear (u);
  90.   mpf_clear (v);
  91.   mpf_clear (w1);
  92.   mpf_clear (w2);
  93.   mpf_clear (w3);
  94.   tests_end ();
  95.   exit (0);
  96. }