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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpq_get_str.
  2. Copyright 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 <string.h>
  17. #include "gmp.h"
  18. #include "gmp-impl.h"
  19. #include "tests.h"
  20. void
  21. check_one (mpq_srcptr q, int base, const char *want)
  22. {
  23.   char    *str, *ret;
  24.   size_t  str_alloc;
  25.   MPQ_CHECK_FORMAT (q);
  26.   mp_trace_base = base;
  27.   str_alloc =
  28.     mpz_sizeinbase (mpq_numref(q), ABS(base)) +
  29.     mpz_sizeinbase (mpq_denref(q), ABS(base)) + 3;
  30.   str = mpq_get_str (NULL, base, q);
  31.   if (strlen(str)+1 > str_alloc)
  32.     {
  33.       printf ("mpq_get_str size bigger than should be (passing NULL)n");
  34.       printf ("  base %dn", base);
  35.       printf ("  got  size %lu "%s"n", (unsigned long)  strlen(str)+1, str);
  36.       printf ("  want size %lun", (unsigned long) str_alloc);
  37.       abort ();
  38.     }
  39.   if (strcmp (str, want) != 0)
  40.     {
  41.       printf ("mpq_get_str wrong (passing NULL)n");
  42.       printf ("  base %dn", base);
  43.       printf ("  got  "%s"n", str);
  44.       printf ("  want "%s"n", want);
  45.       mpq_trace ("  q", q);
  46.       abort ();
  47.     }
  48.   (*__gmp_free_func) (str, strlen (str) + 1);
  49.   str = (char *) (*__gmp_allocate_func) (str_alloc);
  50.   ret = mpq_get_str (str, base, q);
  51.   if (str != ret)
  52.     {
  53.       printf ("mpq_get_str wrong return value (passing non-NULL)n");
  54.       printf ("  base %dn", base);
  55.       printf ("  got  %pn", ret);
  56.       printf ("  want %pn", want);
  57.       abort ();
  58.     }
  59.   if (strcmp (str, want) != 0)
  60.     {
  61.       printf ("mpq_get_str wrong (passing non-NULL)n");
  62.       printf ("  base %dn", base);
  63.       printf ("  got  "%s"n", str);
  64.       printf ("  want "%s"n", want);
  65.       abort ();
  66.     }
  67.   (*__gmp_free_func) (str, str_alloc);
  68. }
  69. void
  70. check_all (mpq_srcptr q, int base, const char *want)
  71. {
  72.   char  *s;
  73.   check_one (q, base, want);
  74.   s = __gmp_allocate_strdup (want);
  75.   strtoupper (s);
  76.   check_one (q, -base, s);
  77.   (*__gmp_free_func) (s, strlen(s)+1);
  78. }
  79. void
  80. check_data (void)
  81. {
  82.   static const struct {
  83.     int         base;
  84.     const char  *num;
  85.     const char  *den;
  86.     const char  *want;
  87.   } data[] = {
  88.     { 10, "0", "1", "0" },
  89.     { 10, "1", "1", "1" },
  90.     { 16, "ffffffff", "1", "ffffffff" },
  91.     { 16, "ffffffffffffffff", "1", "ffffffffffffffff" },
  92.     { 16, "1", "ffffffff", "1/ffffffff" },
  93.     { 16, "1", "ffffffffffffffff", "1/ffffffffffffffff" },
  94.     { 16, "1", "10000000000000003", "1/10000000000000003" },
  95.     { 10, "12345678901234567890", "9876543210987654323",
  96.       "12345678901234567890/9876543210987654323" },
  97.   };
  98.   mpq_t  q;
  99.   int    i;
  100.   mpq_init (q);
  101.   for (i = 0; i < numberof (data); i++)
  102.     {
  103.       mpz_set_str_or_abort (mpq_numref(q), data[i].num, data[i].base);
  104.       mpz_set_str_or_abort (mpq_denref(q), data[i].den, data[i].base);
  105.       check_all (q, data[i].base, data[i].want);
  106.     }
  107.   mpq_clear (q);
  108. }
  109. int
  110. main (void)
  111. {
  112.   tests_start ();
  113.   check_data ();
  114.   tests_end ();
  115.   exit (0);
  116. }