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

数学计算

开发平台:

Unix_Linux

  1. /* Exercise mpz_get_si.
  2. Copyright 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. void
  20. check_data (void)
  21. {
  22.   static const struct {
  23.     int         base;
  24.     const char  *f;
  25.     long        want;
  26.   } data[] = {
  27.     { 10, "0",      0L },
  28.     { 10, "1",      1L },
  29.     { 10, "-1",     -1L },
  30.     { 10, "2",      2L },
  31.     { 10, "-2",     -2L },
  32.     { 10, "12345",  12345L },
  33.     { 10, "-12345", -12345L },
  34.     /* fraction bits ignored */
  35.     { 10, "0.5",    0L },
  36.     { 10, "-0.5",   0L },
  37.     { 10, "1.1",    1L },
  38.     { 10, "-1.1",   -1L },
  39.     { 10, "1.9",    1L },
  40.     { 10, "-1.9",   -1L },
  41.     { 16, "1.000000000000000000000000000000000000000000000000001", 1L },
  42.     { 16, "-1.000000000000000000000000000000000000000000000000001", -1L },
  43.     /* low bits extracted (this is undocumented) */
  44.     { 16, "1000000000000000000000000000000000000000000000000001", 1L },
  45.     { 16, "-1000000000000000000000000000000000000000000000000001", -1L },
  46.   };
  47.   int    i;
  48.   mpf_t  f;
  49.   long   got;
  50.   mpf_init2 (f, 2000L);
  51.   for (i = 0; i < numberof (data); i++)
  52.     {
  53.       mpf_set_str_or_abort (f, data[i].f, data[i].base);
  54.       got = mpf_get_si (f);
  55.       if (got != data[i].want)
  56. {
  57.   printf ("mpf_get_si wrong at data[%d]n", i);
  58.   printf ("   f     "%s"n", data[i].f);
  59.   printf ("     dec "); mpf_out_str (stdout, 10, 0, f); printf ("n");
  60.   printf ("     hex "); mpf_out_str (stdout, 16, 0, f); printf ("n");
  61.   printf ("     size %ldn", (long) SIZ(f));
  62.   printf ("     exp  %ldn", (long) EXP(f));
  63.   printf ("   got   %ld (0x%lX)n", got, got);
  64.   printf ("   want  %ld (0x%lX)n", data[i].want, data[i].want);
  65.   abort();
  66. }
  67.     }
  68.   mpf_clear (f);
  69. }
  70. void
  71. check_max (void)
  72. {
  73.   mpf_t  f;
  74.   long   want;
  75.   long   got;
  76.   mpf_init2 (f, 200L);
  77. #define CHECK_MAX(name)                                         
  78.   if (got != want)                                              
  79.     {                                                           
  80.       printf ("mpf_get_si wrong on %sn", name);                
  81.       printf ("   f    ");                                      
  82.       mpf_out_str (stdout, 10, 0, f); printf (", hex ");        
  83.       mpf_out_str (stdout, 16, 0, f); printf ("n");            
  84.       printf ("   got  %ld, hex %lXn", got, got);              
  85.       printf ("   want %ld, hex %lXn", want, want);            
  86.       abort();                                                  
  87.     }
  88.   want = LONG_MAX;
  89.   mpf_set_si (f, want);
  90.   got = mpf_get_si (f);
  91.   CHECK_MAX ("LONG_MAX");
  92.   want = LONG_MIN;
  93.   mpf_set_si (f, want);
  94.   got = mpf_get_si (f);
  95.   CHECK_MAX ("LONG_MIN");
  96.   mpf_clear (f);
  97. }
  98. void
  99. check_limbdata (void)
  100. {
  101. #define M  GMP_NUMB_MAX
  102.   static const struct {
  103.     mp_exp_t       exp;
  104.     mp_size_t      size;
  105.     mp_limb_t      d[10];
  106.     unsigned long  want;
  107.   } data[] = {
  108.     /* in the comments here, a "_" indicates a digit (ie. limb) position not
  109.        included in the d data, and therefore zero */
  110.     { 0, 0, { 0 }, 0L },    /* 0 */
  111.     { 1,  1, { 1 }, 1L },   /* 1 */
  112.     { 1, -1, { 1 }, -1L },  /* -1 */
  113.     { 0,  1, { 1 }, 0L },   /* .1 */
  114.     { 0, -1, { 1 }, 0L },   /* -.1 */
  115.     { -1,  1, { 1 }, 0L },  /* ._1 */
  116.     { -1, -1, { 1 }, 0L },  /* -._1 */
  117.     { -999,          1, { 1 }, 0L },   /* .___1 small */
  118.     { MP_EXP_T_MIN,  1, { 1 }, 0L },   /* .____1 very small */
  119.     { 999,          1, { 1 }, 0L },    /* 1____. big */
  120.     { MP_EXP_T_MAX, 1, { 1 }, 0L },    /* 1_____. very big */
  121.     { 1, 2, { 999, 2 }, 2L },                  /* 2.9 */
  122.     { 5, 8, { 7, 8, 9, 3, 0, 0, 0, 1 }, 3L },  /* 10003.987 */
  123.     { 2, 2, { M, M },    LONG_MAX }, /* FF. */
  124.     { 2, 2, { M, M, M }, LONG_MAX }, /* FF.F */
  125.     { 3, 3, { M, M, M }, LONG_MAX }, /* FFF. */
  126. #if GMP_NUMB_BITS >= BITS_PER_ULONG
  127.     /* normal case, numb bigger than long */
  128.     { 2,  1, { 1 },    0L },      /* 1_. */
  129.     { 2,  2, { 0, 1 }, 0L },      /* 10. */
  130.     { 2,  2, { 999, 1 }, 999L },  /* 19. */
  131.     { 3,  2, { 999, 1 }, 0L },    /* 19_. */
  132. #else
  133.     /* nails case, numb smaller than long */
  134.     { 2,  1, { 1 }, 1L << GMP_NUMB_BITS },  /* 1_. */
  135.     { 3,  1, { 1 }, 0L },                   /* 1__. */
  136.     { 2,  2, { 99, 1 },    99L + (1L << GMP_NUMB_BITS) },  /* 19. */
  137.     { 3,  2, { 1, 99 },    1L << GMP_NUMB_BITS },          /* 91_. */
  138.     { 3,  3, { 0, 1, 99 }, 1L << GMP_NUMB_BITS },          /* 910. */
  139. #endif
  140.   };
  141.   mpf_t          f;
  142.   unsigned long  got;
  143.   int            i;
  144.   mp_limb_t      buf[20 + numberof(data[i].d)];
  145.   for (i = 0; i < numberof (data); i++)
  146.     {
  147.       refmpn_fill (buf, 10, CNST_LIMB(0xDEADBEEF));
  148.       refmpn_copy (buf+10, data[i].d, ABS(data[i].size));
  149.       refmpn_fill (buf+10+ABS(data[i].size), 10, CNST_LIMB(0xDEADBEEF));
  150.       PTR(f) = buf+10;
  151.       EXP(f) = data[i].exp;
  152.       SIZ(f) = data[i].size;
  153.       PREC(f) = numberof (data[i].d);
  154.       MPF_CHECK_FORMAT (f);
  155.       got = mpf_get_si (f);
  156.       if (got != data[i].want)
  157. {
  158.   printf    ("mpf_get_si wrong at limb data[%d]n", i);
  159.   mpf_trace ("  f", f);
  160.   mpn_trace ("  d", data[i].d, data[i].size);
  161.   printf    ("  size %ldn", (long) data[i].size);
  162.   printf    ("  exp %ldn", (long) data[i].exp);
  163.   printf    ("  got   %lu (0x%lX)n", got, got);
  164.   printf    ("  want  %lu (0x%lX)n", data[i].want, data[i].want);
  165.   abort();
  166. }
  167.     }
  168. }
  169. int
  170. main (void)
  171. {
  172.   tests_start ();
  173.   check_data ();
  174.   check_max ();
  175.   check_limbdata ();
  176.   tests_end ();
  177.   exit (0);
  178. }