xref: /netbsd-src/external/lgpl3/gmp/dist/tests/mpq/t-set_f.c (revision f14316bcbc544b96a93e884bc5c2b15fd60e22ae)
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 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