(root)/
gmp-6.3.0/
tests/
mpq/
t-set_f.c
       1  /* Test mpq_set_f.
       2  
       3  Copyright 2000, 2001 Free Software Foundation, Inc.
       4  
       5  This file is part of the GNU MP Library test suite.
       6  
       7  The GNU MP Library test suite is free software; you can redistribute it
       8  and/or modify it under the terms of the GNU General Public License as
       9  published by the Free Software Foundation; either version 3 of the License,
      10  or (at your option) any later version.
      11  
      12  The GNU MP Library test suite is distributed in the hope that it will be
      13  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
      14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
      15  Public License for more details.
      16  
      17  You should have received a copy of the GNU General Public License along with
      18  the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
      19  
      20  #include <stdio.h>
      21  #include <stdlib.h>
      22  #include "gmp-impl.h"
      23  #include "tests.h"
      24  
      25  int
      26  main (int argc, char **argv)
      27  {
      28  #if GMP_NAIL_BITS == 0
      29    static const struct {
      30      int         f_base;
      31      const char  *f;
      32      int         z_base;
      33      const char  *want_num;
      34      const char  *want_den;
      35  
      36    } data[] = {
      37  
      38      { -2, "0",    16, "0", "1" },
      39      { -2, "1",    16, "1", "1" },
      40      { -2, "1@1",  16, "2", "1" },
      41      { -2, "1@2",  16, "4", "1" },
      42      { -2, "1@3",  16, "8", "1" },
      43  
      44      { -2, "1@30", 16,  "40000000", "1" },
      45      { -2, "1@31", 16,  "80000000", "1" },
      46      { -2, "1@32", 16, "100000000", "1" },
      47      { -2, "1@33", 16, "200000000", "1" },
      48      { -2, "1@34", 16, "400000000", "1" },
      49  
      50      { -2, "1@62", 16,  "4000000000000000", "1" },
      51      { -2, "1@63", 16,  "8000000000000000", "1" },
      52      { -2, "1@64", 16, "10000000000000000", "1" },
      53      { -2, "1@65", 16, "20000000000000000", "1" },
      54      { -2, "1@66", 16, "40000000000000000", "1" },
      55  
      56      { -2, "1@126", 16,  "40000000000000000000000000000000", "1" },
      57      { -2, "1@127", 16,  "80000000000000000000000000000000", "1" },
      58      { -2, "1@128", 16, "100000000000000000000000000000000", "1" },
      59      { -2, "1@129", 16, "200000000000000000000000000000000", "1" },
      60      { -2, "1@130", 16, "400000000000000000000000000000000", "1" },
      61  
      62      { -2, "1@-1",  16, "1", "2" },
      63      { -2, "1@-2",  16, "1", "4" },
      64      { -2, "1@-3",  16, "1", "8" },
      65  
      66      { -2, "1@-30", 16, "1",  "40000000" },
      67      { -2, "1@-31", 16, "1",  "80000000" },
      68      { -2, "1@-32", 16, "1", "100000000" },
      69      { -2, "1@-33", 16, "1", "200000000" },
      70      { -2, "1@-34", 16, "1", "400000000" },
      71  
      72      { -2, "1@-62", 16, "1",  "4000000000000000" },
      73      { -2, "1@-63", 16, "1",  "8000000000000000" },
      74      { -2, "1@-64", 16, "1", "10000000000000000" },
      75      { -2, "1@-65", 16, "1", "20000000000000000" },
      76      { -2, "1@-66", 16, "1", "40000000000000000" },
      77  
      78      { -2, "1@-126", 16, "1",  "40000000000000000000000000000000" },
      79      { -2, "1@-127", 16, "1",  "80000000000000000000000000000000" },
      80      { -2, "1@-128", 16, "1", "100000000000000000000000000000000" },
      81      { -2, "1@-129", 16, "1", "200000000000000000000000000000000" },
      82      { -2, "1@-130", 16, "1", "400000000000000000000000000000000" },
      83  
      84      { -2, "1@-30", 16, "1",  "40000000" },
      85      { -2, "1@-31", 16, "1",  "80000000" },
      86      { -2, "1@-32", 16, "1", "100000000" },
      87      { -2, "1@-33", 16, "1", "200000000" },
      88      { -2, "1@-34", 16, "1", "400000000" },
      89  
      90      { -2, "11@-62", 16, "3",  "4000000000000000" },
      91      { -2, "11@-63", 16, "3",  "8000000000000000" },
      92      { -2, "11@-64", 16, "3", "10000000000000000" },
      93      { -2, "11@-65", 16, "3", "20000000000000000" },
      94      { -2, "11@-66", 16, "3", "40000000000000000" },
      95  
      96      { 16, "80000000.00000001", 16, "8000000000000001", "100000000" },
      97      { 16, "80000000.00000008", 16, "1000000000000001",  "20000000" },
      98      { 16, "80000000.8",        16, "100000001", "2" },
      99  
     100    };
     101  
     102    mpf_t  f;
     103    mpq_t  got;
     104    mpz_t  want_num, want_den;
     105    int    i, neg;
     106  
     107    tests_start ();
     108  
     109    mpf_init2 (f, 1024L);
     110    mpq_init (got);
     111    mpz_init (want_num);
     112    mpz_init (want_den);
     113  
     114    for (i = 0; i < numberof (data); i++)
     115      {
     116        for (neg = 0; neg <= 1; neg++)
     117          {
     118            mpf_set_str_or_abort (f, data[i].f, data[i].f_base);
     119            mpz_set_str_or_abort (want_num, data[i].want_num, data[i].z_base);
     120            mpz_set_str_or_abort (want_den, data[i].want_den, data[i].z_base);
     121  
     122            if (neg)
     123              {
     124                mpf_neg (f, f);
     125                mpz_neg (want_num, want_num);
     126              }
     127  
     128            mpq_set_f (got, f);
     129            MPQ_CHECK_FORMAT (got);
     130  
     131            if (mpz_cmp (mpq_numref(got), want_num) != 0
     132                || mpz_cmp (mpq_denref(got), want_den) != 0)
     133              {
     134                printf ("wrong at data[%d]\n", i);
     135                printf ("   f_base %d, z_base %d\n",
     136                        data[i].f_base, data[i].z_base);
     137  
     138                printf ("   f \"%s\" hex ", data[i].f);
     139                mpf_out_str (stdout, 16, 0, f);
     140                printf ("\n");
     141  
     142                printf ("   want num 0x");
     143                mpz_out_str (stdout, 16, want_num);
     144                printf ("\n");
     145                printf ("   want den 0x");
     146                mpz_out_str (stdout, 16, want_den);
     147                printf ("\n");
     148  
     149                printf ("   got num 0x");
     150                mpz_out_str (stdout, 16, mpq_numref(got));
     151                printf ("\n");
     152                printf ("   got den 0x");
     153                mpz_out_str (stdout, 16, mpq_denref(got));
     154                printf ("\n");
     155  
     156                abort ();
     157              }
     158          }
     159      }
     160  
     161    mpf_clear (f);
     162    mpq_clear (got);
     163    mpz_clear (want_num);
     164    mpz_clear (want_den);
     165  
     166    tests_end ();
     167  #endif
     168    exit (0);
     169  }