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