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

数学计算

开发平台:

Unix_Linux

  1. /* Test conversion and I/O using mpz_out_str and mpz_inp_str.
  2. Copyright 1993, 1994, 1996, 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 "config.h"
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #if HAVE_UNISTD_H
  18. #include <unistd.h> /* for unlink */
  19. #endif
  20. #include "gmp.h"
  21. #include "gmp-impl.h"
  22. #include "tests.h"
  23. #define FILENAME  "io.tmp"
  24. void
  25. debug_mp (mpz_t x, int base)
  26. {
  27.   mpz_out_str (stdout, base, x); fputc ('n', stdout);
  28. }
  29. int
  30. main (int argc, char **argv)
  31. {
  32.   mpz_t  op1, op2;
  33.   mp_size_t size;
  34.   int i;
  35.   int reps = 10000;
  36.   FILE *fp;
  37.   int base;
  38.   gmp_randstate_ptr rands;
  39.   mpz_t bs;
  40.   unsigned long bsi, size_range;
  41.   size_t nread;
  42.   tests_start ();
  43.   rands = RANDS;
  44.   mpz_init (bs);
  45.   if (argc == 2)
  46.     reps = atoi (argv[1]);
  47.   mpz_init (op1);
  48.   mpz_init (op2);
  49.   fp = fopen (FILENAME, "w+");
  50.   for (i = 0; i < reps; i++)
  51.     {
  52.       mpz_urandomb (bs, rands, 32);
  53.       size_range = mpz_get_ui (bs) % 10 + 2;
  54.       mpz_urandomb (bs, rands, size_range);
  55.       size = mpz_get_ui (bs);
  56.       mpz_rrandomb (op1, rands, size);
  57.       mpz_urandomb (bs, rands, 1);
  58.       bsi = mpz_get_ui (bs);
  59.       if ((bsi & 1) != 0)
  60. mpz_neg (op1, op1);
  61.       mpz_urandomb (bs, rands, 16);
  62.       bsi = mpz_get_ui (bs);
  63.       base = bsi % 36 + 1;
  64.       if (base == 1)
  65. base = 0;
  66.       rewind (fp);
  67.       if (mpz_out_str (fp, base, op1) == 0
  68.   || putc (' ', fp) == EOF
  69.   || fflush (fp) != 0)
  70. {
  71.   printf ("mpz_out_str write errorn");
  72.   abort ();
  73. }
  74.       rewind (fp);
  75.       nread = mpz_inp_str (op2, fp, base);
  76.       if (nread == 0)
  77. {
  78.   if (ferror (fp))
  79.     printf ("mpz_inp_str stream read errorn");
  80.   else
  81.     printf ("mpz_inp_str data conversion errorn");
  82.   abort ();
  83. }
  84.       if (nread != ftell(fp))
  85. {
  86.   printf ("mpz_inp_str nread doesn't match ftelln");
  87.   printf ("  nread  %lun", (unsigned long) nread);
  88.   printf ("  ftell  %ldn", ftell(fp));
  89.   abort ();
  90. }
  91.       if (mpz_cmp (op1, op2))
  92. {
  93.   printf ("ERRORn");
  94.   printf ("op1  = "); debug_mp (op1, -16);
  95.   printf ("op2  = "); debug_mp (op2, -16);
  96.   printf ("base = %dn", base);
  97.   abort ();
  98. }
  99.     }
  100.   fclose (fp);
  101.   unlink (FILENAME);
  102.   mpz_clear (bs);
  103.   mpz_clear (op1);
  104.   mpz_clear (op2);
  105.   tests_end ();
  106.   exit (0);
  107. }