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