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