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

数学计算

开发平台:

Unix_Linux

  1. /* Test MPN_INCR_U and MPN_DECR_U.
  2. Copyright 2001, 2002 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. /* The i386 MPN_INCR_U and MPN_DECR_U have special cases for "n" being a
  20.    compile-time constant 1, so that's exercised explicitly.  */
  21. #define M     GMP_NUMB_MAX
  22. #define SIZE  ((mp_size_t) 10)
  23. void
  24. check_one (const char *name, int i,
  25.            mp_srcptr src, mp_limb_t n,
  26.            mp_srcptr got, mp_srcptr want, mp_size_t size)
  27. {
  28.   if (! refmpn_equal_anynail (got, want, size))
  29.     {
  30.       printf ("Wrong at %s i=%dn", name, i);
  31.       mpn_trace ("  src", src,  size);
  32.       mpn_trace ("    n", &n,   (mp_size_t) 1);
  33.       mpn_trace ("  got", got,  size);
  34.       mpn_trace (" want", want, size);
  35.       abort ();
  36.     }
  37. }
  38. void
  39. check_incr_data (void)
  40. {
  41.   static const struct {
  42.     mp_limb_t        n;
  43.     const mp_limb_t  src[SIZE];
  44.     const mp_limb_t  want[SIZE];
  45.   } data[] = {
  46.     { 1, { 0 },   { 1 } },
  47.     { 1, { 123 }, { 124 } },
  48.     { 2, { 0 },   { 2 } },
  49.     { 2, { 123 }, { 125 } },
  50.     { M, { 0 },   { M } },
  51.     { 1, { M, 0 },   { 0,   1 } },
  52.     { 1, { M, 123 }, { 0,   124 } },
  53.     { 2, { M, 0 },   { 1,   1 } },
  54.     { 2, { M, 123 }, { 1,   124 } },
  55.     { M, { M, 0 },   { M-1, 1 } },
  56.     { M, { M, 123 }, { M-1, 124 } },
  57.     { 1, { M, M, 0 },   { 0,   0, 1 } },
  58.     { 1, { M, M, 123 }, { 0,   0, 124 } },
  59.     { 2, { M, M, 0 },   { 1,   0, 1 } },
  60.     { 2, { M, M, 123 }, { 1,   0, 124 } },
  61.     { M, { M, M, 0 },   { M-1, 0, 1 } },
  62.     { M, { M, M, 123 }, { M-1, 0, 124 } },
  63.     { 1, { M, M, M, 0 },   { 0,   0, 0, 1 } },
  64.     { 1, { M, M, M, 123 }, { 0,   0, 0, 124 } },
  65.     { 2, { M, M, M, 0 },   { 1,   0, 0, 1 } },
  66.     { 2, { M, M, M, 123 }, { 1,   0, 0, 124 } },
  67.     { M, { M, M, M, 0 },   { M-1, 0, 0, 1 } },
  68.     { M, { M, M, M, 123 }, { M-1, 0, 0, 124 } },
  69.     { 1, { M, M, M, M, 0 },   { 0,   0, 0, 0, 1 } },
  70.     { 1, { M, M, M, M, 123 }, { 0,   0, 0, 0, 124 } },
  71.     { 2, { M, M, M, M, 0 },   { 1,   0, 0, 0, 1 } },
  72.     { 2, { M, M, M, M, 123 }, { 1,   0, 0, 0, 124 } },
  73.     { M, { M, M, M, M, 0 },   { M-1, 0, 0, 0, 1 } },
  74.     { M, { M, M, M, M, 123 }, { M-1, 0, 0, 0, 124
  75. #if defined (__hpux) && ! defined (__GNUC__)
  76.     /* Some versions (at least HP92453-01 B.11.11.23709.GP) of the
  77.        HP C compilers fail to zero-fill aggregates as the ISO C standard
  78.        requires (cf 6.5.7 Initialization).  Compensate here:  */
  79. , 0, 0, 0, 0, 0
  80. #endif
  81.     } }
  82.   };
  83.   mp_limb_t  got[SIZE];
  84.   int   i;
  85.   for (i = 0; i < numberof (data); i++)
  86.     {
  87.       refmpn_copyi (got, data[i].src, SIZE);
  88.       MPN_INCR_U (got, SIZE, data[i].n);
  89.       check_one ("check_incr (general)", i,
  90.                  data[i].src, data[i].n,
  91.                  got, data[i].want, SIZE);
  92.       if (data[i].n == 1)
  93.         {
  94.           refmpn_copyi (got, data[i].src, SIZE);
  95.           MPN_INCR_U (got, SIZE, CNST_LIMB(1));
  96.           check_one ("check_incr (const 1)", i,
  97.                      data[i].src, data[i].n,
  98.                      got, data[i].want, SIZE);
  99.         }
  100.     }
  101. }
  102. void
  103. check_decr_data (void)
  104. {
  105.   static const struct {
  106.     mp_limb_t        n;
  107.     const mp_limb_t  src[SIZE];
  108.     const mp_limb_t  want[SIZE];
  109.   } data[] = {
  110.     { 1,   { 1 },   { 0   } },
  111.     { 1,   { 123 }, { 122 } },
  112.     { 1,   { M },   { M-1 } },
  113.     { 2,   { 2 },   { 0   } },
  114.     { 2,   { 123 }, { 121 } },
  115.     { M,   { M },   { 0   } },
  116.     { M-1, { M },   { 1   } },
  117.     { 1,   { 0,   1   }, { M,   0   } },
  118.     { 1,   { 0,   123 }, { M,   122 } },
  119.     { 1,   { 0,   M   }, { M,   M-1 } },
  120.     { 2,   { 0,   123 }, { M-1, 122 } },
  121.     { 2,   { 1,   123 }, { M,   122 } },
  122.     { M,   { 0,   123 }, { 1,   122 } },
  123.     { M,   { M-1, M   }, { M,   M-1 } },
  124.     { 1,   { 0,   0, 1   }, { M,   M, 0   } },
  125.     { 1,   { 0,   0, 123 }, { M,   M, 122 } },
  126.     { 1,   { 0,   0, M   }, { M,   M, M-1 } },
  127.     { 2,   { 0,   0, 123 }, { M-1, M, 122 } },
  128.     { 2,   { 1,   0, 123 }, { M,   M, 122 } },
  129.     { M,   { 0,   0, 123 }, { 1,   M, 122 } },
  130.     { M,   { M-1, 0, M   }, { M,   M, M-1 } },
  131.     { 1,   { 0,   0, 0, 1   }, { M,   M, M, 0   } },
  132.     { 1,   { 0,   0, 0, 123 }, { M,   M, M, 122 } },
  133.     { 1,   { 0,   0, 0, M   }, { M,   M, M, M-1 } },
  134.     { 2,   { 0,   0, 0, 123 }, { M-1, M, M, 122 } },
  135.     { 2,   { 1,   0, 0, 123 }, { M,   M, M, 122 } },
  136.     { M,   { 0,   0, 0, 123 }, { 1,   M, M, 122 } },
  137.     { M,   { M-1, 0, 0, M   }, { M,   M, M, M-1 } },
  138.     { 1,   { 0,   0, 0, 0, 1   }, { M,   M, M, M, 0   } },
  139.     { 1,   { 0,   0, 0, 0, 123 }, { M,   M, M, M, 122 } },
  140.     { 1,   { 0,   0, 0, 0, M   }, { M,   M, M, M, M-1 } },
  141.     { 2,   { 0,   0, 0, 0, 123 }, { M-1, M, M, M, 122 } },
  142.     { 2,   { 1,   0, 0, 0, 123 }, { M,   M, M, M, 122 } },
  143.     { M,   { 0,   0, 0, 0, 123 }, { 1,   M, M, M, 122 } },
  144.     { M,   { M-1, 0, 0, 0, M   }, { M,   M, M, M, M-1 } },
  145.     { 1,   { 0,   0, 0, 0, 0, 1   }, { M,   M, M, M, M, 0   } },
  146.     { 1,   { 0,   0, 0, 0, 0, 123 }, { M,   M, M, M, M, 122 } },
  147.     { 1,   { 0,   0, 0, 0, 0, M   }, { M,   M, M, M, M, M-1 } },
  148.     { 2,   { 0,   0, 0, 0, 0, 123 }, { M-1, M, M, M, M, 122 } },
  149.     { 2,   { 1,   0, 0, 0, 0, 123 }, { M,   M, M, M, M, 122 } },
  150.     { M,   { 0,   0, 0, 0, 0, 123 }, { 1,   M, M, M, M, 122 } },
  151.     { M,   { M-1, 0, 0, 0, 0, M   }, { M,   M, M, M, M, M-1
  152. #if defined (__hpux) && ! defined (__GNUC__)
  153.     /* For explanation of this garbage, see previous function.  */
  154.        , 0, 0, 0, 0
  155. #endif
  156.     } }
  157.   };
  158.   mp_limb_t  got[SIZE];
  159.   int   i;
  160.   for (i = 0; i < numberof (data); i++)
  161.     {
  162.       refmpn_copyi (got, data[i].src, SIZE);
  163.       MPN_DECR_U (got, SIZE, data[i].n);
  164.       check_one ("check_decr_data", i,
  165.                  data[i].src, data[i].n,
  166.                  got, data[i].want, SIZE);
  167.       if (data[i].n == 1)
  168.         {
  169.           refmpn_copyi (got, data[i].src, SIZE);
  170.           MPN_DECR_U (got, SIZE, CNST_LIMB(1));
  171.           check_one ("check_decr (const 1)", i,
  172.                      data[i].src, data[i].n,
  173.                      got, data[i].want, SIZE);
  174.         }
  175.     }
  176. }
  177. int
  178. main (void)
  179. {
  180.   tests_start ();
  181.   mp_trace_base = -16;
  182.   check_incr_data ();
  183.   check_decr_data ();
  184.   tests_end ();
  185.   exit (0);
  186. }