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

数学计算

开发平台:

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.     const char  *n;
  24.     long        want;
  25.   } data[] = {
  26.     { "0",      0L },
  27.     { "1",      1L },
  28.     { "-1",     -1L },
  29.     { "2",      2L },
  30.     { "-2",     -2L },
  31.     { "12345",  12345L },
  32.     { "-12345", -12345L },
  33.   };
  34.   int    i;
  35.   mpz_t  n;
  36.   long   got;
  37.   mpz_init (n);
  38.   for (i = 0; i < numberof (data); i++)
  39.     {
  40.       mpz_set_str_or_abort (n, data[i].n, 0);
  41.       got = mpz_get_si (n);
  42.       if (got != data[i].want)
  43. {
  44.   printf ("mpz_get_si wrong at data[%d]n", i);
  45.   printf ("   n     "%s" (", data[i].n);
  46.   mpz_out_str (stdout, 10, n); printf (", hex ");
  47.   mpz_out_str (stdout, 16, n); printf (")n");
  48.   printf ("   got   %ld (0x%lX)n", got, got);
  49.   printf ("   want  %ld (0x%lX)n", data[i].want, data[i].want);
  50.   abort();
  51. }
  52.     }
  53.   mpz_clear (n);
  54. }
  55. void
  56. check_max (void)
  57. {
  58.   mpz_t  n;
  59.   long   want;
  60.   long   got;
  61.   mpz_init (n);
  62. #define CHECK_MAX(name)                                 
  63.   if (got != want)                                      
  64.     {                                                   
  65.       printf ("mpz_get_si wrong on %sn", name);        
  66.       printf ("   n    ");                              
  67.       mpz_out_str (stdout, 10, n); printf (", hex ");   
  68.       mpz_out_str (stdout, 16, n); printf ("n");       
  69.       printf ("   got  %ld, hex %lXn", got, got);      
  70.       printf ("   want %ld, hex %lXn", want, want);    
  71.       abort();                                          
  72.     }
  73.   want = LONG_MAX;
  74.   mpz_set_si (n, want);
  75.   got = mpz_get_si (n);
  76.   CHECK_MAX ("LONG_MAX");
  77.   want = LONG_MIN;
  78.   mpz_set_si (n, want);
  79.   got = mpz_get_si (n);
  80.   CHECK_MAX ("LONG_MIN");
  81.   /* The following checks that -0x100000000 gives -0x80000000.  This doesn't
  82.      actually fit in a long and the result from mpz_get_si() is undefined,
  83.      but -0x80000000 is what comes out currently, and it should be that
  84.      value irrespective of the mp_limb_t size (long or long long).  */
  85.   want = LONG_MIN;
  86.   mpz_mul_2exp (n, n, 1);
  87.   CHECK_MAX ("-0x100...00");
  88.   mpz_clear (n);
  89. }
  90. int
  91. main (void)
  92. {
  93.   tests_start ();
  94.   check_data ();
  95.   check_max ();
  96.   tests_end ();
  97.   exit (0);
  98. }