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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpf_add.
  2. Copyright 1996, 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.   mp_size_t size;
  26.   mp_exp_t exp;
  27.   int reps = 20000;
  28.   int i;
  29.   mpf_t u, v, w, wref;
  30.   mp_size_t bprec = 100;
  31.   mpf_t rerr, max_rerr, limit_rerr;
  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_set_ui (limit_rerr, 1);
  41.   mpf_div_2exp (limit_rerr, limit_rerr, bprec);
  42. #if VERBOSE
  43.   mpf_dump (limit_rerr);
  44. #endif
  45.   mpf_init (rerr);
  46.   mpf_init_set_ui (max_rerr, 0);
  47.   mpf_init (u);
  48.   mpf_init (v);
  49.   mpf_init (w);
  50.   mpf_init (wref);
  51.   for (i = 0; i < reps; i++)
  52.     {
  53.       size = urandom () % (2 * SIZE) - SIZE;
  54.       exp = urandom () % SIZE;
  55.       mpf_random2 (u, size, exp);
  56.       size = urandom () % (2 * SIZE) - SIZE;
  57.       exp = urandom () % SIZE;
  58.       mpf_random2 (v, size, exp);
  59.       mpf_add (w, u, v);
  60.       refmpf_add (wref, u, v);
  61.       mpf_reldiff (rerr, w, wref);
  62.       if (mpf_cmp (rerr, max_rerr) > 0)
  63. {
  64.   mpf_set (max_rerr, rerr);
  65. #if VERBOSE
  66.   mpf_dump (max_rerr);
  67. #endif
  68.   if (mpf_cmp (rerr, limit_rerr) > 0)
  69.     {
  70.       printf ("ERROR after %d testsn", i);
  71.       printf ("   u = "); mpf_dump (u);
  72.       printf ("   v = "); mpf_dump (v);
  73.       printf ("wref = "); mpf_dump (wref);
  74.       printf ("   w = "); mpf_dump (w);
  75.       abort ();
  76.     }
  77. }
  78.     }
  79.   mpf_clear (limit_rerr);
  80.   mpf_clear (rerr);
  81.   mpf_clear (max_rerr);
  82.   mpf_clear (u);
  83.   mpf_clear (v);
  84.   mpf_clear (w);
  85.   mpf_clear (wref);
  86.   tests_end ();
  87.   exit (0);
  88. }