xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tget_str.c (revision a4ddc2c8fb9af816efe3b1c375a5530aef0e89e9)
1 /* Test file for mpfr_get_str.
2 
3 Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 Contributed by the Arenaire and Cacao projects, INRIA.
5 
6 This file is part of the GNU MPFR Library.
7 
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12 
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 License for more details.
17 
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20 http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 
23 #include <stdlib.h>
24 
25 #include "mpfr-test.h"
26 
27 static void
28 check3 (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 
47 static void
48 check_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 */
886 static void
887 check_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 
1074 static void
1075 check_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 
1150 static void
1151 check_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 
1179 static void
1180 check_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 
1204 int
1205 main (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