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

数学计算

开发平台:

Unix_Linux

  1. /* Copyright 1996, 2001 Free Software Foundation, Inc.
  2. This file is part of the GNU MP Library.
  3. The GNU MP Library is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 3 of the License, or (at your
  6. option) any later version.
  7. The GNU MP Library is distributed in the hope that it will be useful, but
  8. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  9. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  10. License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include "gmp.h"
  16. #include "gmp-impl.h"
  17. #include "tests.h"
  18. #define ADD 1
  19. #define SUB 2
  20. #ifndef METHOD
  21. #define METHOD ADD
  22. #endif
  23. #if METHOD == ADD
  24. #define REFCALL refmpn_add_n
  25. #define TESTCALL mpn_add_n
  26. #endif
  27. #if METHOD == SUB
  28. #define REFCALL refmpn_sub_n
  29. #define TESTCALL mpn_sub_n
  30. #endif
  31. #define SIZE 100
  32. int
  33. main (int argc, char **argv)
  34. {
  35.   mp_size_t alloc_size, max_size, size, i, cumul_size;
  36.   mp_ptr s1, s2, dx, dy;
  37.   int s1_align, s2_align, d_align;
  38.   long pass, n_passes;
  39.   mp_limb_t cx, cy;
  40.   max_size = SIZE;
  41.   n_passes = 1000000;
  42.   argc--; argv++;
  43.   if (argc)
  44.     {
  45.       max_size = atol (*argv);
  46.       argc--; argv++;
  47.     }
  48.   alloc_size = max_size + 32;
  49.   s1 = malloc (alloc_size * BYTES_PER_MP_LIMB);
  50.   s2 = malloc (alloc_size * BYTES_PER_MP_LIMB);
  51.   dx = malloc (alloc_size * BYTES_PER_MP_LIMB);
  52.   dy = malloc (alloc_size * BYTES_PER_MP_LIMB);
  53.   cumul_size = 0;
  54.   for (pass = 0; pass < n_passes; pass++)
  55.     {
  56.       size = random () % max_size + 1;
  57.       cumul_size += size;
  58.       if (cumul_size >= 1000000)
  59. {
  60.   cumul_size -= 1000000;
  61.   printf ("r%ld", pass); fflush (stdout);
  62. }
  63.       s1_align = random () % 32;
  64.       s2_align = random () % 32;
  65.       d_align = random () % 32;
  66.       mpn_random2 (s1 + s1_align, size);
  67.       mpn_random2 (s2 + s2_align, size);
  68.       for (i = 0; i < alloc_size; i++)
  69. dx[i] = dy[i] = i + 0x9876500;
  70.       cx = TESTCALL (dx + d_align, s1 + s1_align, s2 + s2_align, size);
  71.       cy = REFCALL (dy + d_align, s1 + s1_align, s2 + s2_align, size);
  72.       if (cx != cy || mpn_cmp (dx, dy, alloc_size) != 0)
  73. abort ();
  74.     }
  75.   printf ("%ld passes OKn", n_passes);
  76.   exit (0);
  77. }