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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpf_mul, mpf_div, mpf_ui_div, and mpf_div_ui.
  2. Copyright 1996, 2000, 2001, 2003 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.   mp_size_t size;
  26.   mp_exp_t exp;
  27.   int reps = 10000;
  28.   int i;
  29.   mpf_t u, v, w, x;
  30.   mp_size_t bprec = SIZE * GMP_LIMB_BITS;
  31.   mpf_t rerr, limit_rerr;
  32.   unsigned long ulimb, vlimb;
  33.   int single_flag;
  34.   tests_start ();
  35.   if (argc > 1)
  36.     {
  37.       reps = strtol (argv[1], 0, 0);
  38.       if (argc > 2)
  39. bprec = strtol (argv[2], 0, 0);
  40.     }
  41.   mpf_set_default_prec (bprec);
  42.   mpf_init (rerr);
  43.   mpf_init (limit_rerr);
  44.   mpf_init (u);
  45.   mpf_init (v);
  46.   mpf_init (w);
  47.   mpf_init (x);
  48.   for (i = 0; i < reps; i++)
  49.     {
  50.       mp_size_t res_prec;
  51.       res_prec = urandom () % bprec + 1;
  52.       mpf_set_prec (w, res_prec);
  53.       mpf_set_prec (x, res_prec);
  54.       mpf_set_ui (limit_rerr, 1);
  55.       mpf_div_2exp (limit_rerr, limit_rerr, res_prec - 1);
  56.       single_flag = 0;
  57.       if ((urandom () & 1) != 0)
  58. {
  59.   size = urandom () % (2 * SIZE) - SIZE;
  60.   exp = urandom () % SIZE;
  61.   mpf_random2 (u, size, exp);
  62. }
  63.       else
  64. {
  65.   ulimb = urandom ();
  66.   mpf_set_ui (u, ulimb);
  67.   single_flag = 1;
  68. }
  69.       if ((urandom () & 1) != 0)
  70. {
  71.   size = urandom () % (2 * SIZE) - SIZE;
  72.   exp = urandom () % SIZE;
  73.   mpf_random2 (v, size, exp);
  74. }
  75.       else
  76. {
  77.   vlimb = urandom ();
  78.   mpf_set_ui (v, vlimb);
  79.   single_flag = 2;
  80. }
  81.       if (mpf_sgn (v) == 0)
  82. continue;
  83.       mpf_div (w, u, v);
  84.       mpf_mul (x, w, v);
  85.       mpf_reldiff (rerr, u, x);
  86.       if (mpf_cmp (rerr, limit_rerr) > 0)
  87. {
  88.   printf ("ERROR in mpf_mul or mpf_div after %d testsn", i);
  89.   printf ("   u = "); mpf_dump (u);
  90.   printf ("   v = "); mpf_dump (v);
  91.   printf ("   x = "); mpf_dump (x);
  92.   printf ("   w = "); mpf_dump (w);
  93.   abort ();
  94. }
  95.       if (single_flag == 2)
  96. {
  97.   mpf_div_ui (x, u, vlimb);
  98.   mpf_reldiff (rerr, w, x);
  99.   if (mpf_cmp (rerr, limit_rerr) > 0)
  100.     {
  101.       printf ("ERROR in mpf_div or mpf_div_ui after %d testsn", i);
  102.       printf ("   u = "); mpf_dump (u);
  103.       printf ("   v = "); mpf_dump (v);
  104.       printf ("   x = "); mpf_dump (x);
  105.       printf ("   w = "); mpf_dump (w);
  106.       abort ();
  107.     }
  108. }
  109.       if (single_flag == 1)
  110. {
  111.   mpf_ui_div (x, ulimb, v);
  112.   mpf_reldiff (rerr, w, x);
  113.   if (mpf_cmp (rerr, limit_rerr) > 0)
  114.     {
  115.       printf ("ERROR in mpf_div or mpf_ui_div after %d testsn", i);
  116.       printf ("   u = "); mpf_dump (u);
  117.       printf ("   v = "); mpf_dump (v);
  118.       printf ("   x = "); mpf_dump (x);
  119.       printf ("   w = "); mpf_dump (w);
  120.       abort ();
  121.     }
  122. }
  123.     }
  124.   mpf_clear (rerr);
  125.   mpf_clear (limit_rerr);
  126.   mpf_clear (u);
  127.   mpf_clear (v);
  128.   mpf_clear (w);
  129.   mpf_clear (x);
  130.   tests_end ();
  131.   exit (0);
  132. }