Imported Upstream version 3.1.1
[platform/upstream/mpfr.git] / tests / tstrtofr.c
1 /* Test file for mpfr_set_str.
2
3 Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramel 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 check_special (void)
29 {
30   mpfr_t x, y;
31   int res;
32   char *s;
33
34   mpfr_init (x);
35   mpfr_init (y);
36
37   /* Check dummy case */
38   res = mpfr_strtofr (x, "1234567.89E1", NULL, 10, MPFR_RNDN);
39   mpfr_set_str (y, "1234567.89E1", 10, MPFR_RNDN);
40   if (mpfr_cmp (x, y))
41     {
42       printf ("Results differ between strtofr and set_str.\n"
43               " set_str gives: ");
44       mpfr_dump (y);
45       printf (" strtofr gives: ");
46       mpfr_dump (x);
47       exit (1);
48     }
49
50   /* Check NAN  */
51   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
52   res = mpfr_strtofr (x, "NaN", &s, 10, MPFR_RNDN);
53   if (res != 0 || !mpfr_nan_p (x) || *s != 0)
54     {
55       printf ("Error for setting NAN (1)\n");
56       exit (1);
57     }
58   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
59   res = mpfr_strtofr (x, "+NaN", &s, 10, MPFR_RNDN);
60   if (res != 0 || !mpfr_nan_p (x) || *s != 0)
61     {
62       printf ("Error for setting +NAN (1)\n");
63       exit (1);
64     }
65   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
66   res = mpfr_strtofr (x, " -NaN", &s, 10, MPFR_RNDN);
67   if (res != 0 || !mpfr_nan_p (x) || *s != 0)
68     {
69       printf ("Error for setting -NAN (1)\n");
70       exit (1);
71     }
72   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
73   res = mpfr_strtofr (x, "@nAn@xx", &s, 16, MPFR_RNDN);
74   if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "xx") )
75     {
76       printf ("Error for setting NAN (2)\n");
77       exit (1);
78     }
79   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
80   res = mpfr_strtofr (x, "NAN(abcdEDF__1256)Hello", &s, 10, MPFR_RNDN);
81   if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "Hello") )
82     {
83       printf ("Error for setting NAN (3)\n");
84       exit (1);
85     }
86   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
87   res = mpfr_strtofr (x, "NAN(abcdEDF)__1256)Hello", &s, 10, MPFR_RNDN);
88   if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "__1256)Hello") )
89     {
90       printf ("Error for setting NAN (4)\n");
91       exit (1);
92     }
93   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
94   res = mpfr_strtofr (x, "NAN(abc%dEDF)__1256)Hello", &s, 10, MPFR_RNDN);
95   if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "(abc%dEDF)__1256)Hello") )
96     {
97       printf ("Error for setting NAN (5)\n");
98       exit (1);
99     }
100   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
101   res = mpfr_strtofr (x, "NAN((abc))", &s, 10, MPFR_RNDN);
102   if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "((abc))") )
103     {
104       printf ("Error for setting NAN (6)\n");
105       exit (1);
106     }
107   mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */
108   res = mpfr_strtofr (x, "NAN()foo", &s, 10, MPFR_RNDN);
109   if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "foo") )
110     {
111       printf ("Error for setting NAN (7)\n");
112       exit (1);
113     }
114
115   /* Check INF */
116   res = mpfr_strtofr (x, "INFINITY", &s, 8, MPFR_RNDN);
117   if (res != 0 || !mpfr_inf_p (x) || *s != 0)
118     {
119       printf ("Error for setting INFINITY (1)\n s=%s\n x=", s);
120       mpfr_dump (x);
121       exit (1);
122     }
123   res = mpfr_strtofr (x, "INFANITY", &s, 8, MPFR_RNDN);
124   if (res != 0 || !mpfr_inf_p (x) || strcmp(s, "ANITY"))
125     {
126       printf ("Error for setting INFINITY (2)\n s=%s\n x=", s);
127       mpfr_dump (x);
128       exit (1);
129     }
130   res = mpfr_strtofr (x, "@INF@*2", &s, 11, MPFR_RNDN);
131   if (res != 0 || !mpfr_inf_p (x) || strcmp(s, "*2"))
132     {
133       printf ("Error for setting INFINITY (3)\n s=%s\n x=", s);
134       mpfr_dump (x);
135       exit (1);
136     }
137
138   /* Check Zero */
139   res = mpfr_strtofr (x, " 00000", &s, 11, MPFR_RNDN);
140   if (res != 0 || !mpfr_zero_p (x) || s[0] != 0)
141     {
142       printf ("Error for setting ZERO (1)\n s=%s\n x=", s);
143       mpfr_dump (x);
144       exit (1);
145     }
146
147   /* Check base 62 */
148   res = mpfr_strtofr (x, "A", NULL, 62, MPFR_RNDN);
149   if (res != 0 || mpfr_cmp_ui (x, 10))
150     {
151       printf ("Error for setting 'A' in base 62\n x=");
152       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
153       putchar ('\n');
154       exit (1);
155     }
156   res = mpfr_strtofr (x, "a", NULL, 62, MPFR_RNDN);
157   if (res != 0 || mpfr_cmp_ui (x, 36))
158     {
159       printf ("Error for setting 'a' in base 62\n x=");
160       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
161       putchar ('\n');
162       exit (1);
163     }
164   res = mpfr_strtofr (x, "Z", NULL, 62, MPFR_RNDN);
165   if (res != 0 || mpfr_cmp_ui (x, 35))
166     {
167       printf ("Error for setting 'Z' in base 62\n x=");
168       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
169       putchar ('\n');
170       exit (1);
171     }
172   res = mpfr_strtofr (x, "z", NULL, 62, MPFR_RNDN);
173   if (res != 0 || mpfr_cmp_ui (x, 61))
174     {
175       printf ("Error for setting 'z' in base 62\n x=");
176       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
177       putchar ('\n');
178       exit (1);
179     }
180   res = mpfr_strtofr (x, "ZA", NULL, 62, MPFR_RNDN);
181   if (res != 0 || mpfr_cmp_ui (x, 2180))
182     {
183       printf ("Error for setting 'ZA' in base 62\n x=");
184       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
185       putchar ('\n');
186       exit (1);
187     }
188   res = mpfr_strtofr (x, "za", NULL, 62, MPFR_RNDN);
189   if (res != 0 || mpfr_cmp_ui (x, 3818))
190     {
191       printf ("Error for setting 'za' in base 62\n x=");
192       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
193       putchar ('\n');
194       exit (1);
195     }
196   res = mpfr_strtofr (x, "aZ", NULL, 62, MPFR_RNDN);
197   if (res != 0 || mpfr_cmp_ui (x, 2267))
198     {
199       printf ("Error for setting 'aZ' in base 62\n x=");
200       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
201       putchar ('\n');
202       exit (1);
203     }
204   res = mpfr_strtofr (x, "Az", NULL, 62, MPFR_RNDN);
205   if (res != 0 || mpfr_cmp_ui (x, 681))
206     {
207       printf ("Error for setting 'Az' in base 62\n x=");
208       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
209       putchar ('\n');
210       exit (1);
211     }
212
213   /* Check base 60 */
214   res = mpfr_strtofr (x, "Aa", NULL, 60, MPFR_RNDN);
215   if (res != 0 || mpfr_cmp_ui (x, 636))
216     {
217       printf ("Error for setting 'Aa' in base 60\n x=");
218       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
219       putchar ('\n');
220       exit (1);
221     }
222   res = mpfr_strtofr (x, "Zz", &s, 60, MPFR_RNDN);
223   if (res != 0 || mpfr_cmp_ui (x, 35) || strcmp(s, "z") )
224     {
225       printf ("Error for setting 'Zz' in base 60\n x=");
226       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
227       putchar ('\n');
228       exit (1);
229     }
230
231   /* Check base 61 */
232   res = mpfr_strtofr (x, "z", &s, 61, MPFR_RNDN);
233   if (res != 0 || mpfr_cmp_ui (x, 0) || strcmp(s, "z") )
234     {
235       printf ("Error for setting 'z' in base 61\n x=");
236       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
237       putchar ('\n');
238       exit (1);
239     }
240
241   mpfr_clear (x);
242   mpfr_clear (y);
243 }
244
245 /* The following RefTable has been generated by this following code */
246 #if 0
247 #define MAX_NUM 100
248
249 int randomab (int a, int b)
250 {
251   return a + rand () % (b-a);
252 }
253
254 int
255 main (void)
256 {
257   int i, base;
258   mpfr_t x;
259   mpfr_prec_t p;
260   mpfr_exp_t e;
261
262   mpfr_init (x);
263   printf ("struct dymmy_test { \n"
264           " mpfr_prec_t prec; \n"
265           " int base; \n"
266           " const char *str; \n"
267           " const char *binstr; \n"
268           " } RefTable[] = { \n");
269   for (i = 0 ; i < MAX_NUM ; i++)
270     {
271       p = randomab(2, 180);
272       base = randomab (2, 30);
273       e = randomab (-1<<15, 1<<15);
274       mpfr_set_prec (x, p);
275       mpfr_urandomb (x, RANDS);
276       mpfr_mul_2si (x, x, e, MPFR_RNDN);
277       printf("{%lu, %d,\n\"", p, base);
278       mpfr_out_str (stdout, base, p, x, MPFR_RNDN);
279       printf ("\",\n\"");
280       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
281       printf ("\"}%c\n", i == MAX_NUM-1 ? ' ' : ',' );
282     }
283   printf("};\n");
284   mpfr_clear (x);
285 }
286 #endif
287
288 static struct dymmy_test {
289  mpfr_prec_t prec;
290  int base;
291  const char *str;
292  const char *binstr;
293  } RefTable[] = {
294 {39, 20,
295 "1.1c9jeh9jg12d8iiggf26b8ce2cig24agai51d9@1445",
296 "1.00111010111010001110110001101011101011e6245"},
297 {119, 3,
298 "1.2210112120221020220021000020101121120011021202212101222000011110211211122222001001221110102220122021121021101010120101e-5655",
299 "1.1111101110011110001101011100011000011100001011011100010011010010001000000111001010000001110111010100011000110010000000e-8963"},
300 {166, 18,
301 "3.ecg67g31434b74d8hhbe2dbbb46g9546cae72cae0cfghfh00ed7gebe9ca63b47h08bgbdeb880a76dea12he31e1ccd67e9dh22a911b46h517b745169b2g43egg2e4eah820cdb2132d6a4f9c63505dd4a0dafbc@-5946",
302 "1.011110010000110011111011111100110110010110000010100001101111111000010000011111110101100000010110011001100000010001100101000001101000010010001011001011000110100011001e-24793"},
303 {139, 4,
304 "1.020302230021023320300300101212330121100031233000032101123133120221012000000000000000000000000000000000000000000000000000000000000000000000e11221",
305 "1.001000110010101100001001001011111000110000110000010001100110111100011001010000001101101111000000001110010001011011011111011000101001000110e22442"},
306 {126, 13,
307 "4.a3cb351c6c548a0475218519514c6c54366681447019ac70a387862c39c86546ab27608c9c2863328860aa2464288070a76c0773882728c5213a335289259@2897",
308 "1.01011010000001110001100001101111100111011010010111000011000101111011000100001010010100110111101001001001000000011100010000000e10722"},
309 {6, 26,
310 "1.j79f6@-1593",
311 "1.00000e-7487"},
312 {26, 18,
313 "3.5e99682hh310aa89hb2fb4h88@-5704",
314 "1.0110010100010101000101100e-23784"},
315 {12, 21,
316 "4.j7f3e2ccdfa@-3524",
317 "1.10110101011e-15477"},
318 {38, 28,
319 "o.agr0m367b9bmm76rplg7b53qlj7f02g717cab@6452",
320 "1.1001010011101100110100111000111010001e31021"},
321 {75, 17,
322 "4.00abd9gc99902e1cae2caa7647gcc029g01370e96d3f8e9g02f814d3ge5faa29d40b9db470@5487",
323 "1.11100000110101010111101001110001001010111111010100000100001010100111011101e22429"},
324 {91, 16,
325 "1.0a812a627160014a3bda1f00000000000000000000000000000000000000000000000000000000000000000000@7897",
326 "1.000010101000000100101010011000100111000101100000000000010100101000111011110110100001111100e31588"},
327 {154, 19,
328 "1.989279dda02a8ic15e936ahig3c695f6059a3i01b7d1ge6a418bf84gd87e36061hb2bi62ciagcgb9226fafea41d2ig1e2f0a10ea3i40d6dahf598bdbh372bdf5901gh276866804ah53b6338bi@5285",
329 "1.110101101101101111110010001011110001100000010100011101101001000100110100000011110111000011011101011110010100110101011011111100101101001100000101101000010e22450"},
330 {53, 2,
331 "1.0100010111100111001010000100011011111011011100110111e-20319",
332 "1.0100010111100111001010000100011011111011011100110111e-20319"},
333 {76, 3,
334 "2.101212121100222100012112101120011222102000021110201110000202111122221100001e1511",
335 "1.000110101010111000011001011111110000001001101001011011111110111111010000111e2396"},
336 {31, 9,
337 "1.171774371505084376877631528681e3258",
338 "1.110101101011111011111000110011e10327"},
339 {175, 8,
340 "4.506242760242070533035566017365410474451421355546570157251400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3483",
341 "1.001010001100101000101111100000101000100001110001010110110000111011011101100000011110111101011000010001001111001001010011000100010111011011011001101011110000011011110101010011e10451"},
342 {103, 24,
343 "8.0hmlm3g183cj358fn4bimn5bie1l89k95m647474mm8jg5kh1c011gi0m7de9j7b48c595g1bki4n32kll7b882eg7klgga0h0gf11@4510",
344 "1.001000110101001101011010101001111010110100010100110101010101110000001011001101110110010111000101010111e20681"},
345 {12, 9,
346 "3.00221080453e2479",
347 "1.11000111010e7859"},
348 {86, 11,
349 "6.873680186953174a274754118026423965415553a088387303452447389287133a0956111602a5a085446@5035",
350 "1.0000000000110100010110000111010001010100101011000100101010010011101010000110011110001e17421"},
351 {68, 10,
352 "6.1617378719016284192718392572980535262609909598793237475124371481233e481",
353 "1.0110001011000101110010111101100101111110001100001011110011001101111e1600"},
354 {11, 15,
355 "5.ab10c18d45@907",
356 "1.0000101111e3546"},
357 {77, 26,
358 "6.e6kl84g6h30o3nfnj7fjjff4n1ee6e5iop76gabj23e7hgan9o6724domc7bp4hdll95g817519f@5114",
359 "1.1011000101111111111110011011101100000100101000001001100000001011010001001000e24040"},
360 {28, 27,
361 "d.odiqp9kgh84o8d2aoqg4c21hemi@3566",
362 "1.101001111001111111110011110e16959"},
363 {45, 14,
364 "7.cddc6295a576980adbc8c16111d6301bad3146a1143c@-6227",
365 "1.10000000110011000000101100110001011100010111e-23706"},
366 {54, 19,
367 "1.b6e67i2124hfga2g819g1d6527g2b603eg3cd8hhca9gecig8geg1@4248",
368 "1.11010100100010101101110110010100000010111010010101110e18045"},
369 {49, 20,
370 "1.jj68bj6idadg44figi10d2ji99g6ddi6c6ich96a5h86i529@-3149",
371 "1.001011111101100100001010001000011100000000101110e-13609"},
372 {171, 16,
373 "6.22cf0e566d8ff11359d70bd9200065cfd72600b12e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@5602",
374 "1.10001000101100111100001110010101100110110110001111111100010001001101011001110101110000101111011001001000000000000001100101110011111101011100100110000000001011000100101110e22410"},
375 {144, 14,
376 "1.425d9709b4c125651ab88bb1a0370c14270d067a9a74a612dad48d5c025531c175c1b905201d0d9773aa686c8249db9c0b841b10821791c02baa2525a4aa7571850439c2cc965cd@-3351",
377 "1.11100111110001001101010111010000101010011000111001101011000001011110101110011011100100111001101101111011001001101011001101001011011101101111011e-12759"},
378 {166, 6,
379 "3.324252232403440543134003140400220120040245215204322153511143504542403430152410543444455151104314552352030352125540101550151410414122051500201022252511512332523431554e8340",
380 "1.010101111101111101001001110010111110010000001111010101100110011011010110011001001100001111010101100000010111011111101110110111101110010001110001111000001010001111000e21560"},
381 {141, 24,
382 "2.i3c88lkm2958l9ncb9f85kk35namjli84clek5j6jjkli82kb9m4e4i2g39me63db2094cif80gcba8ie6l15ia0d667kn9i1f77bdak599e1ach0j05cdn8kf6c6kfd82j2k6hj2c4d@4281",
383 "1.10011100001010110111001000000000101011100010101011001010001101110100110111011000111101000001111101100000110100100010101011001100100011001011e19629"},
384 {84, 6,
385 "2.41022133512503223022555143021524424430350133500020112434301542311050052304150111243e982",
386 "1.11010001111111001010011100011000011100100111111010001111010010101001001000011100001e2539"},
387 {56, 9,
388 "1.5305472255016741401411184703518332515066156086511016413e2936",
389 "1.0111110010001101000000110101110000110101001011001100111e9307"},
390 {18, 8,
391 "3.63542400000000000e-599",
392 "1.11100111011000101e-1796"},
393 {111, 13,
394 "8.b693ac7a24679b98708a0057a6202c867bc146740ab1971b380756a24c99804b63436419239ba0510030b819933771a636c57c5747b883@-6160",
395 "1.01011011111110100101110010100100000110000011011101001110010110000011101110111111010111000011011101101001100100e-22792"},
396 {162, 16,
397 "4.f2abe958a313566adbf3169e55cdcff3785dbd5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@382",
398 "1.00111100101010101111101001010110001010001100010011010101100110101011011011111100110001011010011110010101011100110111001111111100110111100001011101101111010101110e1530"},
399 {117, 23,
400 "2.4b6kk3ag3if217ih1hggkk69bmcecfil1cd38dijh35j8e6ckhd335a4gj7l05bedk19473i8449b1ajc3jd3ka95eceheh72lh2jh17jamlm1142gll@-3628",
401 "1.10010010001010001110011000010000011111011101111100110101100100101111101110010011101001111010100010001111110100101111e-16411"},
402 {179, 2,
403 "1.1101101011111010101000110101010101101110001011011010101001110111011010011110001000000110101100010010001110010110011000000110001011111001011110100011101000110001001000110100100110e14203",
404 "1.1101101011111010101000110101010101101110001011011010101001110111011010011110001000000110101100010010001110010110011000000110001011111001011110100011101000110001001000110100100110e14203"},
405 {18, 27,
406 "4.ll743n2f654gh3154@-6039",
407 "1.01101001111010011e-28713"},
408 {178, 15,
409 "1.e5443105cad2d014b700c42aa3de854c4b95322420695d07db3564ec07473da83bde123b74c794139265a838ebeca745ad3dc97d7c356271ca935ea8e83306562c2a8edc6e886c1b6b2d3e17038379c33826526770985c068@821",
410 "1.011100001000101100111111111111000100110111110011101010001111011001111101111001010011100100100101100011101001000000101001010100011111001011001010011101101001000111111010101101011e3208"},
411 {161, 22,
412 "2.46ikji624bg042877h8g2jdki4ece6ede62841j7li843a4becdkkii86c54192jkefehikkb3kcb26ij1b3k9agfbb07dih88d6ej0ee0d63i8hedc7f0g0i9g7jf9gf6423j70h421bg5hf2bja9j0a432lb10@-5125",
413 "1.0111011000111110000010011100001100100110001011101001011110111010100000011100000010011101011100101100111100110000001101010101011110100011101111001011001111100000e-22854"},
414 {62, 19,
415 "7.bgd1g0886a6c3a9ee67cc7g3bgf718i98d90788idi5587358e660iffc0ic6@3257",
416 "1.0101100100001110000100010110100100000111110001111001011110100e13838"},
417 {127, 19,
418 "1.413bgf99eidba75ged25f7187080bce3h7ebdeghea4ig6c79g94di7b42a3e4cdi4ic6a53i71d2e4hdbe50ih0a0egf2fi469732131ig6g496bf7h8g3c86ie7h@-4465",
419 "1.001101111000011011100010010010010110111001001001110011110101111111000001110101111110001110010000110011111101000011000101111101e-18967"},
420 {17, 21,
421 "4.7d5b70gh4k0gj4fj@-116",
422 "1.1000100010000110e-508"},
423 {141, 13,
424 "2.2b4988c5cb57072a6a1a9c42224794a1cbc175a9bc673bb28aa045c3182b9396ca8bb8590969672b0239608a845a2c35c08908a58c2a83748c89241a6561422c7cc4866c8454@4358",
425 "1.10010110101000001000001001111001000100111110100010100110111011111011010010101000110101110000111100010000101101000110000000000001111110110011e16127"},
426 {39, 7,
427 "3.00350342452505221136410100232265245244e202",
428 "1.10011000111110011010100110101101010010e568"},
429 {119, 24,
430 "5.2aene587kc2d9a55mm8clhn4dn0a551de58b1fcli8e8hf1jlm7i0376dl5fhb2k8acka03077mnbn9d4dmi0641dce871c81g2b3ge76m3kngm4a9g5gh@-892",
431 "1.0111101010010100001001111110000000100101110010010111111100100101100001010010100110111000101100101010111000101111000010e-4088"},
432 {41, 14,
433 "5.c3dc5c49373d0c0075624931133022185bd08b16@-5294",
434 "1.0101011000010111111111000010100110011111e-20154"},
435 {41, 6,
436 "3.2411143454422033245255450304104450302500e2250",
437 "1.1110111101010101001001100000100011110111e5817"},
438 {17, 13,
439 "3.65789aa26aa273b1@-4490",
440 "1.1100011101010111e-16614"},
441 {10, 26,
442 "1.5p4hag1fl@6017",
443 "1.110010111e28282"},
444 {130, 11,
445 "2.606a72601843700427667823172635a47055021a0a68a99326875195a179483948407aa13726244552332114a1784aaa7239956521604460876871a65708458aa@-6285",
446 "1.110001001110111110110111000010101000110010011110010101100100001000101011010010000001000101000110111111110101000100000111100010100e-21742"},
447 {29, 20,
448 "j.4356d9b7i38i955jjj1j442501bj@163",
449 "1.1010101011110011100000100100e708"},
450 {140, 21,
451 "9.2f5k7aid6bj2b2g5bff29i73hk3a8d8g0i7ifa07hkb79g4hd3c7j6g4hjj2jbhai01gkje3h9g3gj3i34f0194kaed32iea9dcgcj8h7i1khdkf965c1ak97gf3h03fcab3ggi03fa@4864",
452 "1.0101011100011101000110101001010011111111010011000111111111100000011011100111010001100101100110001110001001100101001100110000011110100101101e21367"},
453 {133, 13,
454 "2.3721a9107307a71c75c07c83b70a25a9853619030b5bcb55101ca5c2060bca46c331b92b33aa957c3ac7c817335287c6917999c38c3806b6b5919623023ac52063bb@6602",
455 "1.011001101111100001100100110100010100010011100010111110110100100000000010011101001011000100000110011011101001010010011110111100010010e24431"},
456 {118, 2,
457 "1.001010111011011000100010001110111000001100101000101101010001110110000111101110111011011101111100110010000101001001001e18960",
458 "1.001010111011011000100010001110111000001100101000101101010001110110000111101110111011011101111100110010000101001001001e18960"},
459 {102, 23,
460 "l.26lhk42clcm9g940eihakhi32gb3331lld488cf1j4f73ge051bfl8gcmcg78gkjc2iibjf752eag0dee6dafa97k79jlh11j3270@-2160",
461 "1.01101011011000100101110111110001011000101101011001011111001101000110111010000010011111101110101100010e-9767"},
462 {156, 18,
463 "b.eb927dd4g48abee3cc2begehb9c3b8h83cae152db850ac2f3g816d6787825122c8h3aa3g8023h23000a8hg61065b3e367ac59ca373067730f96dd0d3b73b3c43fef91750b333gd497b8ce9228e7@5504",
464 "1.11000110111100011101100011001001110011101100011111010100101110010010010011111001100000011010011111111011001011111010001001011001110001100001101000000110000e22954"},
465 {158, 5,
466 "3.0112043214104344433122444210142004032004444213123303302023242414000243311324332203224340334422234000104132020124210141322013240010134130441413233111204013422e-10468",
467 "1.1001011000111111110100100101110011100001110100101001101110011001101001101011010010111010111111101010100011100010101100110111011101000110110100000111001100011e-24305"},
468 {7, 9,
469 "2.141540e-146",
470 "1.001111e-462"},
471 {111, 5,
472 "3.21233234110011204313222402442032333320324004133424222041314021020411320312421014434003440431230413141402230403e7641",
473 "1.10010000000101010000101010101011011010000100010010010000010110001111000111111111000110111001100101101110101101e17743"},
474 {76, 13,
475 "7.1c0861453a4ac156b6119ba7548251b5cb00b7c409c2bb8138214676468c9949676226013c1@4639",
476 "1.001000011000000011101101101010100010010001010111100110010101111110110010111e17169"},
477 {6, 25,
478 "c.aj660@-6978",
479 "1.11000e-32402"},
480 {156, 3,
481 "2.22101000022222000012110122210202211110020121210120112102122121111210000211020001020201202200011021211102012110220222110022001121011022011202000110120021012e-14744",
482 "1.11010001111000101111110000010011001101000100010010110011100100110001100111011101011111111100011111001100001111100101100000001000001100000000010010001011101e-23368"},
483 {7, 23,
484 "1.4hclk2@2148",
485 "1.110110e9716"},
486 {69, 11,
487 "2.77684920493191632416690544493465617a187218365952a6740034288687745a26@3263",
488 "1.01111000111000001111001110000110000110001111110011101100101111011100e11289"},
489 {146, 21,
490 "3.agg4d0dj636d526d4i8643ch5jee4ge2c3i46k121857dbedagd98cjifaf0fgc09ca739g2fkfbfh06i687kic2kb8c7i48gda57bb6d9bh81eh49h0d8e3i7ad2kgb1ek86b86g3589k27d@3562",
491 "1.0010111111111100101010101010001100110101010011011100001110111000101101001110001110010100000001010001000111010000010011110100010010101100101000001e15647"},
492 {20, 3,
493 "1.2000000021102111102e-16642",
494 "1.1011101011111110000e-26377"},
495 {68, 13,
496 "1.a43205b2164676727806614acc0398925569c3962a3ba419881a5c63b651aa3ab46@-618",
497 "1.1111011000001110010100111000110010110110011001110001100101011111000e-2287"},
498 {129, 4,
499 "2.22033002012102010122130132103000303000120122313322000222121000300000000000000000000000000000000000000000000000000000000000000000e13222",
500 "1.01010001111000010000110010010000100011010011100011110010011000000110011000000011000011010110111111010000000101010011001000000110e26445"},
501 {22, 6,
502 "1.420033001013011530142e11704",
503 "1.001000110010110110001e30255"},
504 {108, 6,
505 "1.03345424443433104422104400512453214240453335230205104304115343030341144544051005432030344054100542125304500e7375",
506 "1.00101101110001011101101111000010101011101000001111001110001101100000111100010101010101101100011110111010000e19064"},
507 {91, 27,
508 "2.ao077kf8oqoihn5pm6f5eqdcgnd2132d7p6n7di8ep82a1a9be99pm36g1emacbenaeiqphpgpdjhmm9ke3pn4pdea@-5482",
509 "1.111101100001000011101010001000000111000100100111110010101101110001101101101101101010111110e-26066"},
510 {96, 9,
511 "8.25805186310703506315505842015248775712246416686874260383701323213202658278523870037877823670166e-8134",
512 "1.11010111111000011100111001011010001110010001011101011101110101000101100100100010110011001010000e-25782"},
513 {161, 16,
514 "7.3a7627c1e42ef738698e292f0b81728c4b14fe8c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@-3342",
515 "1.1100111010011101100010011111000001111001000010111011110111001110000110100110001110001010010010111100001011100000010111001010001100010010110001010011111110100011e-13366"},
516 {90, 3,
517 "2.10212200011211012002002221112120210222002020100202111000211012122020011102022112222021001e-3447",
518 "1.11100010111011011000101111110001000101000111110001100001010111101101011011110001000010001e-5463"},
519 {100, 27,
520 "a.f81hjjakdnc021op6ffh530ec8ige6n2fqc8f8j7ia7qelebgqkm4ic5ohh652hq1kgpag6pp0ldin6ce1fg6mj34077f5qc5oe@6576",
521 "1.011101001010010011110001100011111111010001110110100100101001010000101011101011110010010011111100000e31271"},
522 {152, 16,
523 "e.37ac48a0303f903c9d20883eddea4300d1190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@-1388",
524 "1.1100011011110101100010010001010000000110000001111111001000000111100100111010010000010001000001111101101110111101010010000110000000011010001000110010000e-5549"},
525 {106, 20,
526 "1.3g2h7i2776d50gjibi937f8cdci3idecdeh3j2gba0j8d1ghgg3eg609ji55h5g7jeai1bii3a4f9jhjfij6jd1g3cg0f6024e252gc3e@6422",
527 "1.100110000101011010100111100110000000100101000110110011010010000101000100110010001110011110111100010000111e27755"},
528 {23, 17,
529 "9.f72e724454d1g0f60g93g6@-6563",
530 "1.0011100011110110010001e-26823"},
531 {98, 6,
532 "1.2444223304453415235424343034030405514010421403514410005234221430055051205523402412055242134042045e-8535",
533 "1.1101110011010001101001001111100101111010100111001011110001000010100101101110011011101100000111011e-22063"},
534 {4, 18,
535 "1.gec@-6711",
536 "1.100e-27984"},
537 {69, 24,
538 "8.d45gdfnhkhb7a20nj96dnggic83imhjne0cceldechn1m4e9fbd9db0ablngjf9n7810@6975",
539 "1.00100111111100101100110011110110110000110110110010100101011111000100e31983"},
540 {122, 8,
541 "4.0227760456667717717077553523466457265600000000000000000000000000000000000000000000000000000000000000000000000000000000000e-1767",
542 "1.0000001001011111111000010010111011011011111100111111100111100011111110110101110101001110011011010010111101011010111000000e-5299"},
543 {144, 23,
544 "8.b01c48dg20bek9a5k376clc501aecg92bdjaeji2dm9230i7j3k36jm50b0c5a0753i2b18534cji34bcl2li033cc534m52k2gbegc25a5g30lf4calag58026i5d7li61jg9digj5ceb1@-4456",
545 "1.00010000110011010111011011110111001101111001010110001101011100100101101110110000010011011111100000100110001001001111111011010110000000001111110e-20154"},
546 {111, 4,
547 "2.23100111310122202021232133233012212012232222323230133100000000000000000000000000000000000000000000000000000000e-10458",
548 "1.01011010000010101110100011010100010001001101110011111101111000110100110000110101110101010111011101100011111010e-20915"},
549 {117, 10,
550 "1.61207328685870427963864999744776917701013812304254540861834226053316419217753608451422967376154318603744156166920074e-6440",
551 "1.01100011000100111001100010000000110010100001001011111010100001101111100100101100111010100011101110001010011010010010e-21393"},
552 {106, 16,
553 "1.dd30a1d24091263243ca1c144f0000000000000000000000000000000000000000000000000000000000000000000000000000000@354",
554 "1.110111010011000010100001110100100100000010010001001001100011001001000011110010100001110000010100010011110e1416"},
555 {77, 14,
556 "4.90d6913ba57b149d8d85a58c311b4d537c10bd7d3c10d69c62bc08d32269760126a58115a105@-7311",
557 "1.1001000000111100000111001001011000110101001111100001100111010100010000011111e-27834"},
558 {8, 4,
559 "3.2230000e15197",
560 "1.1101011e30395"},
561 {81, 24,
562 "1.84ni25h558abmhg2dk7bl2jbbmkf4i8i2bemc5cgmk9jf301c00k24271m9h7mgm4301be1lnldn4364@2573",
563 "1.01110010011000110110100101011001011111101111101100010110101101011101100001000010e11797"},
564 {94, 2,
565 "1.010010010101111001001011111111100100011110110100010001101111111100100101101100110101001011111e32427",
566 "1.010010010101111001001011111111100100011110110100010001101111111100100101101100110101001011111e32427"},
567 {77, 21,
568 "1.87e4k9df85g50ead6fcj4h86820ikdjdjg93d90ca406g470hhkh7ciaba1aggg753g36553ebh5@2538",
569 "1.0010001100011000111010000010011001010011000000100101010001100000111101000111e11148"},
570 {80, 17,
571 "1.923gga999230g94fce02efg753ce001045a35e0264c9c2cb17850e32484fc3526dcg38ed874g5f2@3392",
572 "1.0011100111101001001101111001110100001100111110011110110001100110101010111001110e13865"},
573 {99, 7,
574 "4.53646362336126606650465342500160461331562113222506144210636341332436342025203333264316511653025011e-5540",
575 "1.01101101111001001100001101101101010011001001100110111000010000101000011001001001101000011101011001e-15551"},
576 {119, 20,
577 "1.c8966iabcf4de94ad15f9e83j407i3he7fch54h5jh0g5d74e06c057gg72a107didj8d1j8geibbfec5j36c3fgd5e12edjb9g10j7c9i03f33hi80ce0@7153",
578 "1.0101110101100011110001001110100110011000100000001001000110111110011111100011111010011101011111101101010011110111110100e30915"},
579 {93, 13,
580 "2.c749cb562c3a758b1a21a650666a4c6c53c76ca58a1a75a0358c9ac3866887972b3551a03aa6c150856531258508@193",
581 "1.10101111101001011010111101100100111110011111010110111101100100010011001001100011110100111110e715"},
582 {145, 14,
583 "1.c61614b64261d22c62cb9d16163ca4d144ac23351b708506b3b610b1b67b764ca974448d7a2c6515a6bc97503d4b2a530c75b2b677a464c6629c69b6c3d7860d7749b4b653c434d5@2050",
584 "1.111111100001101111100011001111100010010000101000011110000001110100111001011010100001001010111111010001111101000110011000011101110110001001100101e7805"},
585 {159, 23,
586 "4.bj9l07l0215e7l6lf1dkf62i056l37jaa0gdih717656f1kk1a77883jf99jg31le43em76bmcg4lddl782ihkla0m392886d8lm67d6c3a1l4j12kg0l1k52ee77lmk0gech11g8jeei680k85bi460c7el17@-1539",
587 "1.01010100110100100101100001011100000001100011110001001101000010000001000010000110000110010001110100001101011101101001001101101111001101101111101001010010010100e-6960"},
588 {24, 25,
589 "g.m749al09kflg5b42jnn4a7b@-2820",
590 "1.01010010101011010111011e-13092"},
591 {88, 18,
592 "3.5ed0gad0bhhb7aa9ge2ad1dhcg6833f3e068936hghf23gd2aa69f13539f15hfce50aa64achfee49bfg7249g@-4058",
593 "1.001000010110011011000101100000101111101001100011101101001111110111000010010110010001100e-16920"}
594 };
595
596 static void
597 check_reftable (void)
598 {
599   int i, base;
600   mpfr_t x, y;
601   mpfr_prec_t p;
602   char *s;
603
604   mpfr_init2 (x, 200);
605   mpfr_init2 (y, 200);
606   for (i = 0 ; i < numberof (RefTable) ; i++)
607     {
608       base = RefTable[i].base;
609       p    = RefTable[i].prec;
610       mpfr_set_prec (x, p);
611       mpfr_set_prec (y, p);
612       mpfr_set_str_binary (x, RefTable[i].binstr);
613       mpfr_strtofr (y, RefTable[i].str, &s, base, MPFR_RNDN);
614       if (s == NULL || *s != 0)
615         {
616           printf ("strtofr didn't parse entire input for i=%d:\n"
617                   " Str=%s", i, RefTable[i].str);
618           exit (1);
619         }
620       if (mpfr_cmp (x, y))
621         {
622           printf ("Results differ between strtofr and set_binary for i=%d:\n"
623                   " Set binary gives: ", i);
624           mpfr_dump (x);
625           printf (" strtofr    gives: ");
626           mpfr_dump (y);
627           printf (" setstr     gives: ");
628           mpfr_set_str (x, RefTable[i].str, base, MPFR_RNDN);
629           mpfr_dump (x);
630           mpfr_set_prec (x, 2*p);
631           mpfr_set_str (x, RefTable[i].str, base, MPFR_RNDN);
632           printf (" setstr ++  gives: ");
633           mpfr_dump (x);
634           exit (1);
635         }
636     }
637   mpfr_clear (y);
638   mpfr_clear (x);
639 }
640
641 static void
642 check_parse (void)
643 {
644   mpfr_t x;
645   char *s;
646   int res;
647
648   mpfr_init (x);
649
650   /* Invalid data */
651   mpfr_set_si (x, -1, MPFR_RNDN);
652   res = mpfr_strtofr (x, "  invalid", NULL, 10, MPFR_RNDN);
653   if (MPFR_NOTZERO (x) || MPFR_IS_NEG (x))
654     {
655       printf ("Failed parsing '  invalid' (1)\n X=");
656       mpfr_dump (x);
657       exit (1);
658     }
659   MPFR_ASSERTN (res == 0);
660   mpfr_set_si (x, -1, MPFR_RNDN);
661   res = mpfr_strtofr (x, "  invalid", &s, 0, MPFR_RNDN);
662   if (MPFR_NOTZERO (x) || MPFR_IS_NEG (x) || strcmp (s, "  invalid"))
663     {
664       printf ("Failed parsing '  invalid' (2)\n S=%s\n X=", s);
665       mpfr_dump (x);
666       exit (1);
667     }
668   MPFR_ASSERTN (res == 0);
669   /* Check if it stops correctly */
670   mpfr_strtofr (x, "15*x", &s, 10, MPFR_RNDN);
671   if (mpfr_cmp_ui (x, 15) || strcmp (s, "*x"))
672     {
673       printf ("Failed parsing '15*x'\n S=%s\n X=", s);
674       mpfr_dump (x);
675       exit (1);
676     }
677   /* Check for leading spaces */
678   mpfr_strtofr (x, "  1.5E-10 *x^2", &s, 10, MPFR_RNDN);
679   if (mpfr_cmp_str1 (x, "1.5E-10") || strcmp (s, " *x^2"))
680     {
681       printf ("Failed parsing '1.5E-10*x^2'\n S=%s\n X=", s);
682       mpfr_dump (x);
683       exit (1);
684     }
685   /* Check for leading sign */
686   mpfr_strtofr (x, "  +17.5E-42E ", &s, 10, MPFR_RNDN);
687   if (mpfr_cmp_str1 (x, "17.5E-42") || strcmp (s, "E "))
688     {
689       printf ("Failed parsing '+17.5E-42E '\n S=%s\n X=", s);
690       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
691       exit (1);
692     }
693   mpfr_strtofr (x, "-17.5E+42E\n", &s, 10, MPFR_RNDN);
694   if (mpfr_cmp_str1 (x, "-17.5E42") || strcmp (s, "E\n"))
695     {
696       printf ("Failed parsing '-17.5E+42\\n'\n S=%s\n X=", s);
697       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
698       exit (1);
699     }
700   /* P form */
701   mpfr_strtofr (x, "0x42P17", &s, 16, MPFR_RNDN);
702   if (mpfr_cmp_str (x, "8650752", 10, MPFR_RNDN) || *s != 0)
703     {
704       printf ("Failed parsing '0x42P17' (base = 16)\n S='%s'\n X=", s);
705       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
706       exit (1);
707     }
708   mpfr_strtofr (x, "-0X42p17", &s, 16, MPFR_RNDN);
709   if (mpfr_cmp_str (x, "-8650752", 10, MPFR_RNDN) || *s != 0)
710     {
711       printf ("Failed parsing '-0x42p17' (base = 16)\n S='%s'\n X=", s);
712       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
713       exit (1);
714     }
715   mpfr_strtofr (x, "42p17", &s, 16, MPFR_RNDN);
716   if (mpfr_cmp_str (x, "8650752", 10, MPFR_RNDN) || *s != 0)
717     {
718       printf ("Failed parsing '42p17' (base = 16)\n S='%s'\n X=", s);
719       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
720       exit (1);
721     }
722   mpfr_strtofr (x, "-42P17", &s, 16, MPFR_RNDN);
723   if (mpfr_cmp_str (x, "-8650752", 10, MPFR_RNDN) || *s != 0)
724     {
725       printf ("Failed parsing '-42P17' (base = 16)\n S='%s'\n X=", s);
726       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
727       exit (1);
728     }
729   mpfr_strtofr (x, "0b1001P17", &s, 2, MPFR_RNDN);
730   if (mpfr_cmp_str (x, "1179648", 10, MPFR_RNDN) || *s != 0)
731     {
732       printf ("Failed parsing '0b1001P17' (base = 2)\n S='%s'\n X=", s);
733       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
734       exit (1);
735     }
736   mpfr_strtofr (x, "-0B1001p17", &s, 2, MPFR_RNDN);
737   if (mpfr_cmp_str (x, "-1179648", 10, MPFR_RNDN) || *s != 0)
738     {
739       printf ("Failed parsing '-0B1001p17' (base = 2)\n S='%s'\n X=", s);
740       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
741       exit (1);
742     }
743   mpfr_strtofr (x, "1001p17", &s, 2, MPFR_RNDN);
744   if (mpfr_cmp_str (x, "1179648", 10, MPFR_RNDN) || *s != 0)
745     {
746       printf ("Failed parsing '1001p17' (base = 2)\n S='%s'\n X=", s);
747       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
748       exit (1);
749     }
750   mpfr_strtofr (x, "-1001P17", &s, 2, MPFR_RNDN);
751   if (mpfr_cmp_str (x, "-1179648", 10, MPFR_RNDN) || *s != 0)
752     {
753       printf ("Failed parsing '-1001P17' (base = 2)\n S='%s'\n X=", s);
754       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
755       exit (1);
756     }
757   /* Check for auto-detection of the base */
758   mpfr_strtofr (x, "+0x42P17", &s, 0, MPFR_RNDN);
759   if (mpfr_cmp_str (x, "42P17", 16, MPFR_RNDN) || *s != 0)
760     {
761       printf ("Failed parsing '+0x42P17'\n S=%s\n X=", s);
762       mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n');
763       exit (1);
764     }
765   mpfr_strtofr (x, "-42E17", &s, 0, MPFR_RNDN);
766   if (mpfr_cmp_str (x, "-42E17", 10, MPFR_RNDN) || *s != 0)
767     {
768       printf ("Failed parsing '-42E17'\n S=%s\n X=", s);
769       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
770       exit (1);
771     }
772   mpfr_strtofr (x, "-42P17", &s, 0, MPFR_RNDN);
773   if (mpfr_cmp_str (x, "-42", 10, MPFR_RNDN) || strcmp (s, "P17"))
774     {
775       printf ("Failed parsing '-42P17' (base = 0)\n S='%s'\n X=", s);
776       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
777       exit (1);
778     }
779   mpfr_strtofr (x, " 0b0101.011@42", &s, 0, MPFR_RNDN);
780   if (mpfr_cmp_str (x, "0101.011@42", 2, MPFR_RNDN) || *s != 0)
781     {
782       printf ("Failed parsing '0101.011@42'\n S=%s\n X=", s);
783       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n');
784       exit (1);
785     }
786   mpfr_strtofr (x, " 0b0101.011P42", &s, 0, MPFR_RNDN);
787   if (mpfr_cmp_str (x, "0101.011@42", 2, MPFR_RNDN) || *s != 0)
788     {
789       printf ("Failed parsing '0101.011@42'\n S=%s\n X=", s);
790       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n');
791       exit (1);
792     }
793   mpfr_strtofr (x, "+0x42@17", &s, 0, MPFR_RNDN);
794   if (mpfr_cmp_str (x, "4.2@18", 16, MPFR_RNDN) || *s != 0)
795     {
796       printf ("Failed parsing '+0x42P17'\n S=%s\n X=", s);
797       mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n');
798       exit (1);
799     }
800
801
802   /* Check for space inside the mantissa */
803   mpfr_strtofr (x, "+0x4 2@17", &s, 0, MPFR_RNDN);
804   if (mpfr_cmp_ui (x, 4) || strcmp(s," 2@17"))
805     {
806       printf ("Failed parsing '+0x4 2@17'\n S=%s\n X=", s);
807       mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n');
808       exit (1);
809     }
810   mpfr_strtofr (x, "+0x42 P17", &s, 0, MPFR_RNDN);
811   if (mpfr_cmp_ui (x, 0x42) || strcmp(s," P17"))
812     {
813       printf ("Failed parsing '+0x42 P17'\n S=%s\n X=", s);
814       mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n');
815       exit (1);
816     }
817   /* Space between mantissa and exponent */
818   mpfr_strtofr (x, " -0b0101P 17", &s, 0, MPFR_RNDN);
819   if (mpfr_cmp_si (x, -5) || strcmp(s,"P 17"))
820     {
821       printf ("Failed parsing '-0b0101P 17'\n S=%s\n X=", s);
822       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n');
823       exit (1);
824     }
825   /* Check for Invalid exponent. */
826   mpfr_strtofr (x, " -0b0101PF17", &s, 0, MPFR_RNDN);
827   if (mpfr_cmp_si (x, -5) || strcmp(s,"PF17"))
828     {
829       printf ("Failed parsing '-0b0101PF17'\n S=%s\n X=", s);
830       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n');
831       exit (1);
832     }
833   /* At least one digit in the mantissa. */
834   mpfr_strtofr (x, " .E10", &s, 0, MPFR_RNDN);
835   if (strcmp(s," .E10"))
836     {
837       printf ("Failed parsing ' .E10'\n S=%s\n X=", s);
838       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
839       exit (1);
840     }
841   /* Check 2 '.': 2.3.4   */
842   mpfr_strtofr (x, "-1.2.3E4", &s, 0, MPFR_RNDN);
843   if (mpfr_cmp_str1 (x, "-1.2") || strcmp(s,".3E4"))
844     {
845       printf ("Failed parsing '-1.2.3E4'\n S=%s\n X=", s);
846       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n');
847       exit (1);
848     }
849   /* Check for 0x and 0b */
850   mpfr_strtofr (x, "  0xG", &s, 0, MPFR_RNDN);
851   if (mpfr_cmp_ui (x, 0) || strcmp(s,"xG"))
852     {
853       printf ("Failed parsing '  0xG'\n S=%s\n X=", s);
854       mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n');
855       exit (1);
856     }
857   mpfr_strtofr (x, "  0b2", &s, 0, MPFR_RNDN);
858   if (mpfr_cmp_ui (x, 0) || strcmp(s,"b2"))
859     {
860       printf ("Failed parsing '  0b2'\n S=%s\n X=", s);
861       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n');
862       exit (1);
863     }
864   mpfr_strtofr (x, "-0x.23@2Z33", &s, 0, MPFR_RNDN);
865   if (mpfr_cmp_si (x, -0x23) || strcmp(s,"Z33"))
866     {
867       printf ("Failed parsing '-0x.23@2Z33'\n S=%s\n X=", s);
868       mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n');
869       exit (1);
870     }
871   mpfr_strtofr (x, "  0x", &s, 0, MPFR_RNDN);
872   if (mpfr_cmp_ui (x, 0) || strcmp(s,"x"))
873     {
874       printf ("Failed parsing '  0x'\n S=%s\n X=", s);
875       mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n');
876       exit (1);
877     }
878
879   mpfr_clear (x);
880 }
881
882 static void
883 check_overflow (void)
884 {
885   mpfr_t x;
886   char *s;
887
888   mpfr_init (x);
889
890   /* Huge overflow */
891   mpfr_strtofr (x, "123456789E2147483646", &s, 0, MPFR_RNDN);
892   if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) )
893     {
894       printf ("Check overflow failed (1) with:\n s=%s\n x=", s);
895       mpfr_dump (x);
896       exit (1);
897     }
898   mpfr_strtofr (x, "123456789E9223372036854775807", &s, 0, MPFR_RNDN);
899   if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) )
900     {
901       printf ("Check overflow failed (2) with:\n s='%s'\n x=", s);
902       mpfr_dump (x);
903       exit (1);
904     }
905   mpfr_strtofr (x, "123456789E170141183460469231731687303715884105728",
906                 &s, 0, MPFR_RNDN);
907   if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) )
908     {
909       printf ("Check overflow failed (3) with:\n s=%s\n x=", s);
910       mpfr_dump (x);
911       exit (1);
912     }
913
914   /* Limit overflow */
915   mpfr_strtofr (x, "12E2147483646", &s, 0, MPFR_RNDN);
916   if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) )
917     {
918       printf ("Check overflow failed (4) with:\n s=%s\n x=", s);
919       mpfr_dump (x);
920       exit (1);
921     }
922   mpfr_strtofr (x, "12E2147483645", &s, 0, MPFR_RNDN);
923   if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x))
924     {
925       printf ("Check overflow failed (5) with:\n s=%s\n x=", s);
926       mpfr_dump (x);
927       exit (1);
928     }
929   mpfr_strtofr (x, "0123456789ABCDEF@2147483640", &s, 16, MPFR_RNDN);
930   if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x))
931     {
932       printf ("Check overflow failed (6) with:\n s=%s\n x=", s);
933       mpfr_dump (x);
934       exit (1);
935     }
936   mpfr_strtofr (x, "0123456789ABCDEF@540000000", &s, 16, MPFR_RNDN);
937   if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x))
938     {
939       printf ("Check overflow failed (7) with:\n s=%s\n x=", s);
940       mpfr_dump (x);
941       exit (1);
942     }
943
944   /* Check underflow */
945   mpfr_strtofr (x, "123456789E-2147483646", &s, 0, MPFR_RNDN);
946   if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_POS (x) )
947     {
948       printf ("Check underflow failed (1) with:\n s=%s\n x=", s);
949       mpfr_dump (x);
950       exit (1);
951     }
952   mpfr_strtofr (x, "123456789E-9223372036854775807", &s, 0, MPFR_RNDN);
953   if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_POS (x) )
954     {
955       printf ("Check underflow failed (2) with:\n s='%s'\n x=", s);
956       mpfr_dump (x);
957       exit (1);
958     }
959   mpfr_strtofr (x, "-123456789E-170141183460469231731687303715884105728",
960                 &s, 0, MPFR_RNDN);
961   if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_NEG (x) )
962     {
963       printf ("Check underflow failed (3) with:\n s=%s\n x=", s);
964       mpfr_dump (x);
965       exit (1);
966     }
967   mpfr_strtofr (x, "0123456789ABCDEF@-540000000", &s, 16, MPFR_RNDN);
968   if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_POS (x))
969     {
970       printf ("Check overflow failed (7) with:\n s=%s\n x=", s);
971       mpfr_dump (x);
972       exit (1);
973     }
974
975   mpfr_clear (x);
976 }
977
978 static void
979 check_retval (void)
980 {
981   mpfr_t x;
982   int res;
983
984   mpfr_init2 (x, 10);
985
986   res = mpfr_strtofr (x, "01011000111", NULL, 2, MPFR_RNDN);
987   MPFR_ASSERTN (res == 0);
988   res = mpfr_strtofr (x, "11011000111", NULL, 2, MPFR_RNDN);
989   MPFR_ASSERTN (res > 0);
990   res = mpfr_strtofr (x, "110110001101", NULL, 2, MPFR_RNDN);
991   MPFR_ASSERTN (res < 0);
992
993   mpfr_clear (x);
994 }
995
996 /* Bug found by Christoph Lauter (in mpfr_set_str). */
997 static struct bug20081025_test {
998   mpfr_rnd_t rnd;
999   int inexact;
1000   const char *str;
1001   const char *binstr;
1002 } Bug20081028Table[] = {
1003   {MPFR_RNDN, -1, "1.00000000000000000006", "1"},
1004   {MPFR_RNDZ, -1, "1.00000000000000000006", "1"},
1005   {MPFR_RNDU, +1, "1.00000000000000000006",
1006    "10000000000000000000000000000001e-31"},
1007   {MPFR_RNDD, -1, "1.00000000000000000006", "1"},
1008
1009
1010   {MPFR_RNDN, +1, "-1.00000000000000000006", "-1"},
1011   {MPFR_RNDZ, +1, "-1.00000000000000000006", "-1"},
1012   {MPFR_RNDU, +1, "-1.00000000000000000006", "-1"},
1013   {MPFR_RNDD, -1, "-1.00000000000000000006",
1014    "-10000000000000000000000000000001e-31"},
1015
1016   {MPFR_RNDN, +1, "0.999999999999999999999999999999999999999999999", "1"},
1017   {MPFR_RNDZ, -1, "0.999999999999999999999999999999999999999999999",
1018    "11111111111111111111111111111111e-32"},
1019   {MPFR_RNDU, +1, "0.999999999999999999999999999999999999999999999", "1"},
1020   {MPFR_RNDD, -1, "0.999999999999999999999999999999999999999999999",
1021    "11111111111111111111111111111111e-32"},
1022
1023   {MPFR_RNDN, -1, "-0.999999999999999999999999999999999999999999999", "-1"},
1024   {MPFR_RNDZ, +1, "-0.999999999999999999999999999999999999999999999",
1025    "-11111111111111111111111111111111e-32"},
1026   {MPFR_RNDU, +1, "-0.999999999999999999999999999999999999999999999",
1027    "-11111111111111111111111111111111e-32"},
1028   {MPFR_RNDD, -1, "-0.999999999999999999999999999999999999999999999", "-1"}
1029 };
1030
1031 static void
1032 bug20081028 (void)
1033 {
1034   int i;
1035   int inexact, res;
1036   mpfr_rnd_t rnd;
1037   mpfr_t x, y;
1038   char *s;
1039
1040   mpfr_init2 (x, 32);
1041   mpfr_init2 (y, 32);
1042   for (i = 0 ; i < numberof (Bug20081028Table) ; i++)
1043     {
1044       rnd     = Bug20081028Table[i].rnd;
1045       inexact = Bug20081028Table[i].inexact;
1046       mpfr_set_str_binary (x, Bug20081028Table[i].binstr);
1047       res = mpfr_strtofr (y, Bug20081028Table[i].str, &s, 10, rnd);
1048       if (s == NULL || *s != 0)
1049         {
1050           printf ("Error in Bug20081028: strtofr didn't parse entire input\n"
1051                   "for (i=%d) Str=\"%s\"", i, Bug20081028Table[i].str);
1052           exit (1);
1053         }
1054       if (! SAME_SIGN (res, inexact))
1055         {
1056           printf ("Error in Bug20081028: expected %s ternary value, "
1057                   "got %d\nfor (i=%d) Rnd=%s Str=\"%s\"\n Set binary gives: ",
1058                   inexact > 0 ? "positive" : "negative",
1059                   res, i, mpfr_print_rnd_mode(rnd), Bug20081028Table[i].str);
1060           mpfr_dump (x);
1061           printf (" strtofr    gives: ");
1062           mpfr_dump (y);
1063           exit (1);
1064         }
1065       if (mpfr_cmp (x, y))
1066         {
1067           printf ("Error in Bug20081028: Results differ between strtofr and "
1068                   "set_binary\nfor (i=%d) Rnd=%s Str=\"%s\"\n"
1069                   " Set binary gives: ",
1070                   i, mpfr_print_rnd_mode(rnd), Bug20081028Table[i].str);
1071           mpfr_dump (x);
1072           printf (" strtofr    gives: ");
1073           mpfr_dump (y);
1074           exit (1);
1075         }
1076     }
1077   mpfr_clear (y);
1078   mpfr_clear (x);
1079 }
1080
1081 /* check that 1.23e is correctly parsed, cf
1082    http://gmplib.org/list-archives/gmp-bugs/2010-March/001898.html */
1083 static void
1084 test20100310 (void)
1085 {
1086   mpfr_t x, y;
1087   char str[] = "1.23e", *endptr;
1088
1089   mpfr_init2 (x, 53);
1090   mpfr_init2 (y, 53);
1091   mpfr_strtofr (x, str, &endptr, 10, MPFR_RNDN);
1092   mpfr_strtofr (y, "1.23", NULL, 10, MPFR_RNDN);
1093   if (mpfr_cmp (x, y) != 0)
1094     {
1095       printf ("x <> y in test20100310\n");
1096       exit (1);
1097     }
1098   if (endptr != str + 4) /* strtofr should take into account '1.23',
1099                             not '1.23e' */
1100     {
1101       printf ("endptr <> str + 4 in test20100310\n");
1102       exit (1);
1103     }
1104   mpfr_clear (x);
1105   mpfr_clear (y);
1106 }
1107
1108 int
1109 main (int argc, char *argv[])
1110 {
1111   tests_start_mpfr ();
1112
1113   check_special();
1114   check_reftable ();
1115   check_parse ();
1116   check_overflow ();
1117   check_retval ();
1118   bug20081028 ();
1119   test20100310 ();
1120
1121   tests_end_mpfr ();
1122   return 0;
1123 }