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