t-set_f.c revision 1.1.1.2 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.2 mrg the GNU MP Library test suite. If not, see http://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.h"
23 1.1 mrg #include "gmp-impl.h"
24 1.1 mrg #include "tests.h"
25 1.1 mrg
26 1.1 mrg int
27 1.1 mrg main (int argc, char **argv)
28 1.1 mrg {
29 1.1 mrg #if GMP_NAIL_BITS == 0
30 1.1 mrg static const struct {
31 1.1 mrg int f_base;
32 1.1 mrg const char *f;
33 1.1 mrg int z_base;
34 1.1 mrg const char *want_num;
35 1.1 mrg const char *want_den;
36 1.1 mrg
37 1.1 mrg } data[] = {
38 1.1 mrg
39 1.1 mrg { -2, "0", 16, "0", "1" },
40 1.1 mrg { -2, "1", 16, "1", "1" },
41 1.1 mrg { -2, "1@1", 16, "2", "1" },
42 1.1 mrg { -2, "1@2", 16, "4", "1" },
43 1.1 mrg { -2, "1@3", 16, "8", "1" },
44 1.1 mrg
45 1.1 mrg { -2, "1@30", 16, "40000000", "1" },
46 1.1 mrg { -2, "1@31", 16, "80000000", "1" },
47 1.1 mrg { -2, "1@32", 16, "100000000", "1" },
48 1.1 mrg { -2, "1@33", 16, "200000000", "1" },
49 1.1 mrg { -2, "1@34", 16, "400000000", "1" },
50 1.1 mrg
51 1.1 mrg { -2, "1@62", 16, "4000000000000000", "1" },
52 1.1 mrg { -2, "1@63", 16, "8000000000000000", "1" },
53 1.1 mrg { -2, "1@64", 16, "10000000000000000", "1" },
54 1.1 mrg { -2, "1@65", 16, "20000000000000000", "1" },
55 1.1 mrg { -2, "1@66", 16, "40000000000000000", "1" },
56 1.1 mrg
57 1.1 mrg { -2, "1@126", 16, "40000000000000000000000000000000", "1" },
58 1.1 mrg { -2, "1@127", 16, "80000000000000000000000000000000", "1" },
59 1.1 mrg { -2, "1@128", 16, "100000000000000000000000000000000", "1" },
60 1.1 mrg { -2, "1@129", 16, "200000000000000000000000000000000", "1" },
61 1.1 mrg { -2, "1@130", 16, "400000000000000000000000000000000", "1" },
62 1.1 mrg
63 1.1 mrg { -2, "1@-1", 16, "1", "2" },
64 1.1 mrg { -2, "1@-2", 16, "1", "4" },
65 1.1 mrg { -2, "1@-3", 16, "1", "8" },
66 1.1 mrg
67 1.1 mrg { -2, "1@-30", 16, "1", "40000000" },
68 1.1 mrg { -2, "1@-31", 16, "1", "80000000" },
69 1.1 mrg { -2, "1@-32", 16, "1", "100000000" },
70 1.1 mrg { -2, "1@-33", 16, "1", "200000000" },
71 1.1 mrg { -2, "1@-34", 16, "1", "400000000" },
72 1.1 mrg
73 1.1 mrg { -2, "1@-62", 16, "1", "4000000000000000" },
74 1.1 mrg { -2, "1@-63", 16, "1", "8000000000000000" },
75 1.1 mrg { -2, "1@-64", 16, "1", "10000000000000000" },
76 1.1 mrg { -2, "1@-65", 16, "1", "20000000000000000" },
77 1.1 mrg { -2, "1@-66", 16, "1", "40000000000000000" },
78 1.1 mrg
79 1.1 mrg { -2, "1@-126", 16, "1", "40000000000000000000000000000000" },
80 1.1 mrg { -2, "1@-127", 16, "1", "80000000000000000000000000000000" },
81 1.1 mrg { -2, "1@-128", 16, "1", "100000000000000000000000000000000" },
82 1.1 mrg { -2, "1@-129", 16, "1", "200000000000000000000000000000000" },
83 1.1 mrg { -2, "1@-130", 16, "1", "400000000000000000000000000000000" },
84 1.1 mrg
85 1.1 mrg { -2, "1@-30", 16, "1", "40000000" },
86 1.1 mrg { -2, "1@-31", 16, "1", "80000000" },
87 1.1 mrg { -2, "1@-32", 16, "1", "100000000" },
88 1.1 mrg { -2, "1@-33", 16, "1", "200000000" },
89 1.1 mrg { -2, "1@-34", 16, "1", "400000000" },
90 1.1 mrg
91 1.1 mrg { -2, "11@-62", 16, "3", "4000000000000000" },
92 1.1 mrg { -2, "11@-63", 16, "3", "8000000000000000" },
93 1.1 mrg { -2, "11@-64", 16, "3", "10000000000000000" },
94 1.1 mrg { -2, "11@-65", 16, "3", "20000000000000000" },
95 1.1 mrg { -2, "11@-66", 16, "3", "40000000000000000" },
96 1.1 mrg
97 1.1 mrg { 16, "80000000.00000001", 16, "8000000000000001", "100000000" },
98 1.1 mrg { 16, "80000000.00000008", 16, "1000000000000001", "20000000" },
99 1.1 mrg { 16, "80000000.8", 16, "100000001", "2" },
100 1.1 mrg
101 1.1 mrg };
102 1.1 mrg
103 1.1 mrg mpf_t f;
104 1.1 mrg mpq_t got;
105 1.1 mrg mpz_t want_num, want_den;
106 1.1 mrg int i, neg;
107 1.1 mrg
108 1.1 mrg tests_start ();
109 1.1 mrg
110 1.1 mrg mpf_init2 (f, 1024L);
111 1.1 mrg mpq_init (got);
112 1.1 mrg mpz_init (want_num);
113 1.1 mrg mpz_init (want_den);
114 1.1 mrg
115 1.1 mrg for (i = 0; i < numberof (data); i++)
116 1.1 mrg {
117 1.1 mrg for (neg = 0; neg <= 1; neg++)
118 1.1 mrg {
119 1.1 mrg mpf_set_str_or_abort (f, data[i].f, data[i].f_base);
120 1.1 mrg mpz_set_str_or_abort (want_num, data[i].want_num, data[i].z_base);
121 1.1 mrg mpz_set_str_or_abort (want_den, data[i].want_den, data[i].z_base);
122 1.1 mrg
123 1.1 mrg if (neg)
124 1.1 mrg {
125 1.1 mrg mpf_neg (f, f);
126 1.1 mrg mpz_neg (want_num, want_num);
127 1.1 mrg }
128 1.1 mrg
129 1.1 mrg mpq_set_f (got, f);
130 1.1 mrg MPQ_CHECK_FORMAT (got);
131 1.1 mrg
132 1.1 mrg if (mpz_cmp (mpq_numref(got), want_num) != 0
133 1.1 mrg || mpz_cmp (mpq_denref(got), want_den) != 0)
134 1.1 mrg {
135 1.1 mrg printf ("wrong at data[%d]\n", i);
136 1.1 mrg printf (" f_base %d, z_base %d\n",
137 1.1 mrg data[i].f_base, data[i].z_base);
138 1.1 mrg
139 1.1 mrg printf (" f \"%s\" hex ", data[i].f);
140 1.1 mrg mpf_out_str (stdout, 16, 0, f);
141 1.1 mrg printf ("\n");
142 1.1 mrg
143 1.1 mrg printf (" want num 0x");
144 1.1 mrg mpz_out_str (stdout, 16, want_num);
145 1.1 mrg printf ("\n");
146 1.1 mrg printf (" want den 0x");
147 1.1 mrg mpz_out_str (stdout, 16, want_den);
148 1.1 mrg printf ("\n");
149 1.1 mrg
150 1.1 mrg printf (" got num 0x");
151 1.1 mrg mpz_out_str (stdout, 16, mpq_numref(got));
152 1.1 mrg printf ("\n");
153 1.1 mrg printf (" got den 0x");
154 1.1 mrg mpz_out_str (stdout, 16, mpq_denref(got));
155 1.1 mrg printf ("\n");
156 1.1 mrg
157 1.1 mrg abort ();
158 1.1 mrg }
159 1.1 mrg }
160 1.1 mrg }
161 1.1 mrg
162 1.1 mrg mpf_clear (f);
163 1.1 mrg mpq_clear (got);
164 1.1 mrg mpz_clear (want_num);
165 1.1 mrg mpz_clear (want_den);
166 1.1 mrg
167 1.1 mrg tests_end ();
168 1.1 mrg #endif
169 1.1 mrg exit (0);
170 1.1 mrg }
171