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