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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpq_set_f.
  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. int
  20. main (int argc, char **argv)
  21. {
  22. #if GMP_NAIL_BITS == 0
  23.   static const struct {
  24.     int         f_base;
  25.     const char  *f;
  26.     int         z_base;
  27.     const char  *want_num;
  28.     const char  *want_den;
  29.   } data[] = {
  30.     { -2, "0",    16, "0", "1" },
  31.     { -2, "1",    16, "1", "1" },
  32.     { -2, "1@1",  16, "2", "1" },
  33.     { -2, "1@2",  16, "4", "1" },
  34.     { -2, "1@3",  16, "8", "1" },
  35.     { -2, "1@30", 16,  "40000000", "1" },
  36.     { -2, "1@31", 16,  "80000000", "1" },
  37.     { -2, "1@32", 16, "100000000", "1" },
  38.     { -2, "1@33", 16, "200000000", "1" },
  39.     { -2, "1@34", 16, "400000000", "1" },
  40.     { -2, "1@62", 16,  "4000000000000000", "1" },
  41.     { -2, "1@63", 16,  "8000000000000000", "1" },
  42.     { -2, "1@64", 16, "10000000000000000", "1" },
  43.     { -2, "1@65", 16, "20000000000000000", "1" },
  44.     { -2, "1@66", 16, "40000000000000000", "1" },
  45.     { -2, "1@126", 16,  "40000000000000000000000000000000", "1" },
  46.     { -2, "1@127", 16,  "80000000000000000000000000000000", "1" },
  47.     { -2, "1@128", 16, "100000000000000000000000000000000", "1" },
  48.     { -2, "1@129", 16, "200000000000000000000000000000000", "1" },
  49.     { -2, "1@130", 16, "400000000000000000000000000000000", "1" },
  50.     { -2, "1@-1",  16, "1", "2" },
  51.     { -2, "1@-2",  16, "1", "4" },
  52.     { -2, "1@-3",  16, "1", "8" },
  53.     { -2, "1@-30", 16, "1",  "40000000" },
  54.     { -2, "1@-31", 16, "1",  "80000000" },
  55.     { -2, "1@-32", 16, "1", "100000000" },
  56.     { -2, "1@-33", 16, "1", "200000000" },
  57.     { -2, "1@-34", 16, "1", "400000000" },
  58.     { -2, "1@-62", 16, "1",  "4000000000000000" },
  59.     { -2, "1@-63", 16, "1",  "8000000000000000" },
  60.     { -2, "1@-64", 16, "1", "10000000000000000" },
  61.     { -2, "1@-65", 16, "1", "20000000000000000" },
  62.     { -2, "1@-66", 16, "1", "40000000000000000" },
  63.     { -2, "1@-126", 16, "1",  "40000000000000000000000000000000" },
  64.     { -2, "1@-127", 16, "1",  "80000000000000000000000000000000" },
  65.     { -2, "1@-128", 16, "1", "100000000000000000000000000000000" },
  66.     { -2, "1@-129", 16, "1", "200000000000000000000000000000000" },
  67.     { -2, "1@-130", 16, "1", "400000000000000000000000000000000" },
  68.     { -2, "1@-30", 16, "1",  "40000000" },
  69.     { -2, "1@-31", 16, "1",  "80000000" },
  70.     { -2, "1@-32", 16, "1", "100000000" },
  71.     { -2, "1@-33", 16, "1", "200000000" },
  72.     { -2, "1@-34", 16, "1", "400000000" },
  73.     { -2, "11@-62", 16, "3",  "4000000000000000" },
  74.     { -2, "11@-63", 16, "3",  "8000000000000000" },
  75.     { -2, "11@-64", 16, "3", "10000000000000000" },
  76.     { -2, "11@-65", 16, "3", "20000000000000000" },
  77.     { -2, "11@-66", 16, "3", "40000000000000000" },
  78.     { 16, "80000000.00000001", 16, "8000000000000001", "100000000" },
  79.     { 16, "80000000.00000008", 16, "1000000000000001",  "20000000" },
  80.     { 16, "80000000.8",        16, "100000001", "2" },
  81.   };
  82.   mpf_t  f;
  83.   mpq_t  got;
  84.   mpz_t  want_num, want_den;
  85.   int    i, neg;
  86.   tests_start ();
  87.   mpf_init2 (f, 1024L);
  88.   mpq_init (got);
  89.   mpz_init (want_num);
  90.   mpz_init (want_den);
  91.   for (i = 0; i < numberof (data); i++)
  92.     {
  93.       for (neg = 0; neg <= 1; neg++)
  94.         {
  95.           mpf_set_str_or_abort (f, data[i].f, data[i].f_base);
  96.           mpz_set_str_or_abort (want_num, data[i].want_num, data[i].z_base);
  97.           mpz_set_str_or_abort (want_den, data[i].want_den, data[i].z_base);
  98.           if (neg)
  99.             {
  100.               mpf_neg (f, f);
  101.               mpz_neg (want_num, want_num);
  102.             }
  103.           mpq_set_f (got, f);
  104.           MPQ_CHECK_FORMAT (got);
  105.           if (mpz_cmp (mpq_numref(got), want_num) != 0
  106.               || mpz_cmp (mpq_denref(got), want_den) != 0)
  107.             {
  108.               printf ("wrong at data[%d]n", i);
  109.               printf ("   f_base %d, z_base %dn",
  110.                       data[i].f_base, data[i].z_base);
  111.               printf ("   f "%s" hex ", data[i].f);
  112.               mpf_out_str (stdout, 16, 0, f);
  113.               printf ("n");
  114.               printf ("   want num 0x");
  115.               mpz_out_str (stdout, 16, want_num);
  116.               printf ("n");
  117.               printf ("   want den 0x");
  118.               mpz_out_str (stdout, 16, want_den);
  119.               printf ("n");
  120.               printf ("   got num 0x");
  121.               mpz_out_str (stdout, 16, mpq_numref(got));
  122.               printf ("n");
  123.               printf ("   got den 0x");
  124.               mpz_out_str (stdout, 16, mpq_denref(got));
  125.               printf ("n");
  126.               abort ();
  127.             }
  128.         }
  129.     }
  130.   mpf_clear (f);
  131.   mpq_clear (got);
  132.   mpz_clear (want_num);
  133.   mpz_clear (want_den);
  134.   tests_end ();
  135. #endif
  136.   exit (0);
  137. }