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