tget_str.c revision 1.1.1.4 1 1.1 mrg /* Test file for mpfr_get_str.
2 1.1 mrg
3 1.1.1.4 mrg Copyright 1999, 2001-2018 Free Software Foundation, Inc.
4 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA.
5 1.1 mrg
6 1.1 mrg This file is part of the GNU MPFR Library.
7 1.1 mrg
8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 1.1 mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 1.1 mrg
23 1.1 mrg #include "mpfr-test.h"
24 1.1 mrg
25 1.1 mrg static void
26 1.1.1.2 mrg check3 (const char *d, mpfr_rnd_t rnd, const char *res)
27 1.1 mrg {
28 1.1 mrg mpfr_t x;
29 1.1 mrg char *str;
30 1.1 mrg mpfr_exp_t e;
31 1.1 mrg
32 1.1 mrg mpfr_init2 (x, 53);
33 1.1 mrg mpfr_set_str (x, d, 10, rnd);
34 1.1 mrg str = mpfr_get_str (NULL, &e, 10, 5, x, rnd);
35 1.1 mrg if (strcmp (str, res))
36 1.1 mrg {
37 1.1 mrg printf ("Error in mpfr_get_str for x=%s\n", d);
38 1.1 mrg printf ("got %s instead of %s\n", str, res);
39 1.1 mrg exit (1);
40 1.1 mrg }
41 1.1 mrg mpfr_clear (x);
42 1.1 mrg mpfr_free_str (str);
43 1.1 mrg }
44 1.1 mrg
45 1.1 mrg static void
46 1.1 mrg check_small (void)
47 1.1 mrg {
48 1.1 mrg mpfr_t x;
49 1.1 mrg char *s;
50 1.1 mrg mpfr_exp_t e;
51 1.1 mrg mpfr_prec_t p;
52 1.1 mrg
53 1.1 mrg mpfr_init (x);
54 1.1 mrg
55 1.1 mrg mpfr_set_prec (x, 20);
56 1.1 mrg mpfr_set_ui (x, 2, MPFR_RNDN);
57 1.1 mrg mpfr_nexttozero (x);
58 1.1 mrg s = mpfr_get_str (NULL, &e, 4, 2, x, MPFR_RNDU);
59 1.1 mrg if (strcmp (s, "20") || (e != 1))
60 1.1 mrg {
61 1.1 mrg printf ("Error in mpfr_get_str: 2- rounded up with 2 digits"
62 1.1 mrg " in base 4\n");
63 1.1 mrg exit (1);
64 1.1 mrg }
65 1.1 mrg mpfr_free_str (s);
66 1.1 mrg
67 1.1 mrg /* check n_digits=0 */
68 1.1 mrg mpfr_set_prec (x, 5);
69 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
70 1.1 mrg s = mpfr_get_str (NULL, &e, 3, 0, x, MPFR_RNDN);
71 1.1 mrg mpfr_free_str (s);
72 1.1 mrg s = mpfr_get_str (NULL, &e, 36, 0, x, MPFR_RNDN);
73 1.1 mrg mpfr_free_str (s);
74 1.1 mrg s = mpfr_get_str (NULL, &e, 62, 0, x, MPFR_RNDN);
75 1.1 mrg mpfr_free_str (s);
76 1.1 mrg
77 1.1 mrg mpfr_set_prec (x, 64);
78 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
79 1.1 mrg mpfr_div_2exp (x, x, 63, MPFR_RNDN); /* x = -2^(-63) */
80 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN); /* x = 1 - 2^(-63) */
81 1.1 mrg mpfr_mul_2exp (x, x, 32, MPFR_RNDN); /* x = 2^32 - 2^(-31) */
82 1.1 mrg s = mpfr_get_str (NULL, &e, 3, 21, x, MPFR_RNDU);
83 1.1 mrg if (strcmp (s, "102002022201221111211") || (e != 21))
84 1.1 mrg {
85 1.1 mrg printf ("Error in mpfr_get_str: 2^32-2^(-31) rounded up with"
86 1.1 mrg " 21 digits in base 3\n");
87 1.1 mrg exit (1);
88 1.1 mrg }
89 1.1 mrg mpfr_free_str (s);
90 1.1 mrg s = mpfr_get_str (NULL, &e, 3, 20, x, MPFR_RNDU);
91 1.1 mrg if (strcmp (s, "10200202220122111122") || (e != 21))
92 1.1 mrg {
93 1.1 mrg printf ("Error in mpfr_get_str: 2^32-2^(-31) rounded up with"
94 1.1 mrg " 20 digits in base 3\n");
95 1.1 mrg exit (1);
96 1.1 mrg }
97 1.1 mrg mpfr_free_str (s);
98 1.1 mrg
99 1.1 mrg /* check corner case ret!=0, j0!=0 in mpfr_get_str_aux */
100 1.1 mrg mpfr_set_prec (x, 100);
101 1.1 mrg mpfr_set_str_binary (x, "0.1001011111010001101110010101010101111001010111111101101101100110100011110110000101110110001011110000E-9");
102 1.1 mrg s = mpfr_get_str (NULL, &e, 3, 2, x, MPFR_RNDU);
103 1.1 mrg if (strcmp (s, "22") || (e != -6))
104 1.1 mrg {
105 1.1 mrg printf ("Error in mpfr_get_str: 100-bit number rounded up with"
106 1.1 mrg " 2 digits in base 3\n");
107 1.1 mrg exit (1);
108 1.1 mrg }
109 1.1 mrg mpfr_free_str (s);
110 1.1 mrg
111 1.1 mrg /* check corner case exact=0 in mpfr_get_str_aux */
112 1.1 mrg mpfr_set_prec (x, 100);
113 1.1 mrg mpfr_set_str_binary (x, "0.1001001111101101111000101000110111111010101100000110010001111111011001101011101100001100110000000000E8");
114 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDZ);
115 1.1 mrg if (strcmp (s, "14") || (e != 3))
116 1.1 mrg {
117 1.1 mrg printf ("Error in mpfr_get_str: 100-bit number rounded to zero with"
118 1.1 mrg " 2 digits in base 10\n");
119 1.1 mrg exit (1);
120 1.1 mrg }
121 1.1 mrg mpfr_free_str (s);
122 1.1 mrg
123 1.1 mrg for (p=4; p<=200; p++)
124 1.1 mrg {
125 1.1 mrg mpfr_set_prec (x, p);
126 1.1 mrg mpfr_set_str (x, "6.5", 10, MPFR_RNDN);
127 1.1 mrg
128 1.1 mrg s = mpfr_get_str (NULL, &e, 6, 2, x, MPFR_RNDN);
129 1.1 mrg if (strcmp (s, "10") || (e != 2))
130 1.1 mrg {
131 1.1 mrg printf ("Error in mpfr_get_str: 6.5 rounded to nearest with"
132 1.1 mrg " 2 digits in base 6\n");
133 1.1 mrg exit (1);
134 1.1 mrg }
135 1.1 mrg mpfr_free_str (s);
136 1.1 mrg
137 1.1 mrg mpfr_nexttoinf (x);
138 1.1 mrg s = mpfr_get_str (NULL, &e, 6, 2, x, MPFR_RNDN);
139 1.1 mrg if (strcmp (s, "11") || (e != 2))
140 1.1 mrg {
141 1.1 mrg printf ("Error in mpfr_get_str: 6.5+ rounded to nearest with"
142 1.1 mrg " 2 digits in base 6\ngot %se%d instead of 11e2\n",
143 1.1 mrg s, (int) e);
144 1.1 mrg exit (1);
145 1.1 mrg }
146 1.1 mrg mpfr_free_str (s);
147 1.1 mrg
148 1.1 mrg mpfr_set_str (x, "6.5", 10, MPFR_RNDN);
149 1.1 mrg mpfr_nexttozero (x);
150 1.1 mrg s = mpfr_get_str (NULL, &e, 6, 2, x, MPFR_RNDN);
151 1.1 mrg if (strcmp (s, "10") || (e != 2))
152 1.1 mrg {
153 1.1 mrg printf ("Error in mpfr_get_str: 6.5- rounded to nearest with"
154 1.1 mrg " 2 digits in base 6\n");
155 1.1 mrg exit (1);
156 1.1 mrg }
157 1.1 mrg mpfr_free_str (s);
158 1.1 mrg }
159 1.1 mrg
160 1.1 mrg mpfr_set_prec (x, 3);
161 1.1 mrg mpfr_set_ui (x, 7, MPFR_RNDN);
162 1.1 mrg s = mpfr_get_str (NULL, &e, 2, 2, x, MPFR_RNDU);
163 1.1 mrg if (strcmp (s, "10") || (e != 4))
164 1.1 mrg {
165 1.1 mrg printf ("Error in mpfr_get_str: 7 rounded up with 2 bits should"
166 1.1 mrg " give 0.10e3 instead of 0.%s*2^%d\n", s, (int) e);
167 1.1 mrg exit (1);
168 1.1 mrg }
169 1.1 mrg mpfr_free_str (s);
170 1.1 mrg
171 1.1 mrg /* problem found by Fabrice Rouillier */
172 1.1 mrg mpfr_set_prec (x, 63);
173 1.1 mrg mpfr_set_str (x, "5e14", 10, MPFR_RNDN);
174 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDU);
175 1.1 mrg mpfr_free_str (s);
176 1.1 mrg
177 1.1 mrg /* bug found by Johan Vervloet */
178 1.1 mrg mpfr_set_prec (x, 6);
179 1.1 mrg mpfr_set_str (x, "688.0", 10, MPFR_RNDN);
180 1.1 mrg s = mpfr_get_str (NULL, &e, 2, 4, x, MPFR_RNDU);
181 1.1 mrg if (strcmp (s, "1011") || (e != 10))
182 1.1 mrg {
183 1.1 mrg printf ("Error in mpfr_get_str: 688 printed up to 4 bits should"
184 1.1 mrg " give 1.011e9\ninstead of ");
185 1.1 mrg mpfr_out_str (stdout, 2, 4, x, MPFR_RNDU);
186 1.1 mrg puts ("");
187 1.1 mrg exit (1);
188 1.1 mrg }
189 1.1 mrg mpfr_free_str (s);
190 1.1 mrg
191 1.1 mrg mpfr_set_prec (x, 38);
192 1.1 mrg mpfr_set_str_binary (x, "1.0001110111110100011010100010010100110e-6");
193 1.1 mrg s = mpfr_get_str (NULL, &e, 8, 10, x, MPFR_RNDU);
194 1.1 mrg if (strcmp (s, "1073721522") || (e != -1))
195 1.1 mrg {
196 1.1 mrg printf ("Error in mpfr_get_str (3): s=%s e=%d\n", s, (int) e);
197 1.1 mrg exit (1);
198 1.1 mrg }
199 1.1 mrg mpfr_free_str (s);
200 1.1 mrg
201 1.1 mrg mpfr_set_prec (x, 53);
202 1.1 mrg mpfr_set_str_binary (x, "0.11010111011101100010000100010101110001000000010111001E454");
203 1.1 mrg s = mpfr_get_str (NULL, &e, 19, 12, x, MPFR_RNDU);
204 1.1 mrg if (strcmp (s, "b1cgfa4gha0h") || (e != 107))
205 1.1 mrg {
206 1.1 mrg printf ("Error in mpfr_get_str (4): s=%s e=%d\n", s, (int) e);
207 1.1 mrg exit (1);
208 1.1 mrg }
209 1.1 mrg mpfr_free_str (s);
210 1.1 mrg
211 1.1 mrg mpfr_set_prec (x, 145);
212 1.1 mrg mpfr_set_str_binary (x, "-0.1000110011000001011000010101101010110110101100101110100011111100011110011001001001010000100001000011000011000000010111011001000111101001110100110e6");
213 1.1 mrg s = mpfr_get_str (NULL, &e, 4, 53, x, MPFR_RNDU);
214 1.1 mrg if (strcmp (s, "-20303001120111222312230232203330132121021100201003003") || (e != 3))
215 1.1 mrg {
216 1.1 mrg printf ("Error in mpfr_get_str (5): s=%s e=%d\n", s, (int) e);
217 1.1 mrg exit (1);
218 1.1 mrg }
219 1.1 mrg mpfr_free_str (s);
220 1.1 mrg
221 1.1 mrg mpfr_set_prec (x, 45);
222 1.1 mrg mpfr_set_str_binary (x, "-0.00100111010110010001011001110111010001010010010");
223 1.1 mrg s = mpfr_get_str (NULL, &e, 32, 9, x, MPFR_RNDN);
224 1.1 mrg if (strcmp (s, "-4tchctq54") || (e != 0))
225 1.1 mrg {
226 1.1 mrg printf ("Error in mpfr_get_str (6): s=%s e=%d\n", s, (int) e);
227 1.1 mrg exit (1);
228 1.1 mrg }
229 1.1 mrg mpfr_free_str (s);
230 1.1 mrg
231 1.1 mrg /* worst case found by Vincent Lefe`vre */
232 1.1 mrg mpfr_set_prec (x, 53);
233 1.1 mrg mpfr_set_str_binary (x, "10011110111100000000001011011110101100010000011011111E164");
234 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN);
235 1.1 mrg if (strcmp (s, "13076622631878654") || (e != 66))
236 1.1 mrg {
237 1.1 mrg printf ("Error in mpfr_get_str (7): s=%s e=%d\n", s, (int) e);
238 1.1 mrg exit (1);
239 1.1 mrg }
240 1.1 mrg mpfr_free_str (s);
241 1.1 mrg mpfr_set_str_binary (x, "10000001001001001100011101010011011011111000011000100E93");
242 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU);
243 1.1 mrg if (strcmp (s, "46") || e != 44)
244 1.1 mrg {
245 1.1 mrg printf ("Error in mpfr_get_str (8): s=%s e=%d\n", s, (int) e);
246 1.1 mrg exit (1);
247 1.1 mrg }
248 1.1 mrg mpfr_free_str (s);
249 1.1 mrg mpfr_set_str_binary (x, "10010001111100000111001111010101001010000010111010101E55");
250 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN);
251 1.1 mrg if (strcmp (s, "19") || e != 33)
252 1.1 mrg {
253 1.1 mrg printf ("Error in mpfr_get_str (9): s=%s e=%d\n", s, (int) e);
254 1.1 mrg exit (1);
255 1.1 mrg }
256 1.1 mrg mpfr_free_str (s);
257 1.1 mrg mpfr_set_str_binary (x, "11011001010010111110010101101100111110111000010110110E44");
258 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 3, x, MPFR_RNDN);
259 1.1 mrg if (strcmp (s, "135") || e != 30)
260 1.1 mrg {
261 1.1 mrg printf ("Error in mpfr_get_str (10): s=%s e=%d\n", s, (int) e);
262 1.1 mrg exit (1);
263 1.1 mrg }
264 1.1 mrg mpfr_free_str (s);
265 1.1 mrg mpfr_set_str_binary (x, "11101111101000001011100001111000011111101111011001100E72");
266 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 4, x, MPFR_RNDN);
267 1.1 mrg if (strcmp (s, "3981") || e != 38)
268 1.1 mrg {
269 1.1 mrg printf ("Error in mpfr_get_str (11): s=%s e=%d\n", s, (int) e);
270 1.1 mrg exit (1);
271 1.1 mrg }
272 1.1 mrg mpfr_free_str (s);
273 1.1 mrg mpfr_set_str_binary (x, "10011001001100100010111100001101110101001001111110000E46");
274 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 5, x, MPFR_RNDN);
275 1.1 mrg if (strcmp (s, "37930") || e != 30)
276 1.1 mrg {
277 1.1 mrg printf ("Error in mpfr_get_str (12): s=%s e=%d\n", s, (int) e);
278 1.1 mrg exit (1);
279 1.1 mrg }
280 1.1 mrg mpfr_free_str (s);
281 1.1 mrg mpfr_set_str_binary (x, "10001100110111001011011110011011011101100011010001011E-72");
282 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 6, x, MPFR_RNDN);
283 1.1 mrg if (strcmp (s, "104950") || e != -5)
284 1.1 mrg {
285 1.1 mrg printf ("Error in mpfr_get_str (13): s=%s e=%d\n", s, (int) e);
286 1.1 mrg exit (1);
287 1.1 mrg }
288 1.1 mrg mpfr_free_str (s);
289 1.1 mrg
290 1.1 mrg mpfr_set_str_binary (x, "10100100001011001000011001101101000110100110000010111E89");
291 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDN);
292 1.1 mrg if (strcmp (s, "3575392") || e != 43)
293 1.1 mrg {
294 1.1 mrg printf ("Error in mpfr_get_str (14): s=%s e=%d\n", s, (int) e);
295 1.1 mrg exit (1);
296 1.1 mrg }
297 1.1 mrg mpfr_free_str (s);
298 1.1 mrg
299 1.1 mrg mpfr_set_str_binary (x, "11000011011110110010100110001010000001010011001011001E-73");
300 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDN);
301 1.1 mrg if (strcmp (s, "72822386") || e != -6)
302 1.1 mrg {
303 1.1 mrg printf ("Error in mpfr_get_str (15): s=%s e=%d\n", s, (int) e);
304 1.1 mrg exit (1);
305 1.1 mrg }
306 1.1 mrg mpfr_free_str (s);
307 1.1 mrg
308 1.1 mrg mpfr_set_str_binary (x, "10101010001101000111001100001000100011100010010001010E78");
309 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDN);
310 1.1 mrg if (strcmp (s, "180992873") || e != 40)
311 1.1 mrg {
312 1.1 mrg printf ("Error in mpfr_get_str (16): s=%s e=%d\n", s, (int) e);
313 1.1 mrg exit (1);
314 1.1 mrg }
315 1.1 mrg mpfr_free_str (s);
316 1.1 mrg
317 1.1 mrg mpfr_set_str_binary (x, "10110111001000100000001101111001100101101110011011101E91");
318 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 10, x, MPFR_RNDN);
319 1.1 mrg if (strcmp (s, "1595312255") || e != 44)
320 1.1 mrg {
321 1.1 mrg printf ("Error in mpfr_get_str (17): s=%s e=%d\n", s, (int) e);
322 1.1 mrg exit (1);
323 1.1 mrg }
324 1.1 mrg mpfr_free_str (s);
325 1.1 mrg mpfr_set_str_binary (x, "10011101010111101111000100111011101011110100110110101E93");
326 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 11, x, MPFR_RNDN);
327 1.1 mrg if (strcmp (s, "54835744350") || e != 44)
328 1.1 mrg {
329 1.1 mrg printf ("Error in mpfr_get_str (18): s=%s e=%d\n", s, (int) e);
330 1.1 mrg exit (1);
331 1.1 mrg }
332 1.1 mrg mpfr_free_str (s);
333 1.1 mrg mpfr_set_str_binary (x, "10011101010111101111000100111011101011110100110110101E92");
334 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 12, x, MPFR_RNDN);
335 1.1 mrg if (strcmp (s, "274178721752") || e != 44)
336 1.1 mrg {
337 1.1 mrg printf ("Error in mpfr_get_str (19): s=%s e=%d\n", s, (int) e);
338 1.1 mrg exit (1);
339 1.1 mrg }
340 1.1 mrg mpfr_free_str (s);
341 1.1 mrg mpfr_set_str_binary (x, "10011101010111101111000100111011101011110100110110101E91");
342 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 13, x, MPFR_RNDN);
343 1.1 mrg if (strcmp (s, "1370893608762") || e != 44)
344 1.1 mrg {
345 1.1 mrg printf ("Error in mpfr_get_str (20): s=%s e=%d\n", s, (int) e);
346 1.1 mrg exit (1);
347 1.1 mrg }
348 1.1 mrg mpfr_free_str (s);
349 1.1 mrg
350 1.1 mrg mpfr_set_str_binary (x, "10010011010110011100010010100101100011101000011111111E92");
351 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDN);
352 1.1 mrg if (strcmp (s, "25672105101864") || e != 44)
353 1.1 mrg {
354 1.1 mrg printf ("Error in mpfr_get_str (21): s=%s e=%d\n", s, (int) e);
355 1.1 mrg exit (1);
356 1.1 mrg }
357 1.1 mrg mpfr_free_str (s);
358 1.1 mrg
359 1.1 mrg mpfr_set_str_binary (x, "100110111110110001000101110100100101101000011111001E87");
360 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDN);
361 1.1 mrg if (strcmp (s, "212231308858721") || e != 42)
362 1.1 mrg {
363 1.1 mrg printf ("Error in mpfr_get_str (22): s=%s e=%d\n", s, (int) e);
364 1.1 mrg exit (1);
365 1.1 mrg }
366 1.1 mrg mpfr_free_str (s);
367 1.1 mrg mpfr_set_str_binary (x, "10111010110000111000101100101111001011011100101001111E-128");
368 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDN);
369 1.1 mrg if (strcmp (s, "193109287087290") || e != -22)
370 1.1 mrg {
371 1.1 mrg printf ("Error in mpfr_get_str (22b): s=%s e=%d\n", s, (int) e);
372 1.1 mrg exit (1);
373 1.1 mrg }
374 1.1 mrg mpfr_free_str (s);
375 1.1 mrg
376 1.1 mrg mpfr_set_str_binary (x, "10001101101011010001111110000111010111010000110101010E80");
377 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDN);
378 1.1 mrg if (strcmp (s, "6026241735727920") || e != 40)
379 1.1 mrg {
380 1.1 mrg printf ("Error in mpfr_get_str (23): s=%s e=%d\n", s, (int) e);
381 1.1 mrg exit (1);
382 1.1 mrg }
383 1.1 mrg mpfr_free_str (s);
384 1.1 mrg
385 1.1 mrg mpfr_set_str_binary (x, "100010001011101001110101000110011001001000110001001E-81");
386 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN);
387 1.1 mrg if (strcmp (s, "49741483709103481") || e != -9)
388 1.1 mrg {
389 1.1 mrg printf ("Error in mpfr_get_str (24): s=%s e=%d\n", s, (int) e);
390 1.1 mrg exit (1);
391 1.1 mrg }
392 1.1 mrg mpfr_free_str (s);
393 1.1 mrg mpfr_set_str_binary (x, "11000100001001001110111010011001111001001010110101111E-101");
394 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDN);
395 1.1 mrg if (strcmp (s, "2722049") || e != -14)
396 1.1 mrg {
397 1.1 mrg printf ("Error in mpfr_get_str (25): s=%s e=%d\n", s, (int) e);
398 1.1 mrg exit (1);
399 1.1 mrg }
400 1.1 mrg mpfr_free_str (s);
401 1.1 mrg mpfr_set_str_binary (x, "11111001010011100101000001111111110001001001110110001E-135");
402 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDN);
403 1.1 mrg if (strcmp (s, "20138772") || e != -24)
404 1.1 mrg {
405 1.1 mrg printf ("Error in mpfr_get_str (26): s=%s e=%d\n", s, (int) e);
406 1.1 mrg exit (1);
407 1.1 mrg }
408 1.1 mrg mpfr_free_str (s);
409 1.1 mrg
410 1.1 mrg mpfr_set_str_binary (x, "11111001010011100101000001111111110001001001110110001E-136");
411 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDN);
412 1.1 mrg if (strcmp (s, "100693858") || e != -24)
413 1.1 mrg {
414 1.1 mrg printf ("Error in mpfr_get_str (27): s=%s e=%d\n", s, (int) e);
415 1.1 mrg exit (1);
416 1.1 mrg }
417 1.1 mrg mpfr_free_str (s);
418 1.1 mrg mpfr_set_str_binary (x, "10001000001110010110001011111011111011011010000110001E-110");
419 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDN);
420 1.1 mrg if (strcmp (s, "36923634350619") || e != -17)
421 1.1 mrg {
422 1.1 mrg printf ("Error in mpfr_get_str (28): s=%s e=%d\n", s, (int) e);
423 1.1 mrg exit (1);
424 1.1 mrg }
425 1.1 mrg mpfr_free_str (s);
426 1.1 mrg mpfr_set_str_binary (x, "11001100010111000111100010000110011101110001000101111E-87");
427 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDN);
428 1.1 mrg if (strcmp (s, "4646636036100804") || e != -10)
429 1.1 mrg {
430 1.1 mrg printf ("Error in mpfr_get_str (29): s=%s e=%d\n", s, (int) e);
431 1.1 mrg exit (1);
432 1.1 mrg }
433 1.1 mrg mpfr_free_str (s);
434 1.1 mrg mpfr_set_str_binary (x, "10011111001111110100001001010111111011010101111111000E-99");
435 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN);
436 1.1 mrg if (strcmp (s, "88399901882446712") || e != -14)
437 1.1 mrg {
438 1.1 mrg printf ("Error in mpfr_get_str (30): s=%s e=%d\n", s, (int) e);
439 1.1 mrg exit (1);
440 1.1 mrg }
441 1.1 mrg mpfr_free_str (s);
442 1.1 mrg
443 1.1 mrg /* 8116315218207718*2^(-293) ~ 0.5100000000000000000015*10^(-72) */
444 1.1 mrg mpfr_set_str_binary (x, "11100110101011011111011100101011101110110001111100110E-293");
445 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU);
446 1.1 mrg if (strcmp (s, "52") || e != -72)
447 1.1 mrg {
448 1.1 mrg printf ("Error in mpfr_get_str (31u): s=%s e=%d\n", s, (int) e);
449 1.1 mrg exit (1);
450 1.1 mrg }
451 1.1 mrg mpfr_free_str (s);
452 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDD);
453 1.1 mrg if (strcmp (s, "51") || e != -72)
454 1.1 mrg {
455 1.1 mrg printf ("Error in mpfr_get_str (31d): s=%s e=%d\n", s, (int) e);
456 1.1 mrg exit (1);
457 1.1 mrg }
458 1.1 mrg mpfr_free_str (s);
459 1.1 mrg
460 1.1 mrg /* 6712731423444934*2^536 ~ .151000000000000000000067*10^178 */
461 1.1 mrg mpfr_set_str_binary (x, "10111110110010011000110010011111101111000111111000110E536");
462 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 3, x, MPFR_RNDU);
463 1.1 mrg if (strcmp (s, "152") || e != 178)
464 1.1 mrg {
465 1.1 mrg printf ("Error in mpfr_get_str (32u): s=%s e=%d\n", s, (int) e);
466 1.1 mrg exit (1);
467 1.1 mrg }
468 1.1 mrg mpfr_free_str (s);
469 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 3, x, MPFR_RNDD);
470 1.1 mrg if (strcmp (s, "151") || e != 178)
471 1.1 mrg {
472 1.1 mrg printf ("Error in mpfr_get_str (32d): s=%s e=%d\n", s, (int) e);
473 1.1 mrg exit (1);
474 1.1 mrg }
475 1.1 mrg mpfr_free_str (s);
476 1.1 mrg
477 1.1 mrg /* 3356365711722467*2^540 ~ .120800000000000000000054*10^179 */
478 1.1 mrg mpfr_set_str_binary (x, "1011111011001001100011001001111110111100011111100011E540");
479 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 4, x, MPFR_RNDU);
480 1.1 mrg if (strcmp (s, "1209") || e != 179)
481 1.1 mrg {
482 1.1 mrg printf ("Error in mpfr_get_str (33u): s=%s e=%d\n", s, (int) e);
483 1.1 mrg exit (1);
484 1.1 mrg }
485 1.1 mrg mpfr_free_str (s);
486 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 4, x, MPFR_RNDD);
487 1.1 mrg if (strcmp (s, "1208") || e != 179)
488 1.1 mrg {
489 1.1 mrg printf ("Error in mpfr_get_str (33d): s=%s e=%d\n", s, (int) e);
490 1.1 mrg exit (1);
491 1.1 mrg }
492 1.1 mrg mpfr_free_str (s);
493 1.1 mrg
494 1.1 mrg /* 6475049196144587*2^100 ~ .8208099999999999999999988*10^46 */
495 1.1 mrg mpfr_set_str_binary (x, "10111000000010000010111011111001111010100011111001011E100");
496 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 5, x, MPFR_RNDU);
497 1.1 mrg if (strcmp (s, "82081") || e != 46)
498 1.1 mrg {
499 1.1 mrg printf ("Error in mpfr_get_str (34u): s=%s e=%d\n", s, (int) e);
500 1.1 mrg exit (1);
501 1.1 mrg }
502 1.1 mrg mpfr_free_str (s);
503 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 5, x, MPFR_RNDD);
504 1.1 mrg if (strcmp (s, "82080") || e != 46)
505 1.1 mrg {
506 1.1 mrg printf ("Error in mpfr_get_str (34d): s=%s e=%d\n", s, (int) e);
507 1.1 mrg exit (1);
508 1.1 mrg }
509 1.1 mrg mpfr_free_str (s);
510 1.1 mrg
511 1.1 mrg /* 6722280709661868*2^364 ~ .25260100000000000000000012*10^126 */
512 1.1 mrg mpfr_set_str_binary (x, "10111111000011110000011110001110001111010010010101100E364");
513 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 6, x, MPFR_RNDU);
514 1.1 mrg if (strcmp (s, "252602") || e != 126)
515 1.1 mrg {
516 1.1 mrg printf ("Error in mpfr_get_str (35u): s=%s e=%d\n", s, (int) e);
517 1.1 mrg exit (1);
518 1.1 mrg }
519 1.1 mrg mpfr_free_str (s);
520 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 6, x, MPFR_RNDD);
521 1.1 mrg if (strcmp (s, "252601") || e != 126)
522 1.1 mrg {
523 1.1 mrg printf ("Error in mpfr_get_str (35d): s=%s e=%d\n", s, (int) e);
524 1.1 mrg exit (1);
525 1.1 mrg }
526 1.1 mrg mpfr_free_str (s);
527 1.1 mrg
528 1.1 mrg /* 5381065484265332*2^(-455) ~ .578389299999999999999999982*10^(-121) */
529 1.1 mrg mpfr_set_str_binary (x, "10011000111100000110011110000101100111110011101110100E-455");
530 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDU);
531 1.1 mrg if (strcmp (s, "5783893") || e != -121)
532 1.1 mrg {
533 1.1 mrg printf ("Error in mpfr_get_str (36u): s=%s e=%d\n", s, (int) e);
534 1.1 mrg exit (1);
535 1.1 mrg }
536 1.1 mrg mpfr_free_str (s);
537 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDD);
538 1.1 mrg if (strcmp (s, "5783892") || e != -121)
539 1.1 mrg {
540 1.1 mrg printf ("Error in mpfr_get_str (36d): s=%s e=%d\n", s, (int) e);
541 1.1 mrg exit (1);
542 1.1 mrg }
543 1.1 mrg mpfr_free_str (s);
544 1.1 mrg
545 1.1 mrg /* 8369123604277281*2^(-852) ~ .27869147000000000000000000056*10^(-240) */
546 1.1 mrg mpfr_set_str_binary (x, "11101101110111010110001101111100000111010100000100001E-852");
547 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDU);
548 1.1 mrg if (strcmp (s, "27869148") || e != -240)
549 1.1 mrg {
550 1.1 mrg printf ("Error in mpfr_get_str (37u): s=%s e=%d\n", s, (int) e);
551 1.1 mrg exit (1);
552 1.1 mrg }
553 1.1 mrg mpfr_free_str (s);
554 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDD);
555 1.1 mrg if (strcmp (s, "27869147") || e != -240)
556 1.1 mrg {
557 1.1 mrg printf ("Error in mpfr_get_str (37d): s=%s e=%d\n", s, (int) e);
558 1.1 mrg exit (1);
559 1.1 mrg }
560 1.1 mrg mpfr_free_str (s);
561 1.1 mrg
562 1.1 mrg /* 7976538478610756*2^377 ~ .245540326999999999999999999982*10^130 */
563 1.1 mrg mpfr_set_str_binary (x, "11100010101101001111010010110100011100000100101000100E377");
564 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDU);
565 1.1 mrg if (strcmp (s, "245540327") || e != 130)
566 1.1 mrg {
567 1.1 mrg printf ("Error in mpfr_get_str (38u): s=%s e=%d\n", s, (int) e);
568 1.1 mrg exit (1);
569 1.1 mrg }
570 1.1 mrg mpfr_free_str (s);
571 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDD);
572 1.1 mrg if (strcmp (s, "245540326") || e != 130)
573 1.1 mrg {
574 1.1 mrg printf ("Error in mpfr_get_str (38d): s=%s e=%d\n", s, (int) e);
575 1.1 mrg exit (1);
576 1.1 mrg }
577 1.1 mrg mpfr_free_str (s);
578 1.1 mrg
579 1.1 mrg /* 8942832835564782*2^(-382) ~ .9078555839000000000000000000038*10^(-99) */
580 1.1 mrg mpfr_set_str_binary (x, "11111110001010111010110000110011100110001010011101110E-382");
581 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 10, x, MPFR_RNDU);
582 1.1 mrg if (strcmp (s, "9078555840") || e != -99)
583 1.1 mrg {
584 1.1 mrg printf ("Error in mpfr_get_str (39u): s=%s e=%d\n", s, (int) e);
585 1.1 mrg exit (1);
586 1.1 mrg }
587 1.1 mrg mpfr_free_str (s);
588 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 10, x, MPFR_RNDD);
589 1.1 mrg if (strcmp (s, "9078555839") || e != -99)
590 1.1 mrg {
591 1.1 mrg printf ("Error in mpfr_get_str (39d): s=%s e=%d\n", s, (int) e);
592 1.1 mrg exit (1);
593 1.1 mrg }
594 1.1 mrg mpfr_free_str (s);
595 1.1 mrg
596 1.1 mrg /* 4471416417782391*2^(-380) ~ .18157111678000000000000000000077*10^(-98) */
597 1.1 mrg mpfr_set_str_binary (x, "1111111000101011101011000011001110011000101001110111E-380");
598 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 11, x, MPFR_RNDU);
599 1.1 mrg if (strcmp (s, "18157111679") || e != -98)
600 1.1 mrg {
601 1.1 mrg printf ("Error in mpfr_get_str (40u): s=%s e=%d\n", s, (int) e);
602 1.1 mrg exit (1);
603 1.1 mrg }
604 1.1 mrg mpfr_free_str (s);
605 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 11, x, MPFR_RNDD);
606 1.1 mrg if (strcmp (s, "18157111678") || e != -98)
607 1.1 mrg {
608 1.1 mrg printf ("Error in mpfr_get_str (40d): s=%s e=%d\n", s, (int) e);
609 1.1 mrg exit (1);
610 1.1 mrg }
611 1.1 mrg mpfr_free_str (s);
612 1.1 mrg
613 1.1 mrg /* 7225450889282194*2^711 ~ .778380362292999999999999999999971*10^230 */
614 1.1 mrg mpfr_set_str_binary (x, "11001101010111000001001100001100110010000001010010010E711");
615 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 12, x, MPFR_RNDU);
616 1.1 mrg if (strcmp (s, "778380362293") || e != 230)
617 1.1 mrg {
618 1.1 mrg printf ("Error in mpfr_get_str (41u): s=%s e=%d\n", s, (int) e);
619 1.1 mrg exit (1);
620 1.1 mrg }
621 1.1 mrg mpfr_free_str (s);
622 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 12, x, MPFR_RNDD);
623 1.1 mrg if (strcmp (s, "778380362292") || e != 230)
624 1.1 mrg {
625 1.1 mrg printf ("Error in mpfr_get_str (41d): s=%s e=%d\n", s, (int) e);
626 1.1 mrg exit (1);
627 1.1 mrg }
628 1.1 mrg mpfr_free_str (s);
629 1.1 mrg
630 1.1 mrg /* 3612725444641097*2^713 ~ .1556760724585999999999999999999942*10^231 */
631 1.1 mrg mpfr_set_str_binary (x, "1100110101011100000100110000110011001000000101001001E713");
632 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 13, x, MPFR_RNDU);
633 1.1 mrg if (strcmp (s, "1556760724586") || e != 231)
634 1.1 mrg {
635 1.1 mrg printf ("Error in mpfr_get_str (42u): s=%s e=%d\n", s, (int) e);
636 1.1 mrg exit (1);
637 1.1 mrg }
638 1.1 mrg mpfr_free_str (s);
639 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 13, x, MPFR_RNDD);
640 1.1 mrg if (strcmp (s, "1556760724585") || e != 231)
641 1.1 mrg {
642 1.1 mrg printf ("Error in mpfr_get_str (42d): s=%s e=%d\n", s, (int) e);
643 1.1 mrg exit (1);
644 1.1 mrg }
645 1.1 mrg mpfr_free_str (s);
646 1.1 mrg
647 1.1 mrg /* 6965949469487146*2^(-248) ~ .15400733123779000000000000000000016*10^(-58) */
648 1.1 mrg mpfr_set_str_binary (x, "11000101111110111111001111111101001101111000000101010E-248");
649 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDU);
650 1.1 mrg if (strcmp (s, "15400733123780") || e != -58)
651 1.1 mrg {
652 1.1 mrg printf ("Error in mpfr_get_str (43u): s=%s e=%d\n", s, (int) e);
653 1.1 mrg exit (1);
654 1.1 mrg }
655 1.1 mrg mpfr_free_str (s);
656 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDD);
657 1.1 mrg if (strcmp (s, "15400733123779") || e != -58)
658 1.1 mrg {
659 1.1 mrg printf ("Error in mpfr_get_str (43d): s=%s e=%d\n", s, (int) e);
660 1.1 mrg exit (1);
661 1.1 mrg }
662 1.1 mrg mpfr_free_str (s);
663 1.1 mrg
664 1.1 mrg /* 3482974734743573*2^(-244) ~ .12320586499023200000000000000000013*10^(-57) */
665 1.1 mrg mpfr_set_str_binary (x, "1100010111111011111100111111110100110111100000010101E-244");
666 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDU);
667 1.1 mrg if (strcmp (s, "123205864990233") || e != -57)
668 1.1 mrg {
669 1.1 mrg printf ("Error in mpfr_get_str (44u): s=%s e=%d\n", s, (int) e);
670 1.1 mrg exit (1);
671 1.1 mrg }
672 1.1 mrg mpfr_free_str (s);
673 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDD);
674 1.1 mrg if (strcmp (s, "123205864990232") || e != -57)
675 1.1 mrg {
676 1.1 mrg printf ("Error in mpfr_get_str (44d): s=%s e=%d\n", s, (int) e);
677 1.1 mrg exit (1);
678 1.1 mrg }
679 1.1 mrg mpfr_free_str (s);
680 1.1 mrg
681 1.1 mrg /* 7542952370752766*2^(-919) ~ .170206189963739699999999999999999974*10^(-260) */
682 1.1 mrg mpfr_set_str_binary (x, "11010110011000100011001110100100111011100110011111110E-919");
683 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDU);
684 1.1 mrg if (strcmp (s, "1702061899637397") || e != -260)
685 1.1 mrg {
686 1.1 mrg printf ("Error in mpfr_get_str (45u): s=%s e=%d\n", s, (int) e);
687 1.1 mrg exit (1);
688 1.1 mrg }
689 1.1 mrg mpfr_free_str (s);
690 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDD);
691 1.1 mrg if (strcmp (s, "1702061899637396") || e != -260)
692 1.1 mrg {
693 1.1 mrg printf ("Error in mpfr_get_str (45d): s=%s e=%d\n", s, (int) e);
694 1.1 mrg exit (1);
695 1.1 mrg }
696 1.1 mrg mpfr_free_str (s);
697 1.1 mrg
698 1.1 mrg /* 5592117679628511*2^165 ~ .26153245263757307000000000000000000074*10^66 */
699 1.1 mrg mpfr_set_str_binary (x, "10011110111100000000001011011110101100010000011011111E165");
700 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDU);
701 1.1 mrg if (strcmp (s, "26153245263757308") || e != 66)
702 1.1 mrg {
703 1.1 mrg printf ("Error in mpfr_get_str (46u): s=%s e=%d\n", s, (int) e);
704 1.1 mrg exit (1);
705 1.1 mrg }
706 1.1 mrg mpfr_free_str (s);
707 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDD);
708 1.1 mrg if (strcmp (s, "26153245263757307") || e != 66)
709 1.1 mrg {
710 1.1 mrg printf ("Error in mpfr_get_str (46d): s=%s e=%d\n", s, (int) e);
711 1.1 mrg exit (1);
712 1.1 mrg }
713 1.1 mrg mpfr_free_str (s);
714 1.1 mrg
715 1.1 mrg mpfr_set_str_binary (x, "11010010110111100001011010000110010000100001011011101E1223");
716 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN);
717 1.1 mrg if (strcmp (s, "10716284017294180") || e != 385)
718 1.1 mrg {
719 1.1 mrg printf ("Error in mpfr_get_str (47n): s=%s e=%d\n", s, (int) e);
720 1.1 mrg exit (1);
721 1.1 mrg }
722 1.1 mrg mpfr_free_str (s);
723 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDU);
724 1.1 mrg if (strcmp (s, "107162840172941805") || e != 385)
725 1.1 mrg {
726 1.1 mrg printf ("Error in mpfr_get_str (47u): s=%s e=%d\n", s, (int) e);
727 1.1 mrg exit (1);
728 1.1 mrg }
729 1.1 mrg mpfr_free_str (s);
730 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDD);
731 1.1 mrg if (strcmp (s, "107162840172941804") || e != 385)
732 1.1 mrg {
733 1.1 mrg printf ("Error in mpfr_get_str (47d): s=%s e=%d\n", s, (int) e);
734 1.1 mrg exit (1);
735 1.1 mrg }
736 1.1 mrg mpfr_free_str (s);
737 1.1 mrg
738 1.1 mrg mpfr_set_str_binary (x, "11111101111011000001010100001101101000010010001111E122620");
739 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN);
740 1.1 mrg if (strcmp (s, "22183435284042374") || e != 36928)
741 1.1 mrg {
742 1.1 mrg printf ("Error in mpfr_get_str (48n): s=%s e=%ld\n", s, (long) e);
743 1.1 mrg exit (1);
744 1.1 mrg }
745 1.1 mrg mpfr_free_str (s);
746 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDU);
747 1.1 mrg if (strcmp (s, "221834352840423736") || e != 36928)
748 1.1 mrg {
749 1.1 mrg printf ("Error in mpfr_get_str (48u): s=%s e=%ld\n", s, (long) e);
750 1.1 mrg exit (1);
751 1.1 mrg }
752 1.1 mrg mpfr_free_str (s);
753 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDD);
754 1.1 mrg if (strcmp (s, "221834352840423735") || e != 36928)
755 1.1 mrg {
756 1.1 mrg printf ("Error in mpfr_get_str (48d): s=%s e=%ld\n", s, (long) e);
757 1.1 mrg exit (1);
758 1.1 mrg }
759 1.1 mrg mpfr_free_str (s);
760 1.1 mrg
761 1.1 mrg mpfr_set_prec (x, 45);
762 1.1 mrg mpfr_set_str_binary (x, "1E45");
763 1.1 mrg s = mpfr_get_str (NULL, &e, 32, 9, x, MPFR_RNDN);
764 1.1 mrg mpfr_free_str (s);
765 1.1 mrg
766 1.1 mrg mpfr_set_prec (x, 7);
767 1.1 mrg mpfr_set_str_binary (x, "0.1010101E10");
768 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU);
769 1.1 mrg mpfr_free_str (s);
770 1.1 mrg
771 1.1 mrg /* checks rounding of negative numbers */
772 1.1 mrg mpfr_set_prec (x, 7);
773 1.1 mrg mpfr_set_str (x, "-11.5", 10, MPFR_RNDN);
774 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDD);
775 1.1 mrg if (strcmp (s, "-12"))
776 1.1 mrg {
777 1.1 mrg printf ("Error in mpfr_get_str for x=-11.5 and rnd=MPFR_RNDD\n"
778 1.1 mrg "got %s instead of -12\n", s);
779 1.1 mrg exit (1);
780 1.1 mrg }
781 1.1 mrg mpfr_free_str (s);
782 1.1 mrg
783 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU);
784 1.1 mrg if (strcmp (s, "-11"))
785 1.1 mrg {
786 1.1 mrg printf ("Error in mpfr_get_str for x=-11.5 and rnd=MPFR_RNDU\n");
787 1.1 mrg exit (1);
788 1.1 mrg }
789 1.1 mrg mpfr_free_str (s);
790 1.1 mrg
791 1.1 mrg /* bug found by Jean-Pierre Merlet, produced error in mpfr_get_str */
792 1.1 mrg mpfr_set_prec (x, 128);
793 1.1 mrg mpfr_set_str_binary (x, "0.10111001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011010E3");
794 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 0, x, MPFR_RNDU);
795 1.1 mrg mpfr_free_str (s);
796 1.1 mrg
797 1.1 mrg mpfr_set_prec (x, 381);
798 1.1 mrg mpfr_set_str_binary (x, "0.111111111111111111111111111111111111111111111111111111111111111111101110110000100110011101101101001010111000101111000100100011110101010110101110100000010100001000110100000100011111001000010010000010001010111001011110000001110010111101100001111000101101100000010110000101100100000101010110010110001010100111001111100011100101100000100100111001100010010011110011011010110000001000010");
799 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 0, x, MPFR_RNDD);
800 1.1 mrg if (e != 0)
801 1.1 mrg {
802 1.1 mrg printf ("Error in mpfr_get_str for x=0.999999..., exponent is %d"
803 1.1 mrg " instead of 0\n", (int) e);
804 1.1 mrg exit (1);
805 1.1 mrg }
806 1.1 mrg mpfr_free_str (s);
807 1.1 mrg
808 1.1 mrg mpfr_set_prec (x, 5);
809 1.1 mrg mpfr_set_str_binary (x, "1101.1"); /* 13.5, or (16)_7 + 1/2 */
810 1.1 mrg s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN);
811 1.1 mrg /* we are in the tie case: both surrounding numbers are (16)_7 and
812 1.1 mrg (20)_7: since (16)_7 = 13 is odd and (20)_7 = 14 is even,
813 1.1 mrg we should have s = "20" and e = 2 */
814 1.1 mrg if (e != 2 || strcmp (s, "20"))
815 1.1 mrg {
816 1.1 mrg printf ("Error in mpfr_get_str for x=13.5, base 7\n");
817 1.1.1.2 mrg printf ("Expected s=20, e=2, got s=%s, e=%ld\n", s, (long) e);
818 1.1 mrg exit (1);
819 1.1 mrg }
820 1.1 mrg mpfr_free_str (s);
821 1.1 mrg /* try the same example, with input just below or above 13.5 */
822 1.1 mrg mpfr_set_prec (x, 1000);
823 1.1 mrg mpfr_set_str_binary (x, "1101.1");
824 1.1 mrg mpfr_nextabove (x);
825 1.1 mrg s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN);
826 1.1 mrg if (e != 2 || strcmp (s, "20"))
827 1.1 mrg {
828 1.1 mrg printf ("Error in mpfr_get_str for x=13.5+tiny, base 7\n");
829 1.1.1.2 mrg printf ("Expected s=20, e=2, got s=%s, e=%ld\n", s, (long) e);
830 1.1 mrg exit (1);
831 1.1 mrg }
832 1.1 mrg mpfr_free_str (s);
833 1.1 mrg mpfr_set_str_binary (x, "1101.1");
834 1.1 mrg mpfr_nextbelow (x);
835 1.1 mrg s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN);
836 1.1 mrg if (e != 2 || strcmp (s, "16"))
837 1.1 mrg {
838 1.1 mrg printf ("Error in mpfr_get_str for x=13.5-tiny, base 7\n");
839 1.1.1.2 mrg printf ("Expected s=16, e=2, got s=%s, e=%ld\n", s, (long) e);
840 1.1 mrg exit (1);
841 1.1 mrg }
842 1.1 mrg mpfr_free_str (s);
843 1.1 mrg
844 1.1 mrg mpfr_set_prec (x, 7);
845 1.1 mrg mpfr_set_str_binary (x, "110000.1"); /* 48.5, or (66)_7 + 1/2 */
846 1.1 mrg s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN);
847 1.1 mrg /* we are in the tie case: both surrounding numbers are (66)_7 and
848 1.1 mrg (100)_7: since (66)_7 = 48 is even and (100)_7 is odd,
849 1.1 mrg we should hase s = "66" and e = 2 */
850 1.1 mrg if (e != 2 || strcmp (s, "66"))
851 1.1 mrg {
852 1.1 mrg printf ("Error in mpfr_get_str for x=48.5, base 7\n");
853 1.1.1.2 mrg printf ("Expected s=66, e=2, got s=%s, e=%ld\n", s, (long) e);
854 1.1 mrg exit (1);
855 1.1 mrg }
856 1.1 mrg mpfr_free_str (s);
857 1.1 mrg /* try the same example, with input just below or above 48.5 */
858 1.1 mrg mpfr_set_prec (x, 1000);
859 1.1 mrg mpfr_set_str_binary (x, "110000.1");
860 1.1 mrg mpfr_nextabove (x);
861 1.1 mrg s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN);
862 1.1 mrg if (e != 3 || strcmp (s, "10"))
863 1.1 mrg {
864 1.1 mrg printf ("Error in mpfr_get_str for x=48.5+tiny, base 7\n");
865 1.1.1.2 mrg printf ("Expected s=10, e=3, got s=%s, e=%ld\n", s, (long) e);
866 1.1 mrg exit (1);
867 1.1 mrg }
868 1.1 mrg mpfr_free_str (s);
869 1.1 mrg mpfr_set_str_binary (x, "110000.1");
870 1.1 mrg mpfr_nextbelow (x);
871 1.1 mrg s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN);
872 1.1 mrg if (e != 2 || strcmp (s, "66"))
873 1.1 mrg {
874 1.1 mrg printf ("Error in mpfr_get_str for x=48.5-tiny, base 7\n");
875 1.1.1.2 mrg printf ("Expected s=66, e=2, got s=%s, e=%ld\n", s, (long) e);
876 1.1 mrg exit (1);
877 1.1 mrg }
878 1.1 mrg mpfr_free_str (s);
879 1.1 mrg
880 1.1 mrg mpfr_clear (x);
881 1.1 mrg }
882 1.1 mrg
883 1.1 mrg /* bugs found by Alain Delplanque */
884 1.1 mrg static void
885 1.1 mrg check_large (void)
886 1.1 mrg {
887 1.1 mrg mpfr_t x;
888 1.1 mrg char *s, s1[7];
889 1.1 mrg const char xm[] = { '1', '1', '9', '1', '3', '2', '9', '3', '7', '3',
890 1.1 mrg '5', '8', '4', '4', '5', '4', '9', '0', '2', '9',
891 1.1 mrg '6', '3', '4', '4', '6', '9', '9', '1', '9', '5',
892 1.1 mrg '5', '7', '2', '0', '1', '7', '5', '2', '8', '6',
893 1.1 mrg '1', '2', '5', '2', '5', '2', '7', '4', '0', '2',
894 1.1 mrg '7', '9', '1', '1', '7', '4', '5', '6', '7', '5',
895 1.1 mrg '9', '3', '1', '4', '2', '5', '5', '6', '6', '6',
896 1.1 mrg '1', '6', '4', '3', '8', '1', '2', '8', '7', '6',
897 1.1 mrg '2', '9', '2', '0', '8', '8', '9', '4', '3', '9',
898 1.1 mrg '6', '2', '8', '4', '1', '1', '8', '1', '0', '6',
899 1.1 mrg '2', '3', '7', '6', '3', '8', '1', '5', '1', '7',
900 1.1 mrg '3', '4', '6', '1', '2', '4', '0', '1', '3', '0',
901 1.1 mrg '8', '4', '1', '3', '9', '3', '2', '0', '1', '6',
902 1.1 mrg '3', '6', '7', '1', '5', '1', '7', '5', '0', '1',
903 1.1 mrg '9', '8', '4', '0', '8', '2', '7', '9', '1', '3',
904 1.1 mrg '2', '2', '8', '3', '4', '1', '6', '2', '3', '9',
905 1.1 mrg '6', '2', '0', '7', '3', '5', '5', '5', '3', '4',
906 1.1 mrg '2', '1', '7', '0', '9', '7', '6', '2', '1', '0',
907 1.1 mrg '3', '3', '5', '4', '7', '6', '0', '9', '7', '6',
908 1.1 mrg '9', '3', '5', '1', '7', '8', '6', '8', '8', '2',
909 1.1 mrg '8', '1', '4', '3', '7', '4', '3', '3', '2', '4',
910 1.1 mrg '1', '5', '4', '7', '8', '1', '1', '4', '2', '1',
911 1.1 mrg '2', '4', '2', '7', '6', '5', '9', '5', '4', '5',
912 1.1 mrg '2', '6', '7', '3', '0', '3', '4', '0', '6', '9',
913 1.1 mrg '1', '8', '9', '9', '9', '8', '0', '5', '7', '0',
914 1.1 mrg '9', '3', '8', '7', '6', '2', '4', '6', '1', '6',
915 1.1 mrg '7', '2', '0', '3', '5', '9', '3', '5', '8', '8',
916 1.1 mrg '9', '7', '7', '9', '2', '7', '0', '8', '1', '6',
917 1.1 mrg '8', '7', '4', '8', '5', '3', '0', '8', '4', '3',
918 1.1 mrg '5', '6', '5', '1', '6', '6', '0', '9', '7', '9',
919 1.1 mrg '8', '9', '2', '7', '2', '6', '8', '5', '9', '4',
920 1.1 mrg '5', '8', '1', '3', '7', '2', '9', '3', '8', '3',
921 1.1 mrg '7', '9', '1', '7', '9', '9', '7', '7', '2', '8',
922 1.1 mrg '4', '6', '5', '5', '7', '3', '3', '8', '3', '6',
923 1.1 mrg '6', '9', '7', '1', '4', '3', '3', '7', '1', '4',
924 1.1 mrg '9', '4', '1', '2', '4', '9', '5', '1', '4', '7',
925 1.1 mrg '2', '6', '4', '4', '8', '0', '6', '2', '6', '0',
926 1.1 mrg '6', '9', '8', '1', '1', '7', '9', '9', '3', '9',
927 1.1 mrg '3', '8', '4', '7', '3', '1', '9', '0', '2', '3',
928 1.1 mrg '5', '3', '5', '4', '2', '1', '1', '7', '6', '7',
929 1.1 mrg '4', '3', '2', '2', '0', '6', '5', '9', '9', '3',
930 1.1 mrg '2', '6', '7', '1', '2', '0', '0', '3', '7', '3',
931 1.1 mrg '8', '7', '4', '3', '3', '3', '3', '3', '2', '3',
932 1.1 mrg '8', '2', '8', '6', '3', '1', '5', '5', '2', '2',
933 1.1 mrg '5', '9', '3', '3', '7', '0', '6', '2', '8', '1',
934 1.1 mrg '0', '3', '6', '7', '6', '9', '6', '5', '9', '0',
935 1.1 mrg '6', '6', '6', '3', '6', '9', '9', '3', '8', '7',
936 1.1 mrg '6', '5', '4', '5', '3', '5', '9', '4', '0', '0',
937 1.1 mrg '7', '5', '8', '5', '4', '1', '4', '3', '1', '5',
938 1.1 mrg '7', '6', '6', '3', '4', '4', '5', '0', '8', '7',
939 1.1 mrg '5', '7', '5', '0', '1', '0', '1', '8', '4', '7',
940 1.1 mrg '3', '1', '9', '9', '2', '7', '1', '1', '1', '2',
941 1.1 mrg '3', '9', '9', '6', '5', '9', '2', '3', '2', '8',
942 1.1 mrg '1', '5', '5', '1', '2', '6', '4', '9', '6', '6',
943 1.1 mrg '4', '5', '1', '1', '6', '0', '0', '3', '2', '8',
944 1.1 mrg '4', '8', '7', '1', '4', '9', '6', '8', '1', '6',
945 1.1 mrg '5', '9', '8', '3', '4', '2', '9', '7', '0', '1',
946 1.1 mrg '9', '2', '6', '6', '9', '1', '3', '5', '9', '3',
947 1.1 mrg '2', '9', '6', '2', '3', '0', '6', '0', '1', '1',
948 1.1 mrg '6', '5', '1', '7', '9', '0', '7', '5', '8', '6',
949 1.1 mrg '8', '4', '2', '1', '0', '3', '8', '6', '6', '4',
950 1.1 mrg '4', '9', '9', '7', '5', '8', '1', '7', '5', '7',
951 1.1 mrg '9', '6', '6', '8', '8', '5', '8', '6', '7', '4',
952 1.1 mrg '0', '7', '2', '0', '2', '9', '9', '4', '4', '1',
953 1.1 mrg '9', '5', '8', '6', '5', '0', '6', '7', '4', '2',
954 1.1 mrg '7', '3', '2', '3', '2', '7', '0', '2', '1', '3',
955 1.1 mrg '0', '5', '9', '0', '3', '9', '1', '4', '5', '3',
956 1.1 mrg '7', '2', '7', '0', '8', '5', '5', '4', '6', '1',
957 1.1 mrg '1', '0', '0', '9', '2', '0', '4', '1', '6', '6',
958 1.1 mrg '4', '6', '9', '1', '3', '2', '8', '5', '0', '3',
959 1.1 mrg '3', '8', '9', '8', '7', '8', '5', '9', '5', '5',
960 1.1 mrg '9', '1', '9', '3', '6', '5', '4', '1', '7', '4',
961 1.1 mrg '0', '2', '4', '7', '2', '9', '7', '1', '2', '4',
962 1.1 mrg '5', '8', '1', '4', '4', '6', '1', '8', '5', '8',
963 1.1 mrg '7', '6', '9', '7', '2', '1', '2', '0', '8', '9',
964 1.1 mrg '5', '9', '5', '5', '3', '8', '1', '2', '5', '4',
965 1.1 mrg '3', '0', '7', '6', '5', '1', '7', '8', '2', '0',
966 1.1 mrg '0', '7', '6', '7', '4', '8', '1', '0', '6', '3',
967 1.1 mrg '2', '3', '0', '5', '2', '5', '0', '1', '1', '4',
968 1.1 mrg '3', '8', '4', '5', '2', '3', '9', '5', '0', '9',
969 1.1 mrg '8', '2', '6', '4', '7', '4', '8', '0', '1', '1',
970 1.1 mrg '7', '1', '5', '4', '9', '0', '9', '2', '2', '3',
971 1.1 mrg '8', '1', '6', '9', '0', '4', '6', '4', '5', '4',
972 1.1 mrg '6', '3', '8', '7', '3', '6', '1', '7', '2', '3',
973 1.1 mrg '4', '5', '5', '2', '0', '2', '5', '8', '1', '4',
974 1.1 mrg '9', '3', '0', '7', '4', '1', '6', '8', '7', '8',
975 1.1 mrg '2', '6', '2', '5', '1', '0', '7', '4', '7', '3',
976 1.1 mrg '6', '6', '4', '5', '6', '6', '6', '6', '8', '5',
977 1.1 mrg '1', '3', '5', '7', '1', '6', '2', '0', '9', '2',
978 1.1 mrg '3', '2', '6', '0', '7', '9', '8', '1', '6', '2',
979 1.1 mrg '0', '3', '8', '8', '0', '2', '8', '7', '7', '5',
980 1.1 mrg '9', '3', '1', '0', '6', '7', '5', '7', '3', '1',
981 1.1 mrg '2', '7', '7', '2', '0', '0', '4', '1', '2', '8',
982 1.1 mrg '2', '0', '8', '4', '0', '5', '0', '5', '0', '1',
983 1.1 mrg '9', '3', '3', '6', '3', '6', '9', '6', '2', '8',
984 1.1 mrg '2', '9', '7', '5', '3', '8', '8', '9', '1', '1',
985 1.1 mrg '4', '5', '7', '7', '5', '6', '0', '2', '7', '9',
986 1.1 mrg '7', '2', '1', '7', '4', '3', '0', '3', '6', '7',
987 1.1 mrg '3', '7', '2', '2', '7', '5', '6', '2', '3', '1',
988 1.1 mrg '2', '1', '3', '1', '4', '2', '6', '9', '2', '3',
989 1.1 mrg '\0' };
990 1.1 mrg mpfr_exp_t e;
991 1.1 mrg
992 1.1 mrg mpfr_init2 (x, 3322);
993 1.1 mrg mpfr_set_str (x, xm, 10, MPFR_RNDN);
994 1.1 mrg mpfr_div_2exp (x, x, 4343, MPFR_RNDN);
995 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN);
996 1.1 mrg if (s[999] != '1') /* s must be 5.04383...689071e-309 */
997 1.1 mrg {
998 1.1 mrg printf ("Error in check_large: expected '689071', got '%s'\n",
999 1.1 mrg s + 994);
1000 1.1 mrg exit (1);
1001 1.1 mrg }
1002 1.1 mrg mpfr_free_str (s);
1003 1.1 mrg
1004 1.1 mrg mpfr_mul_2exp (x, x, 4343, MPFR_RNDN);
1005 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN);
1006 1.1 mrg if (strcmp (s, "12") || (e != 1000))
1007 1.1 mrg {
1008 1.1 mrg printf ("Error in check_large: expected 0.12e1000\n");
1009 1.1 mrg printf ("got %se%d\n", s, (int) e);
1010 1.1 mrg exit (1);
1011 1.1 mrg }
1012 1.1 mrg mpfr_free_str (s);
1013 1.1 mrg
1014 1.1 mrg mpfr_set_nan (x);
1015 1.1.1.4 mrg mpfr_clear_flags ();
1016 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN);
1017 1.1 mrg if (strcmp (s, "@NaN@"))
1018 1.1 mrg {
1019 1.1.1.4 mrg printf ("Error for NaN (incorrect string)\n");
1020 1.1.1.4 mrg exit (1);
1021 1.1.1.4 mrg }
1022 1.1.1.4 mrg if (__gmpfr_flags != MPFR_FLAGS_NAN)
1023 1.1.1.4 mrg {
1024 1.1.1.4 mrg printf ("Error for NaN (incorrect flags)\n");
1025 1.1 mrg exit (1);
1026 1.1 mrg }
1027 1.1 mrg mpfr_free_str (s);
1028 1.1 mrg
1029 1.1 mrg mpfr_get_str (s1, &e, 10, 1000, x, MPFR_RNDN);
1030 1.1 mrg
1031 1.1 mrg mpfr_set_inf (x, 1);
1032 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN);
1033 1.1 mrg if (strcmp (s, "@Inf@"))
1034 1.1 mrg {
1035 1.1 mrg printf ("Error for Inf\n");
1036 1.1 mrg exit (1);
1037 1.1 mrg }
1038 1.1 mrg mpfr_free_str (s);
1039 1.1 mrg
1040 1.1 mrg mpfr_get_str (s1, &e, 10, 1000, x, MPFR_RNDN);
1041 1.1 mrg
1042 1.1 mrg mpfr_set_inf (x, -1);
1043 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN);
1044 1.1 mrg if (strcmp (s, "-@Inf@"))
1045 1.1 mrg {
1046 1.1 mrg printf ("Error for -Inf\n");
1047 1.1 mrg exit (1);
1048 1.1 mrg }
1049 1.1 mrg mpfr_free_str (s);
1050 1.1 mrg
1051 1.1 mrg mpfr_get_str (s1, &e, 10, 1000, x, MPFR_RNDN);
1052 1.1 mrg
1053 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN);
1054 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN);
1055 1.1 mrg if (e != 0 || strcmp (s, "00"))
1056 1.1 mrg {
1057 1.1 mrg printf ("Error for 0.0\n");
1058 1.1 mrg exit (1);
1059 1.1 mrg }
1060 1.1 mrg mpfr_free_str (s);
1061 1.1 mrg mpfr_get_str (s1, &e, 10, 2, x, MPFR_RNDN);
1062 1.1 mrg
1063 1.1 mrg mpfr_neg (x, x, MPFR_RNDN); /* -0.0 */
1064 1.1 mrg s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN);
1065 1.1 mrg if (e != 0 || strcmp (s, "-00"))
1066 1.1 mrg {
1067 1.1 mrg printf ("Error for -0.0\ngot %se%d\n", s, (int) e);
1068 1.1 mrg exit (1);
1069 1.1 mrg }
1070 1.1 mrg mpfr_free_str (s);
1071 1.1 mrg mpfr_get_str (s1, &e, 10, 2, x, MPFR_RNDN);
1072 1.1 mrg
1073 1.1 mrg mpfr_clear (x);
1074 1.1 mrg }
1075 1.1 mrg
1076 1.1 mrg #define MAX_DIGITS 100
1077 1.1 mrg
1078 1.1 mrg static void
1079 1.1 mrg check_special (int b, mpfr_prec_t p)
1080 1.1 mrg {
1081 1.1 mrg mpfr_t x;
1082 1.1 mrg int i, j;
1083 1.1 mrg char s[MAX_DIGITS + 2], s2[MAX_DIGITS + 2], c;
1084 1.1 mrg mpfr_exp_t e;
1085 1.1 mrg int r;
1086 1.1 mrg size_t m;
1087 1.1 mrg
1088 1.1.1.4 mrg mpfr_init2 (x, p);
1089 1.1.1.4 mrg
1090 1.1 mrg /* check for invalid base */
1091 1.1 mrg if (mpfr_get_str (s, &e, 1, 10, x, MPFR_RNDN) != NULL)
1092 1.1 mrg {
1093 1.1 mrg printf ("Error: mpfr_get_str should not accept base = 1\n");
1094 1.1 mrg exit (1);
1095 1.1 mrg }
1096 1.1 mrg if (mpfr_get_str (s, &e, 63, 10, x, MPFR_RNDN) != NULL)
1097 1.1 mrg {
1098 1.1 mrg printf ("Error: mpfr_get_str should not accept base = 63\n");
1099 1.1 mrg exit (1);
1100 1.1 mrg }
1101 1.1 mrg
1102 1.1 mrg s2[0] = '1';
1103 1.1.1.4 mrg for (i = 1; i < MAX_DIGITS + 2; i++)
1104 1.1 mrg s2[i] = '0';
1105 1.1 mrg
1106 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
1107 1.1.1.4 mrg for (i = 1; i < MAX_DIGITS && mpfr_mul_ui (x, x, b, MPFR_RNDN) == 0; i++)
1108 1.1 mrg {
1109 1.1 mrg /* x = b^i (exact) */
1110 1.1 mrg for (r = 0; r < MPFR_RND_MAX; r++)
1111 1.1.1.4 mrg for (m = i < 3 ? 2 : i-1 ; (int) m <= i+1 ; m++)
1112 1.1 mrg {
1113 1.1 mrg mpfr_get_str (s, &e, b, m, x, (mpfr_rnd_t) r);
1114 1.1 mrg /* s should be 1 followed by (m-1) zeros, and e should be i+1 */
1115 1.1 mrg if ((e != i+1) || strncmp (s, s2, m) != 0)
1116 1.1 mrg {
1117 1.1 mrg printf ("Error in mpfr_get_str for %d^%d\n", b, i);
1118 1.1 mrg exit (1);
1119 1.1 mrg }
1120 1.1 mrg }
1121 1.1 mrg if (mpfr_sub_ui (x, x, 1, MPFR_RNDN) != 0)
1122 1.1 mrg break;
1123 1.1 mrg /* now x = b^i-1 (exact) */
1124 1.1 mrg for (r = 0; r < MPFR_RND_MAX; r++)
1125 1.1 mrg if (i >= 2)
1126 1.1 mrg {
1127 1.1 mrg mpfr_get_str (s, &e, b, i, x, (mpfr_rnd_t) r);
1128 1.1 mrg /* should be i times (b-1) */
1129 1.1 mrg c = (b <= 10) ? '0' + b - 1 : 'a' + (b - 11);
1130 1.1 mrg for (j=0; (j < i) && (s[j] == c); j++);
1131 1.1 mrg if ((j < i) || (e != i))
1132 1.1 mrg {
1133 1.1 mrg printf ("Error in mpfr_get_str for %d^%d-1\n", b, i);
1134 1.1 mrg printf ("got 0.%s*2^%d\n", s, (int) e);
1135 1.1 mrg exit (1);
1136 1.1 mrg }
1137 1.1 mrg }
1138 1.1 mrg if (i >= 3)
1139 1.1 mrg {
1140 1.1 mrg mpfr_get_str (s, &e, b, i - 1, x, MPFR_RNDU);
1141 1.1 mrg /* should be b^i */
1142 1.1 mrg if ((e != i+1) || strncmp (s, s2, i - 1) != 0)
1143 1.1 mrg {
1144 1.1 mrg printf ("Error in mpfr_get_str for %d^%d-1\n", b, i);
1145 1.1 mrg printf ("got 0.%s*2^%d\n", s, (int) e);
1146 1.1 mrg exit (1);
1147 1.1 mrg }
1148 1.1 mrg }
1149 1.1 mrg
1150 1.1 mrg mpfr_add_ui (x, x, 1, MPFR_RNDN);
1151 1.1 mrg }
1152 1.1 mrg mpfr_clear (x);
1153 1.1 mrg }
1154 1.1 mrg
1155 1.1 mrg static void
1156 1.1 mrg check_bug_base2k (void)
1157 1.1 mrg {
1158 1.1 mrg /*
1159 1.1 mrg * -2.63b22b55697e800000000000@130
1160 1.1 mrg * +-0.1001100011101100100010101101010101011010010111111010000000000000000000000000+00000000000000000000001E522
1161 1.1 mrg */
1162 1.1 mrg mpfr_t xx, yy, zz;
1163 1.1 mrg char *s;
1164 1.1 mrg mpfr_exp_t e;
1165 1.1 mrg
1166 1.1 mrg mpfr_init2 (xx, 107);
1167 1.1 mrg mpfr_init2 (yy, 79);
1168 1.1 mrg mpfr_init2 (zz, 99);
1169 1.1 mrg
1170 1.1 mrg mpfr_set_str (xx, "-1.90e8c3e525d7c0000000000000@-18", 16, MPFR_RNDN);
1171 1.1 mrg mpfr_set_str (yy, "-2.63b22b55697e8000000@130", 16, MPFR_RNDN);
1172 1.1 mrg mpfr_add (zz, xx, yy, MPFR_RNDD);
1173 1.1 mrg s = mpfr_get_str (NULL, &e, 16, 0, zz, MPFR_RNDN);
1174 1.1 mrg if (strcmp (s, "-263b22b55697e8000000000008"))
1175 1.1 mrg {
1176 1.1 mrg printf ("Error for get_str base 16\n"
1177 1.1 mrg "Got %s expected -263b22b55697e8000000000008\n", s);
1178 1.1 mrg exit (1);
1179 1.1 mrg }
1180 1.1 mrg mpfr_free_str (s);
1181 1.1 mrg mpfr_clears (xx, yy, zz, (mpfr_ptr) 0);
1182 1.1 mrg }
1183 1.1 mrg
1184 1.1 mrg static void
1185 1.1 mrg check_reduced_exprange (void)
1186 1.1 mrg {
1187 1.1 mrg mpfr_t x;
1188 1.1 mrg char *s;
1189 1.1 mrg mpfr_exp_t emax, e;
1190 1.1 mrg
1191 1.1 mrg emax = mpfr_get_emax ();
1192 1.1 mrg mpfr_init2 (x, 8);
1193 1.1 mrg mpfr_set_str (x, "0.11111111E0", 2, MPFR_RNDN);
1194 1.1 mrg set_emax (0);
1195 1.1 mrg s = mpfr_get_str (NULL, &e, 16, 0, x, MPFR_RNDN);
1196 1.1 mrg set_emax (emax);
1197 1.1 mrg if (strcmp (s, "ff0"))
1198 1.1 mrg {
1199 1.1 mrg printf ("Error for mpfr_get_str on 0.11111111E0 in base 16:\n"
1200 1.1 mrg "Got \"%s\" instead of \"ff0\".\n", s);
1201 1.1 mrg exit (1);
1202 1.1 mrg }
1203 1.1 mrg mpfr_free_str (s);
1204 1.1 mrg mpfr_clear (x);
1205 1.1 mrg }
1206 1.1 mrg
1207 1.1.1.4 mrg static void
1208 1.1.1.4 mrg check_inex (void)
1209 1.1.1.4 mrg {
1210 1.1.1.4 mrg mpfr_t x;
1211 1.1.1.4 mrg int i;
1212 1.1.1.4 mrg
1213 1.1.1.4 mrg mpfr_init2 (x, 8);
1214 1.1.1.4 mrg mpfr_set_str (x, "0.11111111E-17", 2, MPFR_RNDN);
1215 1.1.1.4 mrg for (i = 1; i <= 25; i++)
1216 1.1.1.4 mrg {
1217 1.1.1.4 mrg char *s[2];
1218 1.1.1.4 mrg int r, inex = 0;
1219 1.1.1.4 mrg
1220 1.1.1.4 mrg RND_LOOP (r)
1221 1.1.1.4 mrg {
1222 1.1.1.4 mrg mpfr_exp_t e;
1223 1.1.1.4 mrg mpfr_flags_t flags;
1224 1.1.1.4 mrg
1225 1.1.1.4 mrg mpfr_clear_flags ();
1226 1.1.1.4 mrg s[r != 0] = mpfr_get_str (NULL, &e, 10, i, x, (mpfr_rnd_t) r);
1227 1.1.1.4 mrg MPFR_ASSERTN (e == -5);
1228 1.1.1.4 mrg flags = __gmpfr_flags;
1229 1.1.1.4 mrg if ((i >= 20) ^ (! mpfr_inexflag_p ()))
1230 1.1.1.4 mrg {
1231 1.1.1.4 mrg printf ("Error in check_inex on i=%d and %s\n",
1232 1.1.1.4 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) r));
1233 1.1.1.4 mrg printf ("Got %s\n", s[r != 0]);
1234 1.1.1.4 mrg printf ("Flags:");
1235 1.1.1.4 mrg flags_out (flags);
1236 1.1.1.4 mrg exit (1);
1237 1.1.1.4 mrg }
1238 1.1.1.4 mrg if (r != 0)
1239 1.1.1.4 mrg {
1240 1.1.1.4 mrg inex |= strcmp (s[0], s[1]) != 0;
1241 1.1.1.4 mrg mpfr_free_str (s[1]);
1242 1.1.1.4 mrg }
1243 1.1.1.4 mrg }
1244 1.1.1.4 mrg
1245 1.1.1.4 mrg MPFR_ASSERTN ((i >= 20) ^ inex);
1246 1.1.1.4 mrg mpfr_free_str (s[0]);
1247 1.1.1.4 mrg }
1248 1.1.1.4 mrg mpfr_clear (x);
1249 1.1.1.4 mrg }
1250 1.1.1.4 mrg
1251 1.1.1.4 mrg static void
1252 1.1.1.4 mrg check_negative_base (void)
1253 1.1.1.4 mrg {
1254 1.1.1.4 mrg mpfr_t f;
1255 1.1.1.4 mrg mpfr_exp_t e;
1256 1.1.1.4 mrg char *s, s2[16] = "7B000000000000", s3[16] = "74000000000000";
1257 1.1.1.4 mrg
1258 1.1.1.4 mrg mpfr_init_set_ui (f, 123, MPFR_RNDN);
1259 1.1.1.4 mrg s = mpfr_get_str (0, &e, -16, 0, f, MPFR_RNDN);
1260 1.1.1.4 mrg MPFR_ASSERTN(strcmp (s, s2) == 0);
1261 1.1.1.4 mrg mpfr_free_str (s);
1262 1.1.1.4 mrg s = mpfr_get_str (0, &e, -17, 0, f, MPFR_RNDN);
1263 1.1.1.4 mrg MPFR_ASSERTN(strcmp (s, s3) == 0);
1264 1.1.1.4 mrg mpfr_free_str (s);
1265 1.1.1.4 mrg mpfr_clear (f);
1266 1.1.1.4 mrg }
1267 1.1.1.4 mrg
1268 1.1 mrg #define ITER 1000
1269 1.1 mrg
1270 1.1 mrg int
1271 1.1 mrg main (int argc, char *argv[])
1272 1.1 mrg {
1273 1.1 mrg int b;
1274 1.1 mrg mpfr_t x;
1275 1.1 mrg mpfr_rnd_t r;
1276 1.1 mrg char s[MAX_DIGITS + 2];
1277 1.1 mrg mpfr_exp_t e, f;
1278 1.1 mrg size_t m;
1279 1.1 mrg mpfr_prec_t p;
1280 1.1 mrg int i;
1281 1.1 mrg
1282 1.1 mrg tests_start_mpfr ();
1283 1.1 mrg
1284 1.1 mrg check_small ();
1285 1.1 mrg
1286 1.1 mrg check_special (2, 2);
1287 1.1 mrg for (i = 0; i < ITER; i++)
1288 1.1 mrg {
1289 1.1 mrg p = 2 + (randlimb () % (MAX_DIGITS - 1));
1290 1.1 mrg b = 2 + (randlimb () % 35);
1291 1.1 mrg check_special (b, p);
1292 1.1 mrg }
1293 1.1 mrg
1294 1.1 mrg mpfr_init2 (x, MAX_DIGITS);
1295 1.1 mrg for (i = 0; i < ITER; i++)
1296 1.1 mrg {
1297 1.1 mrg m = 2 + (randlimb () % (MAX_DIGITS - 1));
1298 1.1 mrg mpfr_urandomb (x, RANDS);
1299 1.1 mrg e = (mpfr_exp_t) (randlimb () % 21) - 10;
1300 1.1.1.4 mrg if (!MPFR_IS_ZERO(x))
1301 1.1.1.4 mrg mpfr_set_exp (x, (e == -10) ? mpfr_get_emin () :
1302 1.1.1.4 mrg ((e == 10) ? mpfr_get_emax () : e));
1303 1.1 mrg b = 2 + (randlimb () % 35);
1304 1.1 mrg r = RND_RAND ();
1305 1.1 mrg mpfr_get_str (s, &f, b, m, x, r);
1306 1.1 mrg }
1307 1.1 mrg mpfr_clear (x);
1308 1.1 mrg
1309 1.1 mrg check_large ();
1310 1.1 mrg check3 ("4.059650008e-83", MPFR_RNDN, "40597");
1311 1.1 mrg check3 ("-6.606499965302424244461355e233", MPFR_RNDN, "-66065");
1312 1.1 mrg check3 ("-7.4", MPFR_RNDN, "-74000");
1313 1.1 mrg check3 ("0.997", MPFR_RNDN, "99700");
1314 1.1 mrg check3 ("-4.53063926135729747564e-308", MPFR_RNDN, "-45306");
1315 1.1 mrg check3 ("2.14478198760196000000e+16", MPFR_RNDN, "21448");
1316 1.1 mrg check3 ("7.02293374921793516813e-84", MPFR_RNDN, "70229");
1317 1.1 mrg
1318 1.1 mrg check3 ("-6.7274500420134077e-87", MPFR_RNDN, "-67275");
1319 1.1 mrg check3 ("-6.7274500420134077e-87", MPFR_RNDZ, "-67274");
1320 1.1 mrg check3 ("-6.7274500420134077e-87", MPFR_RNDU, "-67274");
1321 1.1 mrg check3 ("-6.7274500420134077e-87", MPFR_RNDD, "-67275");
1322 1.1 mrg check3 ("-6.7274500420134077e-87", MPFR_RNDA, "-67275");
1323 1.1 mrg
1324 1.1 mrg check3 ("6.7274500420134077e-87", MPFR_RNDN, "67275");
1325 1.1 mrg check3 ("6.7274500420134077e-87", MPFR_RNDZ, "67274");
1326 1.1 mrg check3 ("6.7274500420134077e-87", MPFR_RNDU, "67275");
1327 1.1 mrg check3 ("6.7274500420134077e-87", MPFR_RNDD, "67274");
1328 1.1 mrg check3 ("6.7274500420134077e-87", MPFR_RNDA, "67275");
1329 1.1 mrg
1330 1.1 mrg check_bug_base2k ();
1331 1.1 mrg check_reduced_exprange ();
1332 1.1.1.4 mrg check_inex ();
1333 1.1.1.4 mrg check_negative_base ();
1334 1.1 mrg
1335 1.1 mrg tests_end_mpfr ();
1336 1.1 mrg return 0;
1337 1.1 mrg }
1338