1 1.1 mrg /* Test file for mpfr_set_str. 2 1.1 mrg 3 1.1.1.6 mrg Copyright 2004-2023 Free Software Foundation, Inc. 4 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA. 5 1.1 mrg 6 1.1 mrg This file is part of the GNU MPFR Library. 7 1.1 mrg 8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify 9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by 10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your 11 1.1 mrg option) any later version. 12 1.1 mrg 13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but 14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16 1.1 mrg License for more details. 17 1.1 mrg 18 1.1 mrg You should have received a copy of the GNU Lesser General Public License 19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20 1.1.1.5 mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 1.1 mrg 23 1.1 mrg #include "mpfr-test.h" 24 1.1 mrg 25 1.1.1.5 mrg /* The implicit \0 is useless, but we do not write num_to_text[62] otherwise 26 1.1.1.5 mrg g++ complains. */ 27 1.1.1.5 mrg static const char num_to_text36[] = "0123456789abcdefghijklmnopqrstuvwxyz"; 28 1.1.1.5 mrg static const char num_to_text62[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 29 1.1.1.5 mrg "abcdefghijklmnopqrstuvwxyz"; 30 1.1.1.5 mrg 31 1.1 mrg static void 32 1.1 mrg check_special (void) 33 1.1 mrg { 34 1.1 mrg mpfr_t x, y; 35 1.1.1.6 mrg int i, res; 36 1.1 mrg char *s; 37 1.1 mrg 38 1.1 mrg mpfr_init (x); 39 1.1 mrg mpfr_init (y); 40 1.1 mrg 41 1.1 mrg /* Check dummy case */ 42 1.1 mrg res = mpfr_strtofr (x, "1234567.89E1", NULL, 10, MPFR_RNDN); 43 1.1 mrg mpfr_set_str (y, "1234567.89E1", 10, MPFR_RNDN); 44 1.1 mrg if (mpfr_cmp (x, y)) 45 1.1 mrg { 46 1.1 mrg printf ("Results differ between strtofr and set_str.\n" 47 1.1 mrg " set_str gives: "); 48 1.1 mrg mpfr_dump (y); 49 1.1 mrg printf (" strtofr gives: "); 50 1.1 mrg mpfr_dump (x); 51 1.1 mrg exit (1); 52 1.1 mrg } 53 1.1 mrg 54 1.1 mrg /* Check NAN */ 55 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 56 1.1 mrg res = mpfr_strtofr (x, "NaN", &s, 10, MPFR_RNDN); 57 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || *s != 0) 58 1.1 mrg { 59 1.1 mrg printf ("Error for setting NAN (1)\n"); 60 1.1 mrg exit (1); 61 1.1 mrg } 62 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 63 1.1 mrg res = mpfr_strtofr (x, "+NaN", &s, 10, MPFR_RNDN); 64 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || *s != 0) 65 1.1 mrg { 66 1.1 mrg printf ("Error for setting +NAN (1)\n"); 67 1.1 mrg exit (1); 68 1.1 mrg } 69 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 70 1.1 mrg res = mpfr_strtofr (x, " -NaN", &s, 10, MPFR_RNDN); 71 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || *s != 0) 72 1.1 mrg { 73 1.1 mrg printf ("Error for setting -NAN (1)\n"); 74 1.1 mrg exit (1); 75 1.1 mrg } 76 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 77 1.1 mrg res = mpfr_strtofr (x, "@nAn@xx", &s, 16, MPFR_RNDN); 78 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "xx") ) 79 1.1 mrg { 80 1.1 mrg printf ("Error for setting NAN (2)\n"); 81 1.1 mrg exit (1); 82 1.1 mrg } 83 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 84 1.1 mrg res = mpfr_strtofr (x, "NAN(abcdEDF__1256)Hello", &s, 10, MPFR_RNDN); 85 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "Hello") ) 86 1.1 mrg { 87 1.1 mrg printf ("Error for setting NAN (3)\n"); 88 1.1 mrg exit (1); 89 1.1 mrg } 90 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 91 1.1 mrg res = mpfr_strtofr (x, "NAN(abcdEDF)__1256)Hello", &s, 10, MPFR_RNDN); 92 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "__1256)Hello") ) 93 1.1 mrg { 94 1.1 mrg printf ("Error for setting NAN (4)\n"); 95 1.1 mrg exit (1); 96 1.1 mrg } 97 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 98 1.1 mrg res = mpfr_strtofr (x, "NAN(abc%dEDF)__1256)Hello", &s, 10, MPFR_RNDN); 99 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "(abc%dEDF)__1256)Hello") ) 100 1.1 mrg { 101 1.1 mrg printf ("Error for setting NAN (5)\n"); 102 1.1 mrg exit (1); 103 1.1 mrg } 104 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 105 1.1 mrg res = mpfr_strtofr (x, "NAN((abc))", &s, 10, MPFR_RNDN); 106 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "((abc))") ) 107 1.1 mrg { 108 1.1 mrg printf ("Error for setting NAN (6)\n"); 109 1.1 mrg exit (1); 110 1.1 mrg } 111 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* make sure that x is modified */ 112 1.1 mrg res = mpfr_strtofr (x, "NAN()foo", &s, 10, MPFR_RNDN); 113 1.1 mrg if (res != 0 || !mpfr_nan_p (x) || strcmp(s, "foo") ) 114 1.1 mrg { 115 1.1 mrg printf ("Error for setting NAN (7)\n"); 116 1.1 mrg exit (1); 117 1.1 mrg } 118 1.1 mrg 119 1.1.1.6 mrg /* Check infinity */ 120 1.1.1.6 mrg for (i = 0; i <= 0xff; i++) 121 1.1 mrg { 122 1.1.1.6 mrg char t[11] = "+@INFINITY"; /* not char *: this will be modified. */ 123 1.1.1.6 mrg char *p; 124 1.1.1.6 mrg int base, j; 125 1.1.1.6 mrg 126 1.1.1.6 mrg /* Test all the case variants, assuming ASCII or similar. 127 1.1.1.6 mrg The first letters are changed first, so that at i = 8, 128 1.1.1.6 mrg the 2^3 = 8 "INF" case variants have been tested, and 129 1.1.1.6 mrg they don't need to be tested again for i > 8. */ 130 1.1.1.6 mrg for (j = 0; j < 8; j++) 131 1.1.1.6 mrg if ((i >> j) % 2 != 0) 132 1.1.1.6 mrg t[j+2] += 'a' - 'A'; 133 1.1.1.6 mrg 134 1.1.1.6 mrg /* Test "INFINITY", "+INFINITY", "-INFINITY", 135 1.1.1.6 mrg "INF", "+INF", "-INF", 136 1.1.1.6 mrg "@INF@", "+@INF@", "-@INF@", 137 1.1.1.6 mrg up to case changes. */ 138 1.1.1.6 mrg for (j = 0; j < 9; j++) 139 1.1.1.6 mrg { 140 1.1.1.6 mrg if (j == 3) 141 1.1.1.6 mrg { 142 1.1.1.6 mrg /* At i = 8, we have tested all the "INF" case variants. */ 143 1.1.1.6 mrg if (i >= 8) 144 1.1.1.6 mrg break; 145 1.1.1.6 mrg t[5] = '\0'; 146 1.1.1.6 mrg } 147 1.1.1.6 mrg if (j == 6) 148 1.1.1.6 mrg { 149 1.1.1.6 mrg t[1] = '@'; 150 1.1.1.6 mrg t[5] = '@'; 151 1.1.1.6 mrg t[6] = '\0'; 152 1.1.1.6 mrg } 153 1.1.1.6 mrg if (j % 3 == 1) 154 1.1.1.6 mrg t[j != 7] = '+'; 155 1.1.1.6 mrg if (j % 3 == 2) 156 1.1.1.6 mrg t[j != 8] = '-'; 157 1.1.1.6 mrg p = t + (j % 3 == 0) + (j < 6); 158 1.1.1.6 mrg base = randlimb () % (j < 6 ? 17 : 63); 159 1.1.1.6 mrg if (base == 1) 160 1.1.1.6 mrg base = 0; 161 1.1.1.6 mrg res = mpfr_strtofr (x, p, &s, base, MPFR_RNDN); 162 1.1.1.6 mrg if (res != 0 || !mpfr_inf_p (x) || *s != 0 || 163 1.1.1.6 mrg (j % 3 != 2 ? MPFR_IS_NEG (x) : MPFR_IS_POS (x))) 164 1.1.1.6 mrg { 165 1.1.1.6 mrg printf ("Error for setting \"%s\" in base %d\n s=\"%s\"\n x=", 166 1.1.1.6 mrg p, base, s); 167 1.1.1.6 mrg mpfr_dump (x); 168 1.1.1.6 mrg exit (1); 169 1.1.1.6 mrg } 170 1.1.1.6 mrg } 171 1.1 mrg } 172 1.1 mrg res = mpfr_strtofr (x, "INFANITY", &s, 8, MPFR_RNDN); 173 1.1 mrg if (res != 0 || !mpfr_inf_p (x) || strcmp(s, "ANITY")) 174 1.1 mrg { 175 1.1 mrg printf ("Error for setting INFINITY (2)\n s=%s\n x=", s); 176 1.1 mrg mpfr_dump (x); 177 1.1 mrg exit (1); 178 1.1 mrg } 179 1.1 mrg res = mpfr_strtofr (x, "@INF@*2", &s, 11, MPFR_RNDN); 180 1.1 mrg if (res != 0 || !mpfr_inf_p (x) || strcmp(s, "*2")) 181 1.1 mrg { 182 1.1 mrg printf ("Error for setting INFINITY (3)\n s=%s\n x=", s); 183 1.1 mrg mpfr_dump (x); 184 1.1 mrg exit (1); 185 1.1 mrg } 186 1.1 mrg 187 1.1 mrg /* Check Zero */ 188 1.1 mrg res = mpfr_strtofr (x, " 00000", &s, 11, MPFR_RNDN); 189 1.1 mrg if (res != 0 || !mpfr_zero_p (x) || s[0] != 0) 190 1.1 mrg { 191 1.1 mrg printf ("Error for setting ZERO (1)\n s=%s\n x=", s); 192 1.1 mrg mpfr_dump (x); 193 1.1 mrg exit (1); 194 1.1 mrg } 195 1.1 mrg 196 1.1 mrg /* Check base 62 */ 197 1.1 mrg res = mpfr_strtofr (x, "A", NULL, 62, MPFR_RNDN); 198 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 10)) 199 1.1 mrg { 200 1.1 mrg printf ("Error for setting 'A' in base 62\n x="); 201 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 202 1.1 mrg putchar ('\n'); 203 1.1 mrg exit (1); 204 1.1 mrg } 205 1.1 mrg res = mpfr_strtofr (x, "a", NULL, 62, MPFR_RNDN); 206 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 36)) 207 1.1 mrg { 208 1.1 mrg printf ("Error for setting 'a' in base 62\n x="); 209 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 210 1.1 mrg putchar ('\n'); 211 1.1 mrg exit (1); 212 1.1 mrg } 213 1.1 mrg res = mpfr_strtofr (x, "Z", NULL, 62, MPFR_RNDN); 214 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 35)) 215 1.1 mrg { 216 1.1 mrg printf ("Error for setting 'Z' in base 62\n x="); 217 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 218 1.1 mrg putchar ('\n'); 219 1.1 mrg exit (1); 220 1.1 mrg } 221 1.1 mrg res = mpfr_strtofr (x, "z", NULL, 62, MPFR_RNDN); 222 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 61)) 223 1.1 mrg { 224 1.1 mrg printf ("Error for setting 'z' in base 62\n x="); 225 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 226 1.1 mrg putchar ('\n'); 227 1.1 mrg exit (1); 228 1.1 mrg } 229 1.1 mrg res = mpfr_strtofr (x, "ZA", NULL, 62, MPFR_RNDN); 230 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 2180)) 231 1.1 mrg { 232 1.1 mrg printf ("Error for setting 'ZA' in base 62\n x="); 233 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 234 1.1 mrg putchar ('\n'); 235 1.1 mrg exit (1); 236 1.1 mrg } 237 1.1 mrg res = mpfr_strtofr (x, "za", NULL, 62, MPFR_RNDN); 238 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 3818)) 239 1.1 mrg { 240 1.1 mrg printf ("Error for setting 'za' in base 62\n x="); 241 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 242 1.1 mrg putchar ('\n'); 243 1.1 mrg exit (1); 244 1.1 mrg } 245 1.1 mrg res = mpfr_strtofr (x, "aZ", NULL, 62, MPFR_RNDN); 246 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 2267)) 247 1.1 mrg { 248 1.1 mrg printf ("Error for setting 'aZ' in base 62\n x="); 249 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 250 1.1 mrg putchar ('\n'); 251 1.1 mrg exit (1); 252 1.1 mrg } 253 1.1 mrg res = mpfr_strtofr (x, "Az", NULL, 62, MPFR_RNDN); 254 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 681)) 255 1.1 mrg { 256 1.1 mrg printf ("Error for setting 'Az' in base 62\n x="); 257 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 258 1.1 mrg putchar ('\n'); 259 1.1 mrg exit (1); 260 1.1 mrg } 261 1.1 mrg 262 1.1 mrg /* Check base 60 */ 263 1.1 mrg res = mpfr_strtofr (x, "Aa", NULL, 60, MPFR_RNDN); 264 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 636)) 265 1.1 mrg { 266 1.1 mrg printf ("Error for setting 'Aa' in base 60\n x="); 267 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 268 1.1 mrg putchar ('\n'); 269 1.1 mrg exit (1); 270 1.1 mrg } 271 1.1 mrg res = mpfr_strtofr (x, "Zz", &s, 60, MPFR_RNDN); 272 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 35) || strcmp(s, "z") ) 273 1.1 mrg { 274 1.1 mrg printf ("Error for setting 'Zz' in base 60\n x="); 275 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 276 1.1 mrg putchar ('\n'); 277 1.1 mrg exit (1); 278 1.1 mrg } 279 1.1 mrg 280 1.1 mrg /* Check base 61 */ 281 1.1 mrg res = mpfr_strtofr (x, "z", &s, 61, MPFR_RNDN); 282 1.1 mrg if (res != 0 || mpfr_cmp_ui (x, 0) || strcmp(s, "z") ) 283 1.1 mrg { 284 1.1 mrg printf ("Error for setting 'z' in base 61\n x="); 285 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 286 1.1 mrg putchar ('\n'); 287 1.1 mrg exit (1); 288 1.1 mrg } 289 1.1 mrg 290 1.1 mrg mpfr_clear (x); 291 1.1 mrg mpfr_clear (y); 292 1.1 mrg } 293 1.1 mrg 294 1.1 mrg /* The following RefTable has been generated by this following code */ 295 1.1 mrg #if 0 296 1.1 mrg #define MAX_NUM 100 297 1.1 mrg 298 1.1 mrg int randomab (int a, int b) 299 1.1 mrg { 300 1.1 mrg return a + rand () % (b-a); 301 1.1 mrg } 302 1.1 mrg 303 1.1 mrg int 304 1.1 mrg main (void) 305 1.1 mrg { 306 1.1 mrg int i, base; 307 1.1 mrg mpfr_t x; 308 1.1 mrg mpfr_prec_t p; 309 1.1 mrg mpfr_exp_t e; 310 1.1 mrg 311 1.1 mrg mpfr_init (x); 312 1.1 mrg printf ("struct dymmy_test { \n" 313 1.1 mrg " mpfr_prec_t prec; \n" 314 1.1 mrg " int base; \n" 315 1.1 mrg " const char *str; \n" 316 1.1 mrg " const char *binstr; \n" 317 1.1 mrg " } RefTable[] = { \n"); 318 1.1 mrg for (i = 0 ; i < MAX_NUM ; i++) 319 1.1 mrg { 320 1.1 mrg p = randomab(2, 180); 321 1.1 mrg base = randomab (2, 30); 322 1.1 mrg e = randomab (-1<<15, 1<<15); 323 1.1 mrg mpfr_set_prec (x, p); 324 1.1 mrg mpfr_urandomb (x, RANDS); 325 1.1 mrg mpfr_mul_2si (x, x, e, MPFR_RNDN); 326 1.1 mrg printf("{%lu, %d,\n\"", p, base); 327 1.1 mrg mpfr_out_str (stdout, base, p, x, MPFR_RNDN); 328 1.1 mrg printf ("\",\n\""); 329 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); 330 1.1 mrg printf ("\"}%c\n", i == MAX_NUM-1 ? ' ' : ',' ); 331 1.1 mrg } 332 1.1 mrg printf("};\n"); 333 1.1 mrg mpfr_clear (x); 334 1.1 mrg } 335 1.1 mrg #endif 336 1.1 mrg 337 1.1 mrg static struct dymmy_test { 338 1.1 mrg mpfr_prec_t prec; 339 1.1 mrg int base; 340 1.1 mrg const char *str; 341 1.1 mrg const char *binstr; 342 1.1 mrg } RefTable[] = { 343 1.1 mrg {39, 20, 344 1.1 mrg "1.1c9jeh9jg12d8iiggf26b8ce2cig24agai51d9@1445", 345 1.1 mrg "1.00111010111010001110110001101011101011e6245"}, 346 1.1 mrg {119, 3, 347 1.1 mrg "1.2210112120221020220021000020101121120011021202212101222000011110211211122222001001221110102220122021121021101010120101e-5655", 348 1.1 mrg "1.1111101110011110001101011100011000011100001011011100010011010010001000000111001010000001110111010100011000110010000000e-8963"}, 349 1.1 mrg {166, 18, 350 1.1 mrg "3.ecg67g31434b74d8hhbe2dbbb46g9546cae72cae0cfghfh00ed7gebe9ca63b47h08bgbdeb880a76dea12he31e1ccd67e9dh22a911b46h517b745169b2g43egg2e4eah820cdb2132d6a4f9c63505dd4a0dafbc@-5946", 351 1.1 mrg "1.011110010000110011111011111100110110010110000010100001101111111000010000011111110101100000010110011001100000010001100101000001101000010010001011001011000110100011001e-24793"}, 352 1.1 mrg {139, 4, 353 1.1 mrg "1.020302230021023320300300101212330121100031233000032101123133120221012000000000000000000000000000000000000000000000000000000000000000000000e11221", 354 1.1 mrg "1.001000110010101100001001001011111000110000110000010001100110111100011001010000001101101111000000001110010001011011011111011000101001000110e22442"}, 355 1.1 mrg {126, 13, 356 1.1 mrg "4.a3cb351c6c548a0475218519514c6c54366681447019ac70a387862c39c86546ab27608c9c2863328860aa2464288070a76c0773882728c5213a335289259@2897", 357 1.1 mrg "1.01011010000001110001100001101111100111011010010111000011000101111011000100001010010100110111101001001001000000011100010000000e10722"}, 358 1.1 mrg {6, 26, 359 1.1 mrg "1.j79f6@-1593", 360 1.1 mrg "1.00000e-7487"}, 361 1.1 mrg {26, 18, 362 1.1 mrg "3.5e99682hh310aa89hb2fb4h88@-5704", 363 1.1 mrg "1.0110010100010101000101100e-23784"}, 364 1.1 mrg {12, 21, 365 1.1 mrg "4.j7f3e2ccdfa@-3524", 366 1.1 mrg "1.10110101011e-15477"}, 367 1.1 mrg {38, 28, 368 1.1 mrg "o.agr0m367b9bmm76rplg7b53qlj7f02g717cab@6452", 369 1.1 mrg "1.1001010011101100110100111000111010001e31021"}, 370 1.1 mrg {75, 17, 371 1.1 mrg "4.00abd9gc99902e1cae2caa7647gcc029g01370e96d3f8e9g02f814d3ge5faa29d40b9db470@5487", 372 1.1 mrg "1.11100000110101010111101001110001001010111111010100000100001010100111011101e22429"}, 373 1.1 mrg {91, 16, 374 1.1 mrg "1.0a812a627160014a3bda1f00000000000000000000000000000000000000000000000000000000000000000000@7897", 375 1.1 mrg "1.000010101000000100101010011000100111000101100000000000010100101000111011110110100001111100e31588"}, 376 1.1 mrg {154, 19, 377 1.1 mrg "1.989279dda02a8ic15e936ahig3c695f6059a3i01b7d1ge6a418bf84gd87e36061hb2bi62ciagcgb9226fafea41d2ig1e2f0a10ea3i40d6dahf598bdbh372bdf5901gh276866804ah53b6338bi@5285", 378 1.1 mrg "1.110101101101101111110010001011110001100000010100011101101001000100110100000011110111000011011101011110010100110101011011111100101101001100000101101000010e22450"}, 379 1.1 mrg {53, 2, 380 1.1 mrg "1.0100010111100111001010000100011011111011011100110111e-20319", 381 1.1 mrg "1.0100010111100111001010000100011011111011011100110111e-20319"}, 382 1.1 mrg {76, 3, 383 1.1 mrg "2.101212121100222100012112101120011222102000021110201110000202111122221100001e1511", 384 1.1 mrg "1.000110101010111000011001011111110000001001101001011011111110111111010000111e2396"}, 385 1.1 mrg {31, 9, 386 1.1 mrg "1.171774371505084376877631528681e3258", 387 1.1 mrg "1.110101101011111011111000110011e10327"}, 388 1.1 mrg {175, 8, 389 1.1 mrg "4.506242760242070533035566017365410474451421355546570157251400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3483", 390 1.1 mrg "1.001010001100101000101111100000101000100001110001010110110000111011011101100000011110111101011000010001001111001001010011000100010111011011011001101011110000011011110101010011e10451"}, 391 1.1 mrg {103, 24, 392 1.1 mrg "8.0hmlm3g183cj358fn4bimn5bie1l89k95m647474mm8jg5kh1c011gi0m7de9j7b48c595g1bki4n32kll7b882eg7klgga0h0gf11@4510", 393 1.1 mrg "1.001000110101001101011010101001111010110100010100110101010101110000001011001101110110010111000101010111e20681"}, 394 1.1 mrg {12, 9, 395 1.1 mrg "3.00221080453e2479", 396 1.1 mrg "1.11000111010e7859"}, 397 1.1 mrg {86, 11, 398 1.1 mrg "6.873680186953174a274754118026423965415553a088387303452447389287133a0956111602a5a085446@5035", 399 1.1 mrg "1.0000000000110100010110000111010001010100101011000100101010010011101010000110011110001e17421"}, 400 1.1 mrg {68, 10, 401 1.1 mrg "6.1617378719016284192718392572980535262609909598793237475124371481233e481", 402 1.1 mrg "1.0110001011000101110010111101100101111110001100001011110011001101111e1600"}, 403 1.1 mrg {11, 15, 404 1.1 mrg "5.ab10c18d45@907", 405 1.1 mrg "1.0000101111e3546"}, 406 1.1 mrg {77, 26, 407 1.1 mrg "6.e6kl84g6h30o3nfnj7fjjff4n1ee6e5iop76gabj23e7hgan9o6724domc7bp4hdll95g817519f@5114", 408 1.1 mrg "1.1011000101111111111110011011101100000100101000001001100000001011010001001000e24040"}, 409 1.1 mrg {28, 27, 410 1.1 mrg "d.odiqp9kgh84o8d2aoqg4c21hemi@3566", 411 1.1 mrg "1.101001111001111111110011110e16959"}, 412 1.1 mrg {45, 14, 413 1.1 mrg "7.cddc6295a576980adbc8c16111d6301bad3146a1143c@-6227", 414 1.1 mrg "1.10000000110011000000101100110001011100010111e-23706"}, 415 1.1 mrg {54, 19, 416 1.1 mrg "1.b6e67i2124hfga2g819g1d6527g2b603eg3cd8hhca9gecig8geg1@4248", 417 1.1 mrg "1.11010100100010101101110110010100000010111010010101110e18045"}, 418 1.1 mrg {49, 20, 419 1.1 mrg "1.jj68bj6idadg44figi10d2ji99g6ddi6c6ich96a5h86i529@-3149", 420 1.1 mrg "1.001011111101100100001010001000011100000000101110e-13609"}, 421 1.1 mrg {171, 16, 422 1.1 mrg "6.22cf0e566d8ff11359d70bd9200065cfd72600b12e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@5602", 423 1.1 mrg "1.10001000101100111100001110010101100110110110001111111100010001001101011001110101110000101111011001001000000000000001100101110011111101011100100110000000001011000100101110e22410"}, 424 1.1 mrg {144, 14, 425 1.1 mrg "1.425d9709b4c125651ab88bb1a0370c14270d067a9a74a612dad48d5c025531c175c1b905201d0d9773aa686c8249db9c0b841b10821791c02baa2525a4aa7571850439c2cc965cd@-3351", 426 1.1 mrg "1.11100111110001001101010111010000101010011000111001101011000001011110101110011011100100111001101101111011001001101011001101001011011101101111011e-12759"}, 427 1.1 mrg {166, 6, 428 1.1 mrg "3.324252232403440543134003140400220120040245215204322153511143504542403430152410543444455151104314552352030352125540101550151410414122051500201022252511512332523431554e8340", 429 1.1 mrg "1.010101111101111101001001110010111110010000001111010101100110011011010110011001001100001111010101100000010111011111101110110111101110010001110001111000001010001111000e21560"}, 430 1.1 mrg {141, 24, 431 1.1 mrg "2.i3c88lkm2958l9ncb9f85kk35namjli84clek5j6jjkli82kb9m4e4i2g39me63db2094cif80gcba8ie6l15ia0d667kn9i1f77bdak599e1ach0j05cdn8kf6c6kfd82j2k6hj2c4d@4281", 432 1.1 mrg "1.10011100001010110111001000000000101011100010101011001010001101110100110111011000111101000001111101100000110100100010101011001100100011001011e19629"}, 433 1.1 mrg {84, 6, 434 1.1 mrg "2.41022133512503223022555143021524424430350133500020112434301542311050052304150111243e982", 435 1.1 mrg "1.11010001111111001010011100011000011100100111111010001111010010101001001000011100001e2539"}, 436 1.1 mrg {56, 9, 437 1.1 mrg "1.5305472255016741401411184703518332515066156086511016413e2936", 438 1.1 mrg "1.0111110010001101000000110101110000110101001011001100111e9307"}, 439 1.1 mrg {18, 8, 440 1.1 mrg "3.63542400000000000e-599", 441 1.1 mrg "1.11100111011000101e-1796"}, 442 1.1 mrg {111, 13, 443 1.1 mrg "8.b693ac7a24679b98708a0057a6202c867bc146740ab1971b380756a24c99804b63436419239ba0510030b819933771a636c57c5747b883@-6160", 444 1.1 mrg "1.01011011111110100101110010100100000110000011011101001110010110000011101110111111010111000011011101101001100100e-22792"}, 445 1.1 mrg {162, 16, 446 1.1 mrg "4.f2abe958a313566adbf3169e55cdcff3785dbd5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@382", 447 1.1 mrg "1.00111100101010101111101001010110001010001100010011010101100110101011011011111100110001011010011110010101011100110111001111111100110111100001011101101111010101110e1530"}, 448 1.1 mrg {117, 23, 449 1.1 mrg "2.4b6kk3ag3if217ih1hggkk69bmcecfil1cd38dijh35j8e6ckhd335a4gj7l05bedk19473i8449b1ajc3jd3ka95eceheh72lh2jh17jamlm1142gll@-3628", 450 1.1 mrg "1.10010010001010001110011000010000011111011101111100110101100100101111101110010011101001111010100010001111110100101111e-16411"}, 451 1.1 mrg {179, 2, 452 1.1 mrg "1.1101101011111010101000110101010101101110001011011010101001110111011010011110001000000110101100010010001110010110011000000110001011111001011110100011101000110001001000110100100110e14203", 453 1.1 mrg "1.1101101011111010101000110101010101101110001011011010101001110111011010011110001000000110101100010010001110010110011000000110001011111001011110100011101000110001001000110100100110e14203"}, 454 1.1 mrg {18, 27, 455 1.1 mrg "4.ll743n2f654gh3154@-6039", 456 1.1 mrg "1.01101001111010011e-28713"}, 457 1.1 mrg {178, 15, 458 1.1 mrg "1.e5443105cad2d014b700c42aa3de854c4b95322420695d07db3564ec07473da83bde123b74c794139265a838ebeca745ad3dc97d7c356271ca935ea8e83306562c2a8edc6e886c1b6b2d3e17038379c33826526770985c068@821", 459 1.1 mrg "1.011100001000101100111111111111000100110111110011101010001111011001111101111001010011100100100101100011101001000000101001010100011111001011001010011101101001000111111010101101011e3208"}, 460 1.1 mrg {161, 22, 461 1.1 mrg "2.46ikji624bg042877h8g2jdki4ece6ede62841j7li843a4becdkkii86c54192jkefehikkb3kcb26ij1b3k9agfbb07dih88d6ej0ee0d63i8hedc7f0g0i9g7jf9gf6423j70h421bg5hf2bja9j0a432lb10@-5125", 462 1.1 mrg "1.0111011000111110000010011100001100100110001011101001011110111010100000011100000010011101011100101100111100110000001101010101011110100011101111001011001111100000e-22854"}, 463 1.1 mrg {62, 19, 464 1.1 mrg "7.bgd1g0886a6c3a9ee67cc7g3bgf718i98d90788idi5587358e660iffc0ic6@3257", 465 1.1 mrg "1.0101100100001110000100010110100100000111110001111001011110100e13838"}, 466 1.1 mrg {127, 19, 467 1.1 mrg "1.413bgf99eidba75ged25f7187080bce3h7ebdeghea4ig6c79g94di7b42a3e4cdi4ic6a53i71d2e4hdbe50ih0a0egf2fi469732131ig6g496bf7h8g3c86ie7h@-4465", 468 1.1 mrg "1.001101111000011011100010010010010110111001001001110011110101111111000001110101111110001110010000110011111101000011000101111101e-18967"}, 469 1.1 mrg {17, 21, 470 1.1 mrg "4.7d5b70gh4k0gj4fj@-116", 471 1.1 mrg "1.1000100010000110e-508"}, 472 1.1 mrg {141, 13, 473 1.1 mrg "2.2b4988c5cb57072a6a1a9c42224794a1cbc175a9bc673bb28aa045c3182b9396ca8bb8590969672b0239608a845a2c35c08908a58c2a83748c89241a6561422c7cc4866c8454@4358", 474 1.1 mrg "1.10010110101000001000001001111001000100111110100010100110111011111011010010101000110101110000111100010000101101000110000000000001111110110011e16127"}, 475 1.1 mrg {39, 7, 476 1.1 mrg "3.00350342452505221136410100232265245244e202", 477 1.1 mrg "1.10011000111110011010100110101101010010e568"}, 478 1.1 mrg {119, 24, 479 1.1 mrg "5.2aene587kc2d9a55mm8clhn4dn0a551de58b1fcli8e8hf1jlm7i0376dl5fhb2k8acka03077mnbn9d4dmi0641dce871c81g2b3ge76m3kngm4a9g5gh@-892", 480 1.1 mrg "1.0111101010010100001001111110000000100101110010010111111100100101100001010010100110111000101100101010111000101111000010e-4088"}, 481 1.1 mrg {41, 14, 482 1.1 mrg "5.c3dc5c49373d0c0075624931133022185bd08b16@-5294", 483 1.1 mrg "1.0101011000010111111111000010100110011111e-20154"}, 484 1.1 mrg {41, 6, 485 1.1 mrg "3.2411143454422033245255450304104450302500e2250", 486 1.1 mrg "1.1110111101010101001001100000100011110111e5817"}, 487 1.1 mrg {17, 13, 488 1.1 mrg "3.65789aa26aa273b1@-4490", 489 1.1 mrg "1.1100011101010111e-16614"}, 490 1.1 mrg {10, 26, 491 1.1 mrg "1.5p4hag1fl@6017", 492 1.1 mrg "1.110010111e28282"}, 493 1.1 mrg {130, 11, 494 1.1 mrg "2.606a72601843700427667823172635a47055021a0a68a99326875195a179483948407aa13726244552332114a1784aaa7239956521604460876871a65708458aa@-6285", 495 1.1 mrg "1.110001001110111110110111000010101000110010011110010101100100001000101011010010000001000101000110111111110101000100000111100010100e-21742"}, 496 1.1 mrg {29, 20, 497 1.1 mrg "j.4356d9b7i38i955jjj1j442501bj@163", 498 1.1 mrg "1.1010101011110011100000100100e708"}, 499 1.1 mrg {140, 21, 500 1.1 mrg "9.2f5k7aid6bj2b2g5bff29i73hk3a8d8g0i7ifa07hkb79g4hd3c7j6g4hjj2jbhai01gkje3h9g3gj3i34f0194kaed32iea9dcgcj8h7i1khdkf965c1ak97gf3h03fcab3ggi03fa@4864", 501 1.1 mrg "1.0101011100011101000110101001010011111111010011000111111111100000011011100111010001100101100110001110001001100101001100110000011110100101101e21367"}, 502 1.1 mrg {133, 13, 503 1.1 mrg "2.3721a9107307a71c75c07c83b70a25a9853619030b5bcb55101ca5c2060bca46c331b92b33aa957c3ac7c817335287c6917999c38c3806b6b5919623023ac52063bb@6602", 504 1.1 mrg "1.011001101111100001100100110100010100010011100010111110110100100000000010011101001011000100000110011011101001010010011110111100010010e24431"}, 505 1.1 mrg {118, 2, 506 1.1 mrg "1.001010111011011000100010001110111000001100101000101101010001110110000111101110111011011101111100110010000101001001001e18960", 507 1.1 mrg "1.001010111011011000100010001110111000001100101000101101010001110110000111101110111011011101111100110010000101001001001e18960"}, 508 1.1 mrg {102, 23, 509 1.1 mrg "l.26lhk42clcm9g940eihakhi32gb3331lld488cf1j4f73ge051bfl8gcmcg78gkjc2iibjf752eag0dee6dafa97k79jlh11j3270@-2160", 510 1.1 mrg "1.01101011011000100101110111110001011000101101011001011111001101000110111010000010011111101110101100010e-9767"}, 511 1.1 mrg {156, 18, 512 1.1 mrg "b.eb927dd4g48abee3cc2begehb9c3b8h83cae152db850ac2f3g816d6787825122c8h3aa3g8023h23000a8hg61065b3e367ac59ca373067730f96dd0d3b73b3c43fef91750b333gd497b8ce9228e7@5504", 513 1.1 mrg "1.11000110111100011101100011001001110011101100011111010100101110010010010011111001100000011010011111111011001011111010001001011001110001100001101000000110000e22954"}, 514 1.1 mrg {158, 5, 515 1.1 mrg "3.0112043214104344433122444210142004032004444213123303302023242414000243311324332203224340334422234000104132020124210141322013240010134130441413233111204013422e-10468", 516 1.1 mrg "1.1001011000111111110100100101110011100001110100101001101110011001101001101011010010111010111111101010100011100010101100110111011101000110110100000111001100011e-24305"}, 517 1.1 mrg {7, 9, 518 1.1 mrg "2.141540e-146", 519 1.1 mrg "1.001111e-462"}, 520 1.1 mrg {111, 5, 521 1.1 mrg "3.21233234110011204313222402442032333320324004133424222041314021020411320312421014434003440431230413141402230403e7641", 522 1.1 mrg "1.10010000000101010000101010101011011010000100010010010000010110001111000111111111000110111001100101101110101101e17743"}, 523 1.1 mrg {76, 13, 524 1.1 mrg "7.1c0861453a4ac156b6119ba7548251b5cb00b7c409c2bb8138214676468c9949676226013c1@4639", 525 1.1 mrg "1.001000011000000011101101101010100010010001010111100110010101111110110010111e17169"}, 526 1.1 mrg {6, 25, 527 1.1 mrg "c.aj660@-6978", 528 1.1 mrg "1.11000e-32402"}, 529 1.1 mrg {156, 3, 530 1.1 mrg "2.22101000022222000012110122210202211110020121210120112102122121111210000211020001020201202200011021211102012110220222110022001121011022011202000110120021012e-14744", 531 1.1 mrg "1.11010001111000101111110000010011001101000100010010110011100100110001100111011101011111111100011111001100001111100101100000001000001100000000010010001011101e-23368"}, 532 1.1 mrg {7, 23, 533 1.1 mrg "1.4hclk2@2148", 534 1.1 mrg "1.110110e9716"}, 535 1.1 mrg {69, 11, 536 1.1 mrg "2.77684920493191632416690544493465617a187218365952a6740034288687745a26@3263", 537 1.1 mrg "1.01111000111000001111001110000110000110001111110011101100101111011100e11289"}, 538 1.1 mrg {146, 21, 539 1.1 mrg "3.agg4d0dj636d526d4i8643ch5jee4ge2c3i46k121857dbedagd98cjifaf0fgc09ca739g2fkfbfh06i687kic2kb8c7i48gda57bb6d9bh81eh49h0d8e3i7ad2kgb1ek86b86g3589k27d@3562", 540 1.1 mrg "1.0010111111111100101010101010001100110101010011011100001110111000101101001110001110010100000001010001000111010000010011110100010010101100101000001e15647"}, 541 1.1 mrg {20, 3, 542 1.1 mrg "1.2000000021102111102e-16642", 543 1.1 mrg "1.1011101011111110000e-26377"}, 544 1.1 mrg {68, 13, 545 1.1 mrg "1.a43205b2164676727806614acc0398925569c3962a3ba419881a5c63b651aa3ab46@-618", 546 1.1 mrg "1.1111011000001110010100111000110010110110011001110001100101011111000e-2287"}, 547 1.1 mrg {129, 4, 548 1.1 mrg "2.22033002012102010122130132103000303000120122313322000222121000300000000000000000000000000000000000000000000000000000000000000000e13222", 549 1.1 mrg "1.01010001111000010000110010010000100011010011100011110010011000000110011000000011000011010110111111010000000101010011001000000110e26445"}, 550 1.1 mrg {22, 6, 551 1.1 mrg "1.420033001013011530142e11704", 552 1.1 mrg "1.001000110010110110001e30255"}, 553 1.1 mrg {108, 6, 554 1.1 mrg "1.03345424443433104422104400512453214240453335230205104304115343030341144544051005432030344054100542125304500e7375", 555 1.1 mrg "1.00101101110001011101101111000010101011101000001111001110001101100000111100010101010101101100011110111010000e19064"}, 556 1.1 mrg {91, 27, 557 1.1 mrg "2.ao077kf8oqoihn5pm6f5eqdcgnd2132d7p6n7di8ep82a1a9be99pm36g1emacbenaeiqphpgpdjhmm9ke3pn4pdea@-5482", 558 1.1 mrg "1.111101100001000011101010001000000111000100100111110010101101110001101101101101101010111110e-26066"}, 559 1.1 mrg {96, 9, 560 1.1 mrg "8.25805186310703506315505842015248775712246416686874260383701323213202658278523870037877823670166e-8134", 561 1.1 mrg "1.11010111111000011100111001011010001110010001011101011101110101000101100100100010110011001010000e-25782"}, 562 1.1 mrg {161, 16, 563 1.1 mrg "7.3a7627c1e42ef738698e292f0b81728c4b14fe8c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@-3342", 564 1.1 mrg "1.1100111010011101100010011111000001111001000010111011110111001110000110100110001110001010010010111100001011100000010111001010001100010010110001010011111110100011e-13366"}, 565 1.1 mrg {90, 3, 566 1.1 mrg "2.10212200011211012002002221112120210222002020100202111000211012122020011102022112222021001e-3447", 567 1.1 mrg "1.11100010111011011000101111110001000101000111110001100001010111101101011011110001000010001e-5463"}, 568 1.1 mrg {100, 27, 569 1.1 mrg "a.f81hjjakdnc021op6ffh530ec8ige6n2fqc8f8j7ia7qelebgqkm4ic5ohh652hq1kgpag6pp0ldin6ce1fg6mj34077f5qc5oe@6576", 570 1.1 mrg "1.011101001010010011110001100011111111010001110110100100101001010000101011101011110010010011111100000e31271"}, 571 1.1 mrg {152, 16, 572 1.1 mrg "e.37ac48a0303f903c9d20883eddea4300d1190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@-1388", 573 1.1 mrg "1.1100011011110101100010010001010000000110000001111111001000000111100100111010010000010001000001111101101110111101010010000110000000011010001000110010000e-5549"}, 574 1.1 mrg {106, 20, 575 1.1 mrg "1.3g2h7i2776d50gjibi937f8cdci3idecdeh3j2gba0j8d1ghgg3eg609ji55h5g7jeai1bii3a4f9jhjfij6jd1g3cg0f6024e252gc3e@6422", 576 1.1 mrg "1.100110000101011010100111100110000000100101000110110011010010000101000100110010001110011110111100010000111e27755"}, 577 1.1 mrg {23, 17, 578 1.1 mrg "9.f72e724454d1g0f60g93g6@-6563", 579 1.1 mrg "1.0011100011110110010001e-26823"}, 580 1.1 mrg {98, 6, 581 1.1 mrg "1.2444223304453415235424343034030405514010421403514410005234221430055051205523402412055242134042045e-8535", 582 1.1 mrg "1.1101110011010001101001001111100101111010100111001011110001000010100101101110011011101100000111011e-22063"}, 583 1.1 mrg {4, 18, 584 1.1 mrg "1.gec@-6711", 585 1.1 mrg "1.100e-27984"}, 586 1.1 mrg {69, 24, 587 1.1 mrg "8.d45gdfnhkhb7a20nj96dnggic83imhjne0cceldechn1m4e9fbd9db0ablngjf9n7810@6975", 588 1.1 mrg "1.00100111111100101100110011110110110000110110110010100101011111000100e31983"}, 589 1.1 mrg {122, 8, 590 1.1 mrg "4.0227760456667717717077553523466457265600000000000000000000000000000000000000000000000000000000000000000000000000000000000e-1767", 591 1.1 mrg "1.0000001001011111111000010010111011011011111100111111100111100011111110110101110101001110011011010010111101011010111000000e-5299"}, 592 1.1 mrg {144, 23, 593 1.1 mrg "8.b01c48dg20bek9a5k376clc501aecg92bdjaeji2dm9230i7j3k36jm50b0c5a0753i2b18534cji34bcl2li033cc534m52k2gbegc25a5g30lf4calag58026i5d7li61jg9digj5ceb1@-4456", 594 1.1 mrg "1.00010000110011010111011011110111001101111001010110001101011100100101101110110000010011011111100000100110001001001111111011010110000000001111110e-20154"}, 595 1.1 mrg {111, 4, 596 1.1 mrg "2.23100111310122202021232133233012212012232222323230133100000000000000000000000000000000000000000000000000000000e-10458", 597 1.1 mrg "1.01011010000010101110100011010100010001001101110011111101111000110100110000110101110101010111011101100011111010e-20915"}, 598 1.1 mrg {117, 10, 599 1.1 mrg "1.61207328685870427963864999744776917701013812304254540861834226053316419217753608451422967376154318603744156166920074e-6440", 600 1.1 mrg "1.01100011000100111001100010000000110010100001001011111010100001101111100100101100111010100011101110001010011010010010e-21393"}, 601 1.1 mrg {106, 16, 602 1.1 mrg "1.dd30a1d24091263243ca1c144f0000000000000000000000000000000000000000000000000000000000000000000000000000000@354", 603 1.1 mrg "1.110111010011000010100001110100100100000010010001001001100011001001000011110010100001110000010100010011110e1416"}, 604 1.1 mrg {77, 14, 605 1.1 mrg "4.90d6913ba57b149d8d85a58c311b4d537c10bd7d3c10d69c62bc08d32269760126a58115a105@-7311", 606 1.1 mrg "1.1001000000111100000111001001011000110101001111100001100111010100010000011111e-27834"}, 607 1.1 mrg {8, 4, 608 1.1 mrg "3.2230000e15197", 609 1.1 mrg "1.1101011e30395"}, 610 1.1 mrg {81, 24, 611 1.1 mrg "1.84ni25h558abmhg2dk7bl2jbbmkf4i8i2bemc5cgmk9jf301c00k24271m9h7mgm4301be1lnldn4364@2573", 612 1.1 mrg "1.01110010011000110110100101011001011111101111101100010110101101011101100001000010e11797"}, 613 1.1 mrg {94, 2, 614 1.1 mrg "1.010010010101111001001011111111100100011110110100010001101111111100100101101100110101001011111e32427", 615 1.1 mrg "1.010010010101111001001011111111100100011110110100010001101111111100100101101100110101001011111e32427"}, 616 1.1 mrg {77, 21, 617 1.1 mrg "1.87e4k9df85g50ead6fcj4h86820ikdjdjg93d90ca406g470hhkh7ciaba1aggg753g36553ebh5@2538", 618 1.1 mrg "1.0010001100011000111010000010011001010011000000100101010001100000111101000111e11148"}, 619 1.1 mrg {80, 17, 620 1.1 mrg "1.923gga999230g94fce02efg753ce001045a35e0264c9c2cb17850e32484fc3526dcg38ed874g5f2@3392", 621 1.1 mrg "1.0011100111101001001101111001110100001100111110011110110001100110101010111001110e13865"}, 622 1.1 mrg {99, 7, 623 1.1 mrg "4.53646362336126606650465342500160461331562113222506144210636341332436342025203333264316511653025011e-5540", 624 1.1 mrg "1.01101101111001001100001101101101010011001001100110111000010000101000011001001001101000011101011001e-15551"}, 625 1.1 mrg {119, 20, 626 1.1 mrg "1.c8966iabcf4de94ad15f9e83j407i3he7fch54h5jh0g5d74e06c057gg72a107didj8d1j8geibbfec5j36c3fgd5e12edjb9g10j7c9i03f33hi80ce0@7153", 627 1.1 mrg "1.0101110101100011110001001110100110011000100000001001000110111110011111100011111010011101011111101101010011110111110100e30915"}, 628 1.1 mrg {93, 13, 629 1.1 mrg "2.c749cb562c3a758b1a21a650666a4c6c53c76ca58a1a75a0358c9ac3866887972b3551a03aa6c150856531258508@193", 630 1.1 mrg "1.10101111101001011010111101100100111110011111010110111101100100010011001001100011110100111110e715"}, 631 1.1 mrg {145, 14, 632 1.1 mrg "1.c61614b64261d22c62cb9d16163ca4d144ac23351b708506b3b610b1b67b764ca974448d7a2c6515a6bc97503d4b2a530c75b2b677a464c6629c69b6c3d7860d7749b4b653c434d5@2050", 633 1.1 mrg "1.111111100001101111100011001111100010010000101000011110000001110100111001011010100001001010111111010001111101000110011000011101110110001001100101e7805"}, 634 1.1 mrg {159, 23, 635 1.1 mrg "4.bj9l07l0215e7l6lf1dkf62i056l37jaa0gdih717656f1kk1a77883jf99jg31le43em76bmcg4lddl782ihkla0m392886d8lm67d6c3a1l4j12kg0l1k52ee77lmk0gech11g8jeei680k85bi460c7el17@-1539", 636 1.1 mrg "1.01010100110100100101100001011100000001100011110001001101000010000001000010000110000110010001110100001101011101101001001101101111001101101111101001010010010100e-6960"}, 637 1.1 mrg {24, 25, 638 1.1 mrg "g.m749al09kflg5b42jnn4a7b@-2820", 639 1.1 mrg "1.01010010101011010111011e-13092"}, 640 1.1 mrg {88, 18, 641 1.1 mrg "3.5ed0gad0bhhb7aa9ge2ad1dhcg6833f3e068936hghf23gd2aa69f13539f15hfce50aa64achfee49bfg7249g@-4058", 642 1.1 mrg "1.001000010110011011000101100000101111101001100011101101001111110111000010010110010001100e-16920"} 643 1.1 mrg }; 644 1.1 mrg 645 1.1 mrg static void 646 1.1 mrg check_reftable (void) 647 1.1 mrg { 648 1.1 mrg int i, base; 649 1.1 mrg mpfr_t x, y; 650 1.1 mrg mpfr_prec_t p; 651 1.1 mrg char *s; 652 1.1 mrg 653 1.1 mrg mpfr_init2 (x, 200); 654 1.1 mrg mpfr_init2 (y, 200); 655 1.1 mrg for (i = 0 ; i < numberof (RefTable) ; i++) 656 1.1 mrg { 657 1.1 mrg base = RefTable[i].base; 658 1.1 mrg p = RefTable[i].prec; 659 1.1 mrg mpfr_set_prec (x, p); 660 1.1 mrg mpfr_set_prec (y, p); 661 1.1 mrg mpfr_set_str_binary (x, RefTable[i].binstr); 662 1.1 mrg mpfr_strtofr (y, RefTable[i].str, &s, base, MPFR_RNDN); 663 1.1 mrg if (s == NULL || *s != 0) 664 1.1 mrg { 665 1.1 mrg printf ("strtofr didn't parse entire input for i=%d:\n" 666 1.1 mrg " Str=%s", i, RefTable[i].str); 667 1.1 mrg exit (1); 668 1.1 mrg } 669 1.1 mrg if (mpfr_cmp (x, y)) 670 1.1 mrg { 671 1.1 mrg printf ("Results differ between strtofr and set_binary for i=%d:\n" 672 1.1 mrg " Set binary gives: ", i); 673 1.1 mrg mpfr_dump (x); 674 1.1 mrg printf (" strtofr gives: "); 675 1.1 mrg mpfr_dump (y); 676 1.1 mrg printf (" setstr gives: "); 677 1.1 mrg mpfr_set_str (x, RefTable[i].str, base, MPFR_RNDN); 678 1.1 mrg mpfr_dump (x); 679 1.1 mrg mpfr_set_prec (x, 2*p); 680 1.1 mrg mpfr_set_str (x, RefTable[i].str, base, MPFR_RNDN); 681 1.1 mrg printf (" setstr ++ gives: "); 682 1.1 mrg mpfr_dump (x); 683 1.1 mrg exit (1); 684 1.1 mrg } 685 1.1 mrg } 686 1.1 mrg mpfr_clear (y); 687 1.1 mrg mpfr_clear (x); 688 1.1 mrg } 689 1.1 mrg 690 1.1 mrg static void 691 1.1 mrg check_parse (void) 692 1.1 mrg { 693 1.1 mrg mpfr_t x; 694 1.1 mrg char *s; 695 1.1 mrg int res; 696 1.1 mrg 697 1.1 mrg mpfr_init (x); 698 1.1 mrg 699 1.1 mrg /* Invalid data */ 700 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN); 701 1.1 mrg res = mpfr_strtofr (x, " invalid", NULL, 10, MPFR_RNDN); 702 1.1 mrg if (MPFR_NOTZERO (x) || MPFR_IS_NEG (x)) 703 1.1 mrg { 704 1.1 mrg printf ("Failed parsing ' invalid' (1)\n X="); 705 1.1 mrg mpfr_dump (x); 706 1.1 mrg exit (1); 707 1.1 mrg } 708 1.1 mrg MPFR_ASSERTN (res == 0); 709 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN); 710 1.1 mrg res = mpfr_strtofr (x, " invalid", &s, 0, MPFR_RNDN); 711 1.1 mrg if (MPFR_NOTZERO (x) || MPFR_IS_NEG (x) || strcmp (s, " invalid")) 712 1.1 mrg { 713 1.1 mrg printf ("Failed parsing ' invalid' (2)\n S=%s\n X=", s); 714 1.1 mrg mpfr_dump (x); 715 1.1 mrg exit (1); 716 1.1 mrg } 717 1.1 mrg MPFR_ASSERTN (res == 0); 718 1.1 mrg /* Check if it stops correctly */ 719 1.1 mrg mpfr_strtofr (x, "15*x", &s, 10, MPFR_RNDN); 720 1.1 mrg if (mpfr_cmp_ui (x, 15) || strcmp (s, "*x")) 721 1.1 mrg { 722 1.1 mrg printf ("Failed parsing '15*x'\n S=%s\n X=", s); 723 1.1 mrg mpfr_dump (x); 724 1.1 mrg exit (1); 725 1.1 mrg } 726 1.1 mrg /* Check for leading spaces */ 727 1.1 mrg mpfr_strtofr (x, " 1.5E-10 *x^2", &s, 10, MPFR_RNDN); 728 1.1 mrg if (mpfr_cmp_str1 (x, "1.5E-10") || strcmp (s, " *x^2")) 729 1.1 mrg { 730 1.1 mrg printf ("Failed parsing '1.5E-10*x^2'\n S=%s\n X=", s); 731 1.1 mrg mpfr_dump (x); 732 1.1 mrg exit (1); 733 1.1 mrg } 734 1.1 mrg /* Check for leading sign */ 735 1.1 mrg mpfr_strtofr (x, " +17.5E-42E ", &s, 10, MPFR_RNDN); 736 1.1 mrg if (mpfr_cmp_str1 (x, "17.5E-42") || strcmp (s, "E ")) 737 1.1 mrg { 738 1.1 mrg printf ("Failed parsing '+17.5E-42E '\n S=%s\n X=", s); 739 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 740 1.1 mrg exit (1); 741 1.1 mrg } 742 1.1 mrg mpfr_strtofr (x, "-17.5E+42E\n", &s, 10, MPFR_RNDN); 743 1.1 mrg if (mpfr_cmp_str1 (x, "-17.5E42") || strcmp (s, "E\n")) 744 1.1 mrg { 745 1.1 mrg printf ("Failed parsing '-17.5E+42\\n'\n S=%s\n X=", s); 746 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 747 1.1 mrg exit (1); 748 1.1 mrg } 749 1.1 mrg /* P form */ 750 1.1 mrg mpfr_strtofr (x, "0x42P17", &s, 16, MPFR_RNDN); 751 1.1 mrg if (mpfr_cmp_str (x, "8650752", 10, MPFR_RNDN) || *s != 0) 752 1.1 mrg { 753 1.1 mrg printf ("Failed parsing '0x42P17' (base = 16)\n S='%s'\n X=", s); 754 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 755 1.1 mrg exit (1); 756 1.1 mrg } 757 1.1 mrg mpfr_strtofr (x, "-0X42p17", &s, 16, MPFR_RNDN); 758 1.1 mrg if (mpfr_cmp_str (x, "-8650752", 10, MPFR_RNDN) || *s != 0) 759 1.1 mrg { 760 1.1 mrg printf ("Failed parsing '-0x42p17' (base = 16)\n S='%s'\n X=", s); 761 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 762 1.1 mrg exit (1); 763 1.1 mrg } 764 1.1 mrg mpfr_strtofr (x, "42p17", &s, 16, MPFR_RNDN); 765 1.1 mrg if (mpfr_cmp_str (x, "8650752", 10, MPFR_RNDN) || *s != 0) 766 1.1 mrg { 767 1.1 mrg printf ("Failed parsing '42p17' (base = 16)\n S='%s'\n X=", s); 768 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 769 1.1 mrg exit (1); 770 1.1 mrg } 771 1.1 mrg mpfr_strtofr (x, "-42P17", &s, 16, MPFR_RNDN); 772 1.1 mrg if (mpfr_cmp_str (x, "-8650752", 10, MPFR_RNDN) || *s != 0) 773 1.1 mrg { 774 1.1 mrg printf ("Failed parsing '-42P17' (base = 16)\n S='%s'\n X=", s); 775 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 776 1.1 mrg exit (1); 777 1.1 mrg } 778 1.1 mrg mpfr_strtofr (x, "0b1001P17", &s, 2, MPFR_RNDN); 779 1.1 mrg if (mpfr_cmp_str (x, "1179648", 10, MPFR_RNDN) || *s != 0) 780 1.1 mrg { 781 1.1 mrg printf ("Failed parsing '0b1001P17' (base = 2)\n S='%s'\n X=", s); 782 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 783 1.1 mrg exit (1); 784 1.1 mrg } 785 1.1 mrg mpfr_strtofr (x, "-0B1001p17", &s, 2, MPFR_RNDN); 786 1.1 mrg if (mpfr_cmp_str (x, "-1179648", 10, MPFR_RNDN) || *s != 0) 787 1.1 mrg { 788 1.1 mrg printf ("Failed parsing '-0B1001p17' (base = 2)\n S='%s'\n X=", s); 789 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 790 1.1 mrg exit (1); 791 1.1 mrg } 792 1.1 mrg mpfr_strtofr (x, "1001p17", &s, 2, MPFR_RNDN); 793 1.1 mrg if (mpfr_cmp_str (x, "1179648", 10, MPFR_RNDN) || *s != 0) 794 1.1 mrg { 795 1.1 mrg printf ("Failed parsing '1001p17' (base = 2)\n S='%s'\n X=", s); 796 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 797 1.1 mrg exit (1); 798 1.1 mrg } 799 1.1 mrg mpfr_strtofr (x, "-1001P17", &s, 2, MPFR_RNDN); 800 1.1 mrg if (mpfr_cmp_str (x, "-1179648", 10, MPFR_RNDN) || *s != 0) 801 1.1 mrg { 802 1.1 mrg printf ("Failed parsing '-1001P17' (base = 2)\n S='%s'\n X=", s); 803 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 804 1.1 mrg exit (1); 805 1.1 mrg } 806 1.1 mrg /* Check for auto-detection of the base */ 807 1.1 mrg mpfr_strtofr (x, "+0x42P17", &s, 0, MPFR_RNDN); 808 1.1 mrg if (mpfr_cmp_str (x, "42P17", 16, MPFR_RNDN) || *s != 0) 809 1.1 mrg { 810 1.1 mrg printf ("Failed parsing '+0x42P17'\n S=%s\n X=", s); 811 1.1 mrg mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); 812 1.1 mrg exit (1); 813 1.1 mrg } 814 1.1 mrg mpfr_strtofr (x, "-42E17", &s, 0, MPFR_RNDN); 815 1.1 mrg if (mpfr_cmp_str (x, "-42E17", 10, MPFR_RNDN) || *s != 0) 816 1.1 mrg { 817 1.1 mrg printf ("Failed parsing '-42E17'\n S=%s\n X=", s); 818 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 819 1.1 mrg exit (1); 820 1.1 mrg } 821 1.1 mrg mpfr_strtofr (x, "-42P17", &s, 0, MPFR_RNDN); 822 1.1 mrg if (mpfr_cmp_str (x, "-42", 10, MPFR_RNDN) || strcmp (s, "P17")) 823 1.1 mrg { 824 1.1 mrg printf ("Failed parsing '-42P17' (base = 0)\n S='%s'\n X=", s); 825 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 826 1.1 mrg exit (1); 827 1.1 mrg } 828 1.1 mrg mpfr_strtofr (x, " 0b0101.011@42", &s, 0, MPFR_RNDN); 829 1.1 mrg if (mpfr_cmp_str (x, "0101.011@42", 2, MPFR_RNDN) || *s != 0) 830 1.1 mrg { 831 1.1 mrg printf ("Failed parsing '0101.011@42'\n S=%s\n X=", s); 832 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n'); 833 1.1 mrg exit (1); 834 1.1 mrg } 835 1.1 mrg mpfr_strtofr (x, " 0b0101.011P42", &s, 0, MPFR_RNDN); 836 1.1 mrg if (mpfr_cmp_str (x, "0101.011@42", 2, MPFR_RNDN) || *s != 0) 837 1.1 mrg { 838 1.1 mrg printf ("Failed parsing '0101.011@42'\n S=%s\n X=", s); 839 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n'); 840 1.1 mrg exit (1); 841 1.1 mrg } 842 1.1 mrg mpfr_strtofr (x, "+0x42@17", &s, 0, MPFR_RNDN); 843 1.1 mrg if (mpfr_cmp_str (x, "4.2@18", 16, MPFR_RNDN) || *s != 0) 844 1.1 mrg { 845 1.1 mrg printf ("Failed parsing '+0x42P17'\n S=%s\n X=", s); 846 1.1 mrg mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); 847 1.1 mrg exit (1); 848 1.1 mrg } 849 1.1 mrg 850 1.1 mrg 851 1.1 mrg /* Check for space inside the mantissa */ 852 1.1 mrg mpfr_strtofr (x, "+0x4 2@17", &s, 0, MPFR_RNDN); 853 1.1 mrg if (mpfr_cmp_ui (x, 4) || strcmp(s," 2@17")) 854 1.1 mrg { 855 1.1 mrg printf ("Failed parsing '+0x4 2@17'\n S=%s\n X=", s); 856 1.1 mrg mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); 857 1.1 mrg exit (1); 858 1.1 mrg } 859 1.1 mrg mpfr_strtofr (x, "+0x42 P17", &s, 0, MPFR_RNDN); 860 1.1 mrg if (mpfr_cmp_ui (x, 0x42) || strcmp(s," P17")) 861 1.1 mrg { 862 1.1 mrg printf ("Failed parsing '+0x42 P17'\n S=%s\n X=", s); 863 1.1 mrg mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); 864 1.1 mrg exit (1); 865 1.1 mrg } 866 1.1 mrg /* Space between mantissa and exponent */ 867 1.1 mrg mpfr_strtofr (x, " -0b0101P 17", &s, 0, MPFR_RNDN); 868 1.1 mrg if (mpfr_cmp_si (x, -5) || strcmp(s,"P 17")) 869 1.1 mrg { 870 1.1 mrg printf ("Failed parsing '-0b0101P 17'\n S=%s\n X=", s); 871 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n'); 872 1.1 mrg exit (1); 873 1.1 mrg } 874 1.1 mrg /* Check for Invalid exponent. */ 875 1.1 mrg mpfr_strtofr (x, " -0b0101PF17", &s, 0, MPFR_RNDN); 876 1.1 mrg if (mpfr_cmp_si (x, -5) || strcmp(s,"PF17")) 877 1.1 mrg { 878 1.1 mrg printf ("Failed parsing '-0b0101PF17'\n S=%s\n X=", s); 879 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n'); 880 1.1 mrg exit (1); 881 1.1 mrg } 882 1.1 mrg /* At least one digit in the mantissa. */ 883 1.1 mrg mpfr_strtofr (x, " .E10", &s, 0, MPFR_RNDN); 884 1.1 mrg if (strcmp(s," .E10")) 885 1.1 mrg { 886 1.1 mrg printf ("Failed parsing ' .E10'\n S=%s\n X=", s); 887 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 888 1.1 mrg exit (1); 889 1.1 mrg } 890 1.1 mrg /* Check 2 '.': 2.3.4 */ 891 1.1 mrg mpfr_strtofr (x, "-1.2.3E4", &s, 0, MPFR_RNDN); 892 1.1 mrg if (mpfr_cmp_str1 (x, "-1.2") || strcmp(s,".3E4")) 893 1.1 mrg { 894 1.1 mrg printf ("Failed parsing '-1.2.3E4'\n S=%s\n X=", s); 895 1.1 mrg mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); 896 1.1 mrg exit (1); 897 1.1 mrg } 898 1.1 mrg /* Check for 0x and 0b */ 899 1.1 mrg mpfr_strtofr (x, " 0xG", &s, 0, MPFR_RNDN); 900 1.1 mrg if (mpfr_cmp_ui (x, 0) || strcmp(s,"xG")) 901 1.1 mrg { 902 1.1 mrg printf ("Failed parsing ' 0xG'\n S=%s\n X=", s); 903 1.1 mrg mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); 904 1.1 mrg exit (1); 905 1.1 mrg } 906 1.1 mrg mpfr_strtofr (x, " 0b2", &s, 0, MPFR_RNDN); 907 1.1 mrg if (mpfr_cmp_ui (x, 0) || strcmp(s,"b2")) 908 1.1 mrg { 909 1.1 mrg printf ("Failed parsing ' 0b2'\n S=%s\n X=", s); 910 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN); putchar ('\n'); 911 1.1 mrg exit (1); 912 1.1 mrg } 913 1.1 mrg mpfr_strtofr (x, "-0x.23@2Z33", &s, 0, MPFR_RNDN); 914 1.1 mrg if (mpfr_cmp_si (x, -0x23) || strcmp(s,"Z33")) 915 1.1 mrg { 916 1.1 mrg printf ("Failed parsing '-0x.23@2Z33'\n S=%s\n X=", s); 917 1.1 mrg mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); 918 1.1 mrg exit (1); 919 1.1 mrg } 920 1.1 mrg mpfr_strtofr (x, " 0x", &s, 0, MPFR_RNDN); 921 1.1 mrg if (mpfr_cmp_ui (x, 0) || strcmp(s,"x")) 922 1.1 mrg { 923 1.1 mrg printf ("Failed parsing ' 0x'\n S=%s\n X=", s); 924 1.1 mrg mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); 925 1.1 mrg exit (1); 926 1.1 mrg } 927 1.1 mrg 928 1.1 mrg mpfr_clear (x); 929 1.1 mrg } 930 1.1 mrg 931 1.1 mrg static void 932 1.1 mrg check_overflow (void) 933 1.1 mrg { 934 1.1 mrg mpfr_t x; 935 1.1 mrg char *s; 936 1.1 mrg 937 1.1 mrg mpfr_init (x); 938 1.1 mrg 939 1.1 mrg /* Huge overflow */ 940 1.1 mrg mpfr_strtofr (x, "123456789E2147483646", &s, 0, MPFR_RNDN); 941 1.1 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) ) 942 1.1 mrg { 943 1.1 mrg printf ("Check overflow failed (1) with:\n s=%s\n x=", s); 944 1.1 mrg mpfr_dump (x); 945 1.1 mrg exit (1); 946 1.1 mrg } 947 1.1 mrg mpfr_strtofr (x, "123456789E9223372036854775807", &s, 0, MPFR_RNDN); 948 1.1 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) ) 949 1.1 mrg { 950 1.1 mrg printf ("Check overflow failed (2) with:\n s='%s'\n x=", s); 951 1.1 mrg mpfr_dump (x); 952 1.1.1.5 mrg #if defined(__GNUC__) 953 1.1.1.5 mrg printf ("This failure is triggered by GCC bug 86554:\n" 954 1.1.1.5 mrg " https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86554\n" 955 1.1.1.5 mrg " https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87276 " 956 1.1.1.5 mrg "(about this test)\nWorkaround: disable code hoisting " 957 1.1.1.5 mrg "with -fno-code-hoisting in CFLAGS.\n"); 958 1.1.1.5 mrg /* Note: In Debian, this error is obtained with gcc-snapshot from 959 1.1.1.5 mrg 20180908-1 to 20181127-1. With gcc-snapshot from 20181209-1 to 960 1.1.1.5 mrg 20190102-1 (at least), the MPFR build no longer seems affected 961 1.1.1.5 mrg in general, but using --with-gmp-build=... together with 962 1.1.1.5 mrg --enable-assert still triggers this failure. This bug has been 963 1.1.1.5 mrg fixed in the GCC trunk rev 267725, thus the future gcc-snapshot 964 1.1.1.5 mrg versions should no longer have this bug. */ 965 1.1.1.5 mrg #endif 966 1.1 mrg exit (1); 967 1.1 mrg } 968 1.1 mrg mpfr_strtofr (x, "123456789E170141183460469231731687303715884105728", 969 1.1 mrg &s, 0, MPFR_RNDN); 970 1.1 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) ) 971 1.1 mrg { 972 1.1 mrg printf ("Check overflow failed (3) with:\n s=%s\n x=", s); 973 1.1 mrg mpfr_dump (x); 974 1.1 mrg exit (1); 975 1.1 mrg } 976 1.1 mrg 977 1.1 mrg /* Limit overflow */ 978 1.1 mrg mpfr_strtofr (x, "12E2147483646", &s, 0, MPFR_RNDN); 979 1.1 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x) ) 980 1.1 mrg { 981 1.1 mrg printf ("Check overflow failed (4) with:\n s=%s\n x=", s); 982 1.1 mrg mpfr_dump (x); 983 1.1 mrg exit (1); 984 1.1 mrg } 985 1.1 mrg mpfr_strtofr (x, "12E2147483645", &s, 0, MPFR_RNDN); 986 1.1 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x)) 987 1.1 mrg { 988 1.1 mrg printf ("Check overflow failed (5) with:\n s=%s\n x=", s); 989 1.1 mrg mpfr_dump (x); 990 1.1 mrg exit (1); 991 1.1 mrg } 992 1.1 mrg mpfr_strtofr (x, "0123456789ABCDEF@2147483640", &s, 16, MPFR_RNDN); 993 1.1 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x)) 994 1.1 mrg { 995 1.1 mrg printf ("Check overflow failed (6) with:\n s=%s\n x=", s); 996 1.1 mrg mpfr_dump (x); 997 1.1 mrg exit (1); 998 1.1 mrg } 999 1.1 mrg mpfr_strtofr (x, "0123456789ABCDEF@540000000", &s, 16, MPFR_RNDN); 1000 1.1 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x)) 1001 1.1 mrg { 1002 1.1 mrg printf ("Check overflow failed (7) with:\n s=%s\n x=", s); 1003 1.1 mrg mpfr_dump (x); 1004 1.1 mrg exit (1); 1005 1.1 mrg } 1006 1.1.1.5 mrg mpfr_strtofr (x, "1@2305843009213693951", &s, 16, MPFR_RNDN); 1007 1.1.1.5 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x)) 1008 1.1.1.5 mrg { 1009 1.1.1.5 mrg printf ("Check overflow failed (8) with:\n s=%s\n x=", s); 1010 1.1.1.5 mrg mpfr_dump (x); 1011 1.1.1.5 mrg exit (1); 1012 1.1.1.5 mrg } 1013 1.1.1.5 mrg mpfr_strtofr (x, "1@2305843009213693951", &s, 17, MPFR_RNDN); 1014 1.1.1.5 mrg if (s[0] != 0 || !MPFR_IS_INF (x) || !MPFR_IS_POS (x)) 1015 1.1.1.5 mrg { 1016 1.1.1.5 mrg printf ("Check overflow failed (9) with:\n s=%s\n x=", s); 1017 1.1.1.5 mrg mpfr_dump (x); 1018 1.1.1.5 mrg exit (1); 1019 1.1.1.5 mrg } 1020 1.1 mrg 1021 1.1 mrg /* Check underflow */ 1022 1.1 mrg mpfr_strtofr (x, "123456789E-2147483646", &s, 0, MPFR_RNDN); 1023 1.1 mrg if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_POS (x) ) 1024 1.1 mrg { 1025 1.1 mrg printf ("Check underflow failed (1) with:\n s=%s\n x=", s); 1026 1.1 mrg mpfr_dump (x); 1027 1.1 mrg exit (1); 1028 1.1 mrg } 1029 1.1 mrg mpfr_strtofr (x, "123456789E-9223372036854775807", &s, 0, MPFR_RNDN); 1030 1.1 mrg if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_POS (x) ) 1031 1.1 mrg { 1032 1.1 mrg printf ("Check underflow failed (2) with:\n s='%s'\n x=", s); 1033 1.1 mrg mpfr_dump (x); 1034 1.1 mrg exit (1); 1035 1.1 mrg } 1036 1.1 mrg mpfr_strtofr (x, "-123456789E-170141183460469231731687303715884105728", 1037 1.1 mrg &s, 0, MPFR_RNDN); 1038 1.1 mrg if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_NEG (x) ) 1039 1.1 mrg { 1040 1.1 mrg printf ("Check underflow failed (3) with:\n s=%s\n x=", s); 1041 1.1 mrg mpfr_dump (x); 1042 1.1 mrg exit (1); 1043 1.1 mrg } 1044 1.1 mrg mpfr_strtofr (x, "0123456789ABCDEF@-540000000", &s, 16, MPFR_RNDN); 1045 1.1 mrg if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_POS (x)) 1046 1.1 mrg { 1047 1.1 mrg printf ("Check overflow failed (7) with:\n s=%s\n x=", s); 1048 1.1 mrg mpfr_dump (x); 1049 1.1 mrg exit (1); 1050 1.1 mrg } 1051 1.1.1.5 mrg mpfr_strtofr (x, "1@-2305843009213693952", &s, 16, MPFR_RNDN); 1052 1.1.1.5 mrg if (s[0] != 0 || !MPFR_IS_ZERO (x) || !MPFR_IS_POS (x) ) 1053 1.1.1.5 mrg { 1054 1.1.1.5 mrg printf ("Check underflow failed (8) with:\n s='%s'\n x=", s); 1055 1.1.1.5 mrg mpfr_dump (x); 1056 1.1.1.5 mrg exit (1); 1057 1.1.1.5 mrg } 1058 1.1 mrg 1059 1.1 mrg mpfr_clear (x); 1060 1.1 mrg } 1061 1.1 mrg 1062 1.1 mrg static void 1063 1.1 mrg check_retval (void) 1064 1.1 mrg { 1065 1.1 mrg mpfr_t x; 1066 1.1 mrg int res; 1067 1.1 mrg 1068 1.1 mrg mpfr_init2 (x, 10); 1069 1.1 mrg 1070 1.1 mrg res = mpfr_strtofr (x, "01011000111", NULL, 2, MPFR_RNDN); 1071 1.1 mrg MPFR_ASSERTN (res == 0); 1072 1.1 mrg res = mpfr_strtofr (x, "11011000111", NULL, 2, MPFR_RNDN); 1073 1.1 mrg MPFR_ASSERTN (res > 0); 1074 1.1 mrg res = mpfr_strtofr (x, "110110001101", NULL, 2, MPFR_RNDN); 1075 1.1 mrg MPFR_ASSERTN (res < 0); 1076 1.1 mrg 1077 1.1 mrg mpfr_clear (x); 1078 1.1 mrg } 1079 1.1 mrg 1080 1.1 mrg /* Bug found by Christoph Lauter (in mpfr_set_str). */ 1081 1.1 mrg static struct bug20081025_test { 1082 1.1 mrg mpfr_rnd_t rnd; 1083 1.1 mrg int inexact; 1084 1.1 mrg const char *str; 1085 1.1 mrg const char *binstr; 1086 1.1 mrg } Bug20081028Table[] = { 1087 1.1 mrg {MPFR_RNDN, -1, "1.00000000000000000006", "1"}, 1088 1.1 mrg {MPFR_RNDZ, -1, "1.00000000000000000006", "1"}, 1089 1.1 mrg {MPFR_RNDU, +1, "1.00000000000000000006", 1090 1.1 mrg "10000000000000000000000000000001e-31"}, 1091 1.1 mrg {MPFR_RNDD, -1, "1.00000000000000000006", "1"}, 1092 1.1 mrg 1093 1.1 mrg 1094 1.1 mrg {MPFR_RNDN, +1, "-1.00000000000000000006", "-1"}, 1095 1.1 mrg {MPFR_RNDZ, +1, "-1.00000000000000000006", "-1"}, 1096 1.1 mrg {MPFR_RNDU, +1, "-1.00000000000000000006", "-1"}, 1097 1.1 mrg {MPFR_RNDD, -1, "-1.00000000000000000006", 1098 1.1 mrg "-10000000000000000000000000000001e-31"}, 1099 1.1 mrg 1100 1.1 mrg {MPFR_RNDN, +1, "0.999999999999999999999999999999999999999999999", "1"}, 1101 1.1 mrg {MPFR_RNDZ, -1, "0.999999999999999999999999999999999999999999999", 1102 1.1 mrg "11111111111111111111111111111111e-32"}, 1103 1.1 mrg {MPFR_RNDU, +1, "0.999999999999999999999999999999999999999999999", "1"}, 1104 1.1 mrg {MPFR_RNDD, -1, "0.999999999999999999999999999999999999999999999", 1105 1.1 mrg "11111111111111111111111111111111e-32"}, 1106 1.1 mrg 1107 1.1 mrg {MPFR_RNDN, -1, "-0.999999999999999999999999999999999999999999999", "-1"}, 1108 1.1 mrg {MPFR_RNDZ, +1, "-0.999999999999999999999999999999999999999999999", 1109 1.1 mrg "-11111111111111111111111111111111e-32"}, 1110 1.1 mrg {MPFR_RNDU, +1, "-0.999999999999999999999999999999999999999999999", 1111 1.1 mrg "-11111111111111111111111111111111e-32"}, 1112 1.1 mrg {MPFR_RNDD, -1, "-0.999999999999999999999999999999999999999999999", "-1"} 1113 1.1 mrg }; 1114 1.1 mrg 1115 1.1 mrg static void 1116 1.1 mrg bug20081028 (void) 1117 1.1 mrg { 1118 1.1 mrg int i; 1119 1.1 mrg int inexact, res; 1120 1.1 mrg mpfr_rnd_t rnd; 1121 1.1 mrg mpfr_t x, y; 1122 1.1 mrg char *s; 1123 1.1 mrg 1124 1.1 mrg mpfr_init2 (x, 32); 1125 1.1 mrg mpfr_init2 (y, 32); 1126 1.1 mrg for (i = 0 ; i < numberof (Bug20081028Table) ; i++) 1127 1.1 mrg { 1128 1.1 mrg rnd = Bug20081028Table[i].rnd; 1129 1.1 mrg inexact = Bug20081028Table[i].inexact; 1130 1.1 mrg mpfr_set_str_binary (x, Bug20081028Table[i].binstr); 1131 1.1 mrg res = mpfr_strtofr (y, Bug20081028Table[i].str, &s, 10, rnd); 1132 1.1 mrg if (s == NULL || *s != 0) 1133 1.1 mrg { 1134 1.1 mrg printf ("Error in Bug20081028: strtofr didn't parse entire input\n" 1135 1.1 mrg "for (i=%d) Str=\"%s\"", i, Bug20081028Table[i].str); 1136 1.1 mrg exit (1); 1137 1.1 mrg } 1138 1.1 mrg if (! SAME_SIGN (res, inexact)) 1139 1.1 mrg { 1140 1.1 mrg printf ("Error in Bug20081028: expected %s ternary value, " 1141 1.1 mrg "got %d\nfor (i=%d) Rnd=%s Str=\"%s\"\n Set binary gives: ", 1142 1.1 mrg inexact > 0 ? "positive" : "negative", 1143 1.1 mrg res, i, mpfr_print_rnd_mode(rnd), Bug20081028Table[i].str); 1144 1.1 mrg mpfr_dump (x); 1145 1.1 mrg printf (" strtofr gives: "); 1146 1.1 mrg mpfr_dump (y); 1147 1.1 mrg exit (1); 1148 1.1 mrg } 1149 1.1 mrg if (mpfr_cmp (x, y)) 1150 1.1 mrg { 1151 1.1 mrg printf ("Error in Bug20081028: Results differ between strtofr and " 1152 1.1 mrg "set_binary\nfor (i=%d) Rnd=%s Str=\"%s\"\n" 1153 1.1 mrg " Set binary gives: ", 1154 1.1 mrg i, mpfr_print_rnd_mode(rnd), Bug20081028Table[i].str); 1155 1.1 mrg mpfr_dump (x); 1156 1.1 mrg printf (" strtofr gives: "); 1157 1.1 mrg mpfr_dump (y); 1158 1.1 mrg exit (1); 1159 1.1 mrg } 1160 1.1 mrg } 1161 1.1 mrg mpfr_clear (y); 1162 1.1 mrg mpfr_clear (x); 1163 1.1 mrg } 1164 1.1 mrg 1165 1.1 mrg /* check that 1.23e is correctly parsed, cf 1166 1.1.1.4 mrg https://gmplib.org/list-archives/gmp-bugs/2010-March/001898.html */ 1167 1.1 mrg static void 1168 1.1 mrg test20100310 (void) 1169 1.1 mrg { 1170 1.1 mrg mpfr_t x, y; 1171 1.1 mrg char str[] = "1.23e", *endptr; 1172 1.1 mrg 1173 1.1 mrg mpfr_init2 (x, 53); 1174 1.1 mrg mpfr_init2 (y, 53); 1175 1.1 mrg mpfr_strtofr (x, str, &endptr, 10, MPFR_RNDN); 1176 1.1 mrg mpfr_strtofr (y, "1.23", NULL, 10, MPFR_RNDN); 1177 1.1 mrg if (mpfr_cmp (x, y) != 0) 1178 1.1 mrg { 1179 1.1 mrg printf ("x <> y in test20100310\n"); 1180 1.1 mrg exit (1); 1181 1.1 mrg } 1182 1.1 mrg if (endptr != str + 4) /* strtofr should take into account '1.23', 1183 1.1 mrg not '1.23e' */ 1184 1.1 mrg { 1185 1.1 mrg printf ("endptr <> str + 4 in test20100310\n"); 1186 1.1 mrg exit (1); 1187 1.1 mrg } 1188 1.1 mrg mpfr_clear (x); 1189 1.1 mrg mpfr_clear (y); 1190 1.1 mrg } 1191 1.1 mrg 1192 1.1.1.2 mrg /* From a bug reported by Joseph S. Myers 1193 1.1.1.2 mrg https://sympa.inria.fr/sympa/arc/mpfr/2012-08/msg00005.html */ 1194 1.1.1.2 mrg static void 1195 1.1.1.2 mrg bug20120814 (void) 1196 1.1.1.2 mrg { 1197 1.1.1.2 mrg mpfr_exp_t emin = -30, e; 1198 1.1.1.2 mrg mpfr_t x, y; 1199 1.1.1.2 mrg int r; 1200 1.1.1.2 mrg char s[64], *p; 1201 1.1.1.2 mrg 1202 1.1.1.2 mrg mpfr_init2 (x, 2); 1203 1.1.1.2 mrg mpfr_set_ui_2exp (x, 3, emin - 2, MPFR_RNDN); 1204 1.1.1.2 mrg mpfr_get_str (s + 1, &e, 10, 19, x, MPFR_RNDD); 1205 1.1.1.2 mrg s[0] = s[1]; 1206 1.1.1.2 mrg s[1] = '.'; 1207 1.1.1.2 mrg for (p = s; *p != 0; p++) ; 1208 1.1.1.2 mrg *p = 'e'; 1209 1.1.1.2 mrg sprintf (p + 1, "%d", (int) e - 1); 1210 1.1.1.2 mrg 1211 1.1.1.2 mrg mpfr_init2 (y, 4); 1212 1.1.1.2 mrg r = mpfr_strtofr (y, s, NULL, 0, MPFR_RNDN); 1213 1.1.1.2 mrg if (r <= 0 || ! mpfr_equal_p (x, y)) 1214 1.1.1.2 mrg { 1215 1.1.1.2 mrg printf ("Error in bug20120814\n"); 1216 1.1.1.2 mrg printf ("mpfr_strtofr failed on string \"%s\"\n", s); 1217 1.1.1.2 mrg printf ("Expected inex > 0 and y = 0.1100E%d\n", (int) emin); 1218 1.1.1.2 mrg printf ("Got inex = %-6d and y = ", r); 1219 1.1.1.2 mrg mpfr_dump (y); 1220 1.1.1.2 mrg exit (1); 1221 1.1.1.2 mrg } 1222 1.1.1.2 mrg 1223 1.1.1.2 mrg mpfr_clear (x); 1224 1.1.1.2 mrg mpfr_clear (y); 1225 1.1.1.2 mrg } 1226 1.1.1.2 mrg 1227 1.1.1.2 mrg static void 1228 1.1.1.2 mrg bug20120829 (void) 1229 1.1.1.2 mrg { 1230 1.1.1.2 mrg mpfr_t x1, x2, e; 1231 1.1.1.2 mrg int inex1, inex2, i, r; 1232 1.1.1.2 mrg char s[48] = "1e-1"; 1233 1.1.1.2 mrg 1234 1.1.1.2 mrg mpfr_init2 (e, 128); 1235 1.1.1.2 mrg mpfr_inits2 (4, x1, x2, (mpfr_ptr) 0); 1236 1.1.1.2 mrg 1237 1.1.1.2 mrg inex1 = mpfr_set_si (e, -1, MPFR_RNDN); 1238 1.1.1.2 mrg MPFR_ASSERTN (inex1 == 0); 1239 1.1.1.2 mrg 1240 1.1.1.2 mrg for (i = 1; i <= sizeof(s) - 5; i++) 1241 1.1.1.2 mrg { 1242 1.1.1.2 mrg s[3+i] = '0'; 1243 1.1.1.2 mrg s[4+i] = 0; 1244 1.1.1.2 mrg inex1 = mpfr_mul_ui (e, e, 10, MPFR_RNDN); 1245 1.1.1.2 mrg MPFR_ASSERTN (inex1 == 0); 1246 1.1.1.4 mrg RND_LOOP_NO_RNDF (r) 1247 1.1.1.2 mrg { 1248 1.1.1.2 mrg mpfr_rnd_t rnd = (mpfr_rnd_t) r; 1249 1.1.1.2 mrg 1250 1.1.1.2 mrg inex1 = mpfr_exp10 (x1, e, rnd); 1251 1.1.1.4 mrg inex1 = VSIGN (inex1); 1252 1.1.1.2 mrg inex2 = mpfr_strtofr (x2, s, NULL, 0, rnd); 1253 1.1.1.4 mrg inex2 = VSIGN (inex2); 1254 1.1.1.2 mrg /* On 32-bit machines, for i = 7, r8389, r8391 and r8394 do: 1255 1.1.1.2 mrg strtofr.c:...: MPFR assertion failed: cy == 0 1256 1.1.1.2 mrg r8396 is OK. 1257 1.1.1.2 mrg On 64-bit machines, for i = 15, 1258 1.1.1.2 mrg r8389 does: strtofr.c:678: MPFR assertion failed: err < (64 - 0) 1259 1.1.1.2 mrg r8391 does: strtofr.c:680: MPFR assertion failed: h < ysize 1260 1.1.1.2 mrg r8394 and r8396 are OK. 1261 1.1.1.2 mrg */ 1262 1.1.1.2 mrg if (! mpfr_equal_p (x1, x2) || inex1 != inex2) 1263 1.1.1.2 mrg { 1264 1.1.1.2 mrg printf ("Error in bug20120829 for i = %d, rnd = %s\n", 1265 1.1.1.2 mrg i, mpfr_print_rnd_mode (rnd)); 1266 1.1.1.2 mrg printf ("Expected inex = %d, x = ", inex1); 1267 1.1.1.2 mrg mpfr_dump (x1); 1268 1.1.1.2 mrg printf ("Got inex = %d, x = ", inex2); 1269 1.1.1.2 mrg mpfr_dump (x2); 1270 1.1.1.2 mrg exit (1); 1271 1.1.1.2 mrg } 1272 1.1.1.2 mrg } 1273 1.1.1.2 mrg } 1274 1.1.1.2 mrg 1275 1.1.1.2 mrg mpfr_clears (e, x1, x2, (mpfr_ptr) 0); 1276 1.1.1.2 mrg } 1277 1.1.1.2 mrg 1278 1.1.1.4 mrg /* https://sympa.inria.fr/sympa/arc/mpfr/2016-12/msg00043.html 1279 1.1.1.4 mrg mpfr_strtofr can return an incorrect ternary value. 1280 1.1.1.4 mrg Note: As a consequence, the value can also be incorrect if the current 1281 1.1.1.4 mrg exponent range is not the maximum one (since the ternary value is used 1282 1.1.1.4 mrg to resolve double rounding in mpfr_check_range); this can happen only 1283 1.1.1.4 mrg if the value is a midpoint between 0 and the minimum positive number 1284 1.1.1.4 mrg or the opposite. */ 1285 1.1.1.4 mrg static void 1286 1.1.1.4 mrg bug20161217 (void) 1287 1.1.1.4 mrg { 1288 1.1.1.4 mrg mpfr_t fp, z; 1289 1.1.1.4 mrg static const char * num = "0.1387778780781445675529539585113525390625e31"; 1290 1.1.1.4 mrg /* The above number is 5^47/2^9. */ 1291 1.1.1.4 mrg int inex; 1292 1.1.1.4 mrg 1293 1.1.1.4 mrg mpfr_init2 (fp, 110); 1294 1.1.1.4 mrg mpfr_init2 (z, 110); 1295 1.1.1.4 mrg 1296 1.1.1.4 mrg inex = mpfr_strtofr (fp, num, NULL, 10, MPFR_RNDN); 1297 1.1.1.4 mrg MPFR_ASSERTN(inex == 0); 1298 1.1.1.4 mrg mpfr_set_str_binary (z, "10001100001000010011110110011101101001010000001011011110010001010100010100100110111101000010001011001100001101E-9"); 1299 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (fp, z)); 1300 1.1.1.4 mrg 1301 1.1.1.4 mrg /* try with 109 bits */ 1302 1.1.1.4 mrg mpfr_set_prec (fp, 109); 1303 1.1.1.4 mrg inex = mpfr_strtofr (fp, num, NULL, 10, MPFR_RNDN); 1304 1.1.1.4 mrg MPFR_ASSERTN(inex < 0); 1305 1.1.1.4 mrg mpfr_set_str_binary (z, "10001100001000010011110110011101101001010000001011011110010001010100010100100110111101000010001011001100001100E-9"); 1306 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (fp, z)); 1307 1.1.1.4 mrg 1308 1.1.1.4 mrg mpfr_clear (fp); 1309 1.1.1.4 mrg mpfr_clear (z); 1310 1.1.1.4 mrg } 1311 1.1.1.4 mrg 1312 1.1.1.4 mrg /* check bug in MPFR 3.1.5 is fixed: cf 1313 1.1.1.4 mrg https://sympa.inria.fr/sympa/arc/mpfr/2017-03/msg00009.html 1314 1.1.1.4 mrg Note: same bug as bug20161217. See also the comments of bug20161217; 1315 1.1.1.4 mrg here, this is a case where the value is incorrect. */ 1316 1.1.1.4 mrg static void 1317 1.1.1.4 mrg bug20170308 (void) 1318 1.1.1.4 mrg { 1319 1.1.1.4 mrg mpfr_exp_t emin; 1320 1.1.1.4 mrg /* the following is slightly larger than 2^-1075, thus should be rounded 1321 1.1.1.4 mrg to 0.5*2^-1074, with ternary value < 0 */ 1322 1.1.1.4 mrg char str[] = "2.47032822920623272089E-324"; 1323 1.1.1.4 mrg mpfr_t z; 1324 1.1.1.4 mrg int inex; 1325 1.1.1.4 mrg 1326 1.1.1.4 mrg emin = mpfr_get_emin (); 1327 1.1.1.4 mrg mpfr_init2 (z, 53); 1328 1.1.1.6 mrg set_emin (-1073); 1329 1.1.1.5 mrg /* with emin = -1073, the smallest positive number is 0.5*2^emin = 2^(-1074), 1330 1.1.1.5 mrg thus str should be rounded to 2^(-1074) with inex > 0 */ 1331 1.1.1.5 mrg inex = mpfr_strtofr (z, str, NULL, 10, MPFR_RNDN); 1332 1.1.1.5 mrg MPFR_ASSERTN(inex > 0 && mpfr_cmp_ui_2exp (z, 1, -1074) == 0); 1333 1.1.1.6 mrg set_emin (-1074); 1334 1.1.1.5 mrg /* with emin = -1074, str should be rounded to 2^(-1075) with inex < 0 */ 1335 1.1.1.4 mrg inex = mpfr_strtofr (z, str, NULL, 10, MPFR_RNDN); 1336 1.1.1.4 mrg MPFR_ASSERTN(inex < 0 && mpfr_cmp_ui_2exp (z, 1, -1075) == 0); 1337 1.1.1.4 mrg mpfr_clear (z); 1338 1.1.1.6 mrg set_emin (emin); 1339 1.1.1.5 mrg } 1340 1.1.1.5 mrg 1341 1.1.1.5 mrg /* r13299 fails with 8-bit limbs (micro-gmp/8). */ 1342 1.1.1.5 mrg static void 1343 1.1.1.5 mrg bug20181127 (void) 1344 1.1.1.5 mrg { 1345 1.1.1.5 mrg char s[] = "9.Z6nrLVSMG1bDcCF2ONJdX@-183295525"; /* base 58 */ 1346 1.1.1.5 mrg mpfr_t x, y; 1347 1.1.1.5 mrg 1348 1.1.1.5 mrg mpfr_inits2 (6, x, y, (mpfr_ptr) 0); 1349 1.1.1.5 mrg mpfr_set_ui_2exp (x, 5, -1073741701, MPFR_RNDN); 1350 1.1.1.5 mrg mpfr_strtofr (y, s, NULL, 58, MPFR_RNDZ); 1351 1.1.1.5 mrg if (! mpfr_equal_p (x, y)) 1352 1.1.1.5 mrg { 1353 1.1.1.5 mrg printf ("Error in bug20181127 on %s (base 58)\n", s); 1354 1.1.1.5 mrg printf ("Expected x = "); 1355 1.1.1.5 mrg mpfr_dump (x); 1356 1.1.1.5 mrg printf ("Got y = "); 1357 1.1.1.5 mrg mpfr_dump (y); 1358 1.1.1.5 mrg printf ("*Note* In base 58, x ~= "); 1359 1.1.1.5 mrg mpfr_out_str (stdout, 58, 8, x, MPFR_RNDN); 1360 1.1.1.5 mrg printf ("\n"); 1361 1.1.1.5 mrg exit (1); 1362 1.1.1.5 mrg } 1363 1.1.1.5 mrg mpfr_clears (x, y, (mpfr_ptr) 0); 1364 1.1.1.5 mrg } 1365 1.1.1.5 mrg 1366 1.1.1.7 mrg /* Bug reported by Michael Jones (case i = 0 below) 1367 1.1.1.7 mrg https://sympa.inria.fr/sympa/arc/mpfr/2023-06/msg00000.html 1368 1.1.1.7 mrg This yields an integer overflow -LONG_MIN. The result might still 1369 1.1.1.7 mrg be correct, but a runtime error is obtained with an UB sanitizer: 1370 1.1.1.7 mrg strtofr.c:745:11: runtime error: negation of -9223372036854775808 [...] 1371 1.1.1.7 mrg Details after an analysis: 1372 1.1.1.7 mrg With GCC 4.9.4 and tcc, one gets an assertion failure: 1373 1.1.1.7 mrg mpn_exp.c:94: MPFR assertion failed: e > 0 1374 1.1.1.7 mrg And if all assertions are disabled with 1375 1.1.1.7 mrg ./configure --enable-assert=none CC=gcc-4.9 1376 1.1.1.7 mrg one gets an incorrect result: 1377 1.1.1.7 mrg Error in bug20230606 for i = 0 1378 1.1.1.7 mrg Expected x = 0 1379 1.1.1.7 mrg Got x = 0.11001100110011001E-3 1380 1.1.1.7 mrg This issue is not visible with GCC 8.4.0 and later, even with -O0, 1381 1.1.1.7 mrg because GCC now transforms "-X >= 0" to "X <= 0" (which is valid 1382 1.1.1.7 mrg under the ISO C rules). Note that such an optimization generally 1383 1.1.1.7 mrg makes buggy code (which assumes "wrapping") fail; here, it makes 1384 1.1.1.7 mrg the bug invisible! 1385 1.1.1.7 mrg 1386 1.1.1.7 mrg Case i = 1 should be identical. 1387 1.1.1.7 mrg 1388 1.1.1.7 mrg Case i = 2 shows another bug (probably with all compilers): 1389 1.1.1.7 mrg Error in bug20230606 for i = 2 1390 1.1.1.7 mrg Expected x = 0 1391 1.1.1.7 mrg Got x = 0.11111111111111111E1073741823 1392 1.1.1.7 mrg or with an UB sanitizer: 1393 1.1.1.7 mrg strtofr.c:428:19: runtime error: signed integer overflow: [...] 1394 1.1.1.7 mrg This is the bug mentioned at 1395 1.1.1.7 mrg https://sympa.inria.fr/sympa/arc/mpfr/2023-06/msg00001.html 1396 1.1.1.7 mrg */ 1397 1.1.1.7 mrg static void 1398 1.1.1.7 mrg bug20230606 (void) 1399 1.1.1.7 mrg { 1400 1.1.1.7 mrg const char *const s[] = { 1401 1.1.1.7 mrg "0.1E-99999999999999999999", 1402 1.1.1.7 mrg ".1E-99999999999999999999", 1403 1.1.1.7 mrg ".01E-99999999999999999999" }; 1404 1.1.1.7 mrg mpfr_t x; 1405 1.1.1.7 mrg int i; 1406 1.1.1.7 mrg 1407 1.1.1.7 mrg mpfr_init2 (x, 17); 1408 1.1.1.7 mrg for (i = 0; i < numberof (s); i++) 1409 1.1.1.7 mrg { 1410 1.1.1.7 mrg mpfr_strtofr (x, s[i], NULL, 10, MPFR_RNDZ); 1411 1.1.1.7 mrg if (!mpfr_zero_p (x) || mpfr_signbit (x) != 0) 1412 1.1.1.7 mrg { 1413 1.1.1.7 mrg printf ("Error in bug20230606 for i = %d\n", i); 1414 1.1.1.7 mrg printf ("Expected x = 0\n"); 1415 1.1.1.7 mrg printf ("Got x = "); 1416 1.1.1.7 mrg mpfr_dump (x); 1417 1.1.1.7 mrg exit (1); 1418 1.1.1.7 mrg } 1419 1.1.1.7 mrg } 1420 1.1.1.7 mrg mpfr_clear (x); 1421 1.1.1.7 mrg } 1422 1.1.1.7 mrg 1423 1.1.1.5 mrg static void 1424 1.1.1.5 mrg coverage (void) 1425 1.1.1.5 mrg { 1426 1.1.1.5 mrg #if _MPFR_EXP_FORMAT >= 3 && _MPFR_PREC_FORMAT == 3 && MPFR_PREC_BITS == 64 1427 1.1.1.5 mrg char str3[] = "1@-2112009130072406892"; 1428 1.1.1.5 mrg char str31[] = "1@-511170973314085831"; 1429 1.1.1.5 mrg mpfr_t x; 1430 1.1.1.5 mrg int inex; 1431 1.1.1.5 mrg mpfr_exp_t emin; 1432 1.1.1.5 mrg 1433 1.1.1.5 mrg /* exercise assertion cy == 0 around line 698 of strtofr.c */ 1434 1.1.1.5 mrg emin = mpfr_get_emin (); 1435 1.1.1.6 mrg set_emin (mpfr_get_emin_min ()); 1436 1.1.1.5 mrg /* emin = -4611686018427387903 on a 64-bit machine */ 1437 1.1.1.5 mrg mpfr_init2 (x, 1); 1438 1.1.1.5 mrg inex = mpfr_strtofr (x, str3, NULL, 3, MPFR_RNDN); 1439 1.1.1.5 mrg /* 3^-2112009130072406892 is slightly larger than (2^64)^-52303988630398057 1440 1.1.1.5 mrg thus we should get inex < 0 */ 1441 1.1.1.5 mrg MPFR_ASSERTN(inex < 0); 1442 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (x, 1, -52303988630398057 * 64) == 0); 1443 1.1.1.5 mrg inex = mpfr_strtofr (x, str31, NULL, 31, MPFR_RNDN); 1444 1.1.1.5 mrg /* 31^-511170973314085831 is slightly smaller than (2^64)^-39569396093273623 1445 1.1.1.5 mrg thus we should get inex > 0 */ 1446 1.1.1.5 mrg MPFR_ASSERTN(inex > 0); 1447 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (x, 1, -39569396093273623 * 64) == 0); 1448 1.1.1.5 mrg mpfr_clear (x); 1449 1.1.1.6 mrg set_emin (emin); 1450 1.1.1.5 mrg #endif 1451 1.1.1.5 mrg } 1452 1.1.1.5 mrg 1453 1.1.1.5 mrg #define BSIZE 512 1454 1.1.1.5 mrg 1455 1.1.1.5 mrg static void 1456 1.1.1.5 mrg random_tests (void) 1457 1.1.1.5 mrg { 1458 1.1.1.5 mrg char s0[BSIZE], s1[BSIZE], s2[BSIZE+64]; 1459 1.1.1.5 mrg mpfr_t x0, x1, x2; 1460 1.1.1.5 mrg int prec, i; 1461 1.1.1.5 mrg 1462 1.1.1.5 mrg for (prec = MPFR_PREC_MIN; prec < 300; prec++) 1463 1.1.1.5 mrg { 1464 1.1.1.5 mrg mpfr_inits2 (prec, x0, x1, x2, (mpfr_ptr) 0); 1465 1.1.1.5 mrg 1466 1.1.1.5 mrg for (i = 0; i < 20; i++) 1467 1.1.1.5 mrg { 1468 1.1.1.5 mrg const char *num_to_text; 1469 1.1.1.5 mrg mpfr_exp_t e0, e1; 1470 1.1.1.5 mrg int base, j, k, neg; 1471 1.1.1.5 mrg int noteq = 0; 1472 1.1.1.5 mrg char d; 1473 1.1.1.5 mrg 1474 1.1.1.5 mrg /* We want the same exponent for x0 and its successor x1. 1475 1.1.1.5 mrg This is not possible for precision 1 in base 2. */ 1476 1.1.1.5 mrg do 1477 1.1.1.5 mrg base = 2 + (randlimb () % 61); 1478 1.1.1.5 mrg while (prec == 1 && base == 2); 1479 1.1.1.5 mrg 1480 1.1.1.5 mrg num_to_text = base <= 36 ? num_to_text36 : num_to_text62; 1481 1.1.1.5 mrg 1482 1.1.1.5 mrg do 1483 1.1.1.5 mrg { 1484 1.1.1.5 mrg /* Let's consider only positive numbers. We should test 1485 1.1.1.5 mrg negative numbers, but they should be built later, just 1486 1.1.1.5 mrg for the test itself. */ 1487 1.1.1.5 mrg tests_default_random (x0, 0, 1488 1.1.1.5 mrg mpfr_get_emin (), mpfr_get_emax (), 1); 1489 1.1.1.5 mrg mpfr_set (x1, x0, MPFR_RNDN); 1490 1.1.1.5 mrg mpfr_nextabove (x1); 1491 1.1.1.5 mrg mpfr_get_str (s0, &e0, base, BSIZE - 1, x0, MPFR_RNDU); 1492 1.1.1.5 mrg mpfr_get_str (s1, &e1, base, BSIZE - 1, x1, MPFR_RNDD); 1493 1.1.1.5 mrg } 1494 1.1.1.5 mrg while (! (mpfr_regular_p (x0) && mpfr_regular_p (x1) && e0 == e1)); 1495 1.1.1.5 mrg 1496 1.1.1.5 mrg /* 0 < x0 <= (s0,e) <= (s1,e) <= x1 with e = e0 = e1. 1497 1.1.1.5 mrg Let's build a string s2 randomly formed by: 1498 1.1.1.5 mrg - the common prefix of s0 and s1; 1499 1.1.1.5 mrg - some of the following digits of s0 (possibly none); 1500 1.1.1.5 mrg - the next digit of s0 + 1; 1501 1.1.1.5 mrg - some of the following digits of s1 (possibly none). 1502 1.1.1.5 mrg Then 0 < x0 <= (s0,e) < (s2,e) <= (s1,e) <= x1, and with 1503 1.1.1.5 mrg a very high probability that (s2,e) < (s1,e); noteq is 1504 1.1.1.5 mrg set to true in this case. 1505 1.1.1.5 mrg For instance, if: 1506 1.1.1.5 mrg s0 = 123456789 1507 1.1.1.5 mrg s1 = 124012345 1508 1.1.1.5 mrg one can have, e.g.: 1509 1.1.1.5 mrg s2 = 12345734 1510 1.1.1.5 mrg s2 = 123556789 1511 1.1.1.5 mrg s2 = 124 1512 1.1.1.5 mrg s2 = 124012 1513 1.1.1.5 mrg s2 is not taken completely randomly between s0 and s1, but it 1514 1.1.1.5 mrg will be built rather easily, and with the randomness of x0, 1515 1.1.1.5 mrg we should cover all cases, with s2 very close to s0, s2 very 1516 1.1.1.5 mrg close to s1, or not too close to either. */ 1517 1.1.1.5 mrg 1518 1.1.1.6 mrg neg = RAND_BOOL (); 1519 1.1.1.5 mrg s2[0] = neg ? '-' : '+'; 1520 1.1.1.5 mrg s2[1] = '.'; 1521 1.1.1.5 mrg 1522 1.1.1.5 mrg for (j = 0; 1523 1.1.1.5 mrg MPFR_ASSERTN (s0[j] != 0 && s1[j] != 0), s0[j] == s1[j]; 1524 1.1.1.5 mrg j++) 1525 1.1.1.5 mrg s2[j+2] = s0[j]; 1526 1.1.1.5 mrg 1527 1.1.1.5 mrg /* k is the position of the first differing digit. */ 1528 1.1.1.5 mrg k = j; 1529 1.1.1.5 mrg 1530 1.1.1.5 mrg while (j < BSIZE - 2 && randlimb () % 8 != 0) 1531 1.1.1.5 mrg { 1532 1.1.1.5 mrg MPFR_ASSERTN (s0[j] != 0); 1533 1.1.1.5 mrg s2[j+2] = s0[j]; 1534 1.1.1.5 mrg j++; 1535 1.1.1.5 mrg } 1536 1.1.1.5 mrg 1537 1.1.1.5 mrg MPFR_ASSERTN (s0[j] != 0); 1538 1.1.1.5 mrg /* We will increment the next digit. Thus while s0[j] is the 1539 1.1.1.5 mrg maximum digit, go back until this is no longer the case 1540 1.1.1.5 mrg (the first digit after the common prefix cannot be the 1541 1.1.1.5 mrg maximum digit, so that we will stop early enough). */ 1542 1.1.1.5 mrg while ((d = s0[j]) == num_to_text[base - 1]) 1543 1.1.1.5 mrg j--; 1544 1.1.1.5 mrg noteq = j != k; 1545 1.1.1.5 mrg s2[j+2] = d = *(strchr (num_to_text, d) + 1); 1546 1.1.1.5 mrg if (d != s1[j]) 1547 1.1.1.5 mrg noteq = 1; 1548 1.1.1.5 mrg j++; 1549 1.1.1.5 mrg 1550 1.1.1.5 mrg while (j < BSIZE - 1 && randlimb () % 8 != 0) 1551 1.1.1.5 mrg { 1552 1.1.1.5 mrg MPFR_ASSERTN (s1[j] != 0); 1553 1.1.1.5 mrg s2[j+2] = s1[j]; 1554 1.1.1.5 mrg j++; 1555 1.1.1.5 mrg } 1556 1.1.1.5 mrg 1557 1.1.1.5 mrg sprintf (s2 + (j+2), "@%" MPFR_EXP_FSPEC "d", (mpfr_eexp_t) e0); 1558 1.1.1.5 mrg 1559 1.1.1.5 mrg while (noteq == 0 && j < BSIZE - 1) 1560 1.1.1.5 mrg { 1561 1.1.1.5 mrg if (s1[j] != '0') 1562 1.1.1.5 mrg noteq = 1; 1563 1.1.1.5 mrg j++; 1564 1.1.1.5 mrg } 1565 1.1.1.5 mrg 1566 1.1.1.5 mrg if (neg) 1567 1.1.1.5 mrg { 1568 1.1.1.5 mrg mpfr_neg (x0, x0, MPFR_RNDN); 1569 1.1.1.5 mrg mpfr_neg (x1, x1, MPFR_RNDN); 1570 1.1.1.5 mrg } 1571 1.1.1.5 mrg 1572 1.1.1.5 mrg if (noteq) 1573 1.1.1.5 mrg { 1574 1.1.1.5 mrg mpfr_strtofr (x2, s2, NULL, base, MPFR_RNDZ); 1575 1.1.1.5 mrg if (! mpfr_equal_p (x2, x0)) 1576 1.1.1.5 mrg { 1577 1.1.1.5 mrg printf ("Error in random_tests for prec=%d i=%d base=%d\n", 1578 1.1.1.5 mrg prec, i, base); 1579 1.1.1.5 mrg printf ("s0 = %s\ns1 = %s\ns2 = %s\n", s0, s1, s2); 1580 1.1.1.5 mrg printf ("x0 = "); 1581 1.1.1.5 mrg mpfr_dump (x0); 1582 1.1.1.5 mrg printf ("x2 = "); 1583 1.1.1.5 mrg mpfr_dump (x2); 1584 1.1.1.5 mrg exit (1); 1585 1.1.1.5 mrg } 1586 1.1.1.5 mrg } 1587 1.1.1.5 mrg 1588 1.1.1.5 mrg mpfr_strtofr (x2, s2, NULL, base, MPFR_RNDA); 1589 1.1.1.5 mrg if (! mpfr_equal_p (x2, x1)) 1590 1.1.1.5 mrg { 1591 1.1.1.5 mrg printf ("Error in random_tests for prec=%d i=%d base=%d\n", 1592 1.1.1.5 mrg prec, i, base); 1593 1.1.1.5 mrg printf ("s0 = %s\ns1 = %s\ns2 = %s\n", s0, s1, s2); 1594 1.1.1.5 mrg printf ("x1 = "); 1595 1.1.1.5 mrg mpfr_dump (x1); 1596 1.1.1.5 mrg printf ("x2 = "); 1597 1.1.1.5 mrg mpfr_dump (x2); 1598 1.1.1.5 mrg exit (1); 1599 1.1.1.5 mrg } 1600 1.1.1.5 mrg } 1601 1.1.1.5 mrg mpfr_clears (x0, x1, x2, (mpfr_ptr) 0); 1602 1.1.1.5 mrg } 1603 1.1.1.4 mrg } 1604 1.1.1.4 mrg 1605 1.1 mrg int 1606 1.1 mrg main (int argc, char *argv[]) 1607 1.1 mrg { 1608 1.1 mrg tests_start_mpfr (); 1609 1.1 mrg 1610 1.1.1.5 mrg coverage (); 1611 1.1 mrg check_special(); 1612 1.1 mrg check_reftable (); 1613 1.1 mrg check_parse (); 1614 1.1 mrg check_overflow (); 1615 1.1 mrg check_retval (); 1616 1.1 mrg bug20081028 (); 1617 1.1 mrg test20100310 (); 1618 1.1.1.2 mrg bug20120814 (); 1619 1.1.1.2 mrg bug20120829 (); 1620 1.1.1.4 mrg bug20161217 (); 1621 1.1.1.4 mrg bug20170308 (); 1622 1.1.1.5 mrg bug20181127 (); 1623 1.1.1.7 mrg bug20230606 (); 1624 1.1.1.5 mrg random_tests (); 1625 1.1 mrg 1626 1.1 mrg tests_end_mpfr (); 1627 1.1 mrg return 0; 1628 1.1 mrg } 1629