1/* Test file for mpfr_get_str. 2 3Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4Contributed by the Arenaire and Cacao projects, INRIA. 5 6This file is part of the GNU MPFR Library. 7 8The GNU MPFR Library is free software; you can redistribute it and/or modify 9it under the terms of the GNU Lesser General Public License as published by 10the Free Software Foundation; either version 3 of the License, or (at your 11option) any later version. 12 13The GNU MPFR Library is distributed in the hope that it will be useful, but 14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16License for more details. 17 18You should have received a copy of the GNU Lesser General Public License 19along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23#include <stdlib.h> 24 25#include "mpfr-test.h" 26 27static void 28check3 (char *d, mpfr_rnd_t rnd, char *res) 29{ 30 mpfr_t x; 31 char *str; 32 mpfr_exp_t e; 33 34 mpfr_init2 (x, 53); 35 mpfr_set_str (x, d, 10, rnd); 36 str = mpfr_get_str (NULL, &e, 10, 5, x, rnd); 37 if (strcmp (str, res)) 38 { 39 printf ("Error in mpfr_get_str for x=%s\n", d); 40 printf ("got %s instead of %s\n", str, res); 41 exit (1); 42 } 43 mpfr_clear (x); 44 mpfr_free_str (str); 45} 46 47static void 48check_small (void) 49{ 50 mpfr_t x; 51 char *s; 52 mpfr_exp_t e; 53 mpfr_prec_t p; 54 55 mpfr_init (x); 56 57 mpfr_set_prec (x, 20); 58 mpfr_set_ui (x, 2, MPFR_RNDN); 59 mpfr_nexttozero (x); 60 s = mpfr_get_str (NULL, &e, 4, 2, x, MPFR_RNDU); 61 if (strcmp (s, "20") || (e != 1)) 62 { 63 printf ("Error in mpfr_get_str: 2- rounded up with 2 digits" 64 " in base 4\n"); 65 exit (1); 66 } 67 mpfr_free_str (s); 68 69 /* check n_digits=0 */ 70 mpfr_set_prec (x, 5); 71 mpfr_set_ui (x, 17, MPFR_RNDN); 72 s = mpfr_get_str (NULL, &e, 3, 0, x, MPFR_RNDN); 73 mpfr_free_str (s); 74 s = mpfr_get_str (NULL, &e, 36, 0, x, MPFR_RNDN); 75 mpfr_free_str (s); 76 s = mpfr_get_str (NULL, &e, 62, 0, x, MPFR_RNDN); 77 mpfr_free_str (s); 78 79 mpfr_set_prec (x, 64); 80 mpfr_set_si (x, -1, MPFR_RNDN); 81 mpfr_div_2exp (x, x, 63, MPFR_RNDN); /* x = -2^(-63) */ 82 mpfr_add_ui (x, x, 1, MPFR_RNDN); /* x = 1 - 2^(-63) */ 83 mpfr_mul_2exp (x, x, 32, MPFR_RNDN); /* x = 2^32 - 2^(-31) */ 84 s = mpfr_get_str (NULL, &e, 3, 21, x, MPFR_RNDU); 85 if (strcmp (s, "102002022201221111211") || (e != 21)) 86 { 87 printf ("Error in mpfr_get_str: 2^32-2^(-31) rounded up with" 88 " 21 digits in base 3\n"); 89 exit (1); 90 } 91 mpfr_free_str (s); 92 s = mpfr_get_str (NULL, &e, 3, 20, x, MPFR_RNDU); 93 if (strcmp (s, "10200202220122111122") || (e != 21)) 94 { 95 printf ("Error in mpfr_get_str: 2^32-2^(-31) rounded up with" 96 " 20 digits in base 3\n"); 97 exit (1); 98 } 99 mpfr_free_str (s); 100 101 /* check corner case ret!=0, j0!=0 in mpfr_get_str_aux */ 102 mpfr_set_prec (x, 100); 103 mpfr_set_str_binary (x, "0.1001011111010001101110010101010101111001010111111101101101100110100011110110000101110110001011110000E-9"); 104 s = mpfr_get_str (NULL, &e, 3, 2, x, MPFR_RNDU); 105 if (strcmp (s, "22") || (e != -6)) 106 { 107 printf ("Error in mpfr_get_str: 100-bit number rounded up with" 108 " 2 digits in base 3\n"); 109 exit (1); 110 } 111 mpfr_free_str (s); 112 113 /* check corner case exact=0 in mpfr_get_str_aux */ 114 mpfr_set_prec (x, 100); 115 mpfr_set_str_binary (x, "0.1001001111101101111000101000110111111010101100000110010001111111011001101011101100001100110000000000E8"); 116 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDZ); 117 if (strcmp (s, "14") || (e != 3)) 118 { 119 printf ("Error in mpfr_get_str: 100-bit number rounded to zero with" 120 " 2 digits in base 10\n"); 121 exit (1); 122 } 123 mpfr_free_str (s); 124 125 for (p=4; p<=200; p++) 126 { 127 mpfr_set_prec (x, p); 128 mpfr_set_str (x, "6.5", 10, MPFR_RNDN); 129 130 s = mpfr_get_str (NULL, &e, 6, 2, x, MPFR_RNDN); 131 if (strcmp (s, "10") || (e != 2)) 132 { 133 printf ("Error in mpfr_get_str: 6.5 rounded to nearest with" 134 " 2 digits in base 6\n"); 135 exit (1); 136 } 137 mpfr_free_str (s); 138 139 mpfr_nexttoinf (x); 140 s = mpfr_get_str (NULL, &e, 6, 2, x, MPFR_RNDN); 141 if (strcmp (s, "11") || (e != 2)) 142 { 143 printf ("Error in mpfr_get_str: 6.5+ rounded to nearest with" 144 " 2 digits in base 6\ngot %se%d instead of 11e2\n", 145 s, (int) e); 146 exit (1); 147 } 148 mpfr_free_str (s); 149 150 mpfr_set_str (x, "6.5", 10, MPFR_RNDN); 151 mpfr_nexttozero (x); 152 s = mpfr_get_str (NULL, &e, 6, 2, x, MPFR_RNDN); 153 if (strcmp (s, "10") || (e != 2)) 154 { 155 printf ("Error in mpfr_get_str: 6.5- rounded to nearest with" 156 " 2 digits in base 6\n"); 157 exit (1); 158 } 159 mpfr_free_str (s); 160 } 161 162 mpfr_set_prec (x, 3); 163 mpfr_set_ui (x, 7, MPFR_RNDN); 164 s = mpfr_get_str (NULL, &e, 2, 2, x, MPFR_RNDU); 165 if (strcmp (s, "10") || (e != 4)) 166 { 167 printf ("Error in mpfr_get_str: 7 rounded up with 2 bits should" 168 " give 0.10e3 instead of 0.%s*2^%d\n", s, (int) e); 169 exit (1); 170 } 171 mpfr_free_str (s); 172 173 /* problem found by Fabrice Rouillier */ 174 mpfr_set_prec (x, 63); 175 mpfr_set_str (x, "5e14", 10, MPFR_RNDN); 176 s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDU); 177 mpfr_free_str (s); 178 179 /* bug found by Johan Vervloet */ 180 mpfr_set_prec (x, 6); 181 mpfr_set_str (x, "688.0", 10, MPFR_RNDN); 182 s = mpfr_get_str (NULL, &e, 2, 4, x, MPFR_RNDU); 183 if (strcmp (s, "1011") || (e != 10)) 184 { 185 printf ("Error in mpfr_get_str: 688 printed up to 4 bits should" 186 " give 1.011e9\ninstead of "); 187 mpfr_out_str (stdout, 2, 4, x, MPFR_RNDU); 188 puts (""); 189 exit (1); 190 } 191 mpfr_free_str (s); 192 193 mpfr_set_prec (x, 38); 194 mpfr_set_str_binary (x, "1.0001110111110100011010100010010100110e-6"); 195 s = mpfr_get_str (NULL, &e, 8, 10, x, MPFR_RNDU); 196 if (strcmp (s, "1073721522") || (e != -1)) 197 { 198 printf ("Error in mpfr_get_str (3): s=%s e=%d\n", s, (int) e); 199 exit (1); 200 } 201 mpfr_free_str (s); 202 203 mpfr_set_prec (x, 53); 204 mpfr_set_str_binary (x, "0.11010111011101100010000100010101110001000000010111001E454"); 205 s = mpfr_get_str (NULL, &e, 19, 12, x, MPFR_RNDU); 206 if (strcmp (s, "b1cgfa4gha0h") || (e != 107)) 207 { 208 printf ("Error in mpfr_get_str (4): s=%s e=%d\n", s, (int) e); 209 exit (1); 210 } 211 mpfr_free_str (s); 212 213 mpfr_set_prec (x, 145); 214 mpfr_set_str_binary (x, "-0.1000110011000001011000010101101010110110101100101110100011111100011110011001001001010000100001000011000011000000010111011001000111101001110100110e6"); 215 s = mpfr_get_str (NULL, &e, 4, 53, x, MPFR_RNDU); 216 if (strcmp (s, "-20303001120111222312230232203330132121021100201003003") || (e != 3)) 217 { 218 printf ("Error in mpfr_get_str (5): s=%s e=%d\n", s, (int) e); 219 exit (1); 220 } 221 mpfr_free_str (s); 222 223 mpfr_set_prec (x, 45); 224 mpfr_set_str_binary (x, "-0.00100111010110010001011001110111010001010010010"); 225 s = mpfr_get_str (NULL, &e, 32, 9, x, MPFR_RNDN); 226 if (strcmp (s, "-4tchctq54") || (e != 0)) 227 { 228 printf ("Error in mpfr_get_str (6): s=%s e=%d\n", s, (int) e); 229 exit (1); 230 } 231 mpfr_free_str (s); 232 233 /* worst case found by Vincent Lefe`vre */ 234 mpfr_set_prec (x, 53); 235 mpfr_set_str_binary (x, "10011110111100000000001011011110101100010000011011111E164"); 236 s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN); 237 if (strcmp (s, "13076622631878654") || (e != 66)) 238 { 239 printf ("Error in mpfr_get_str (7): s=%s e=%d\n", s, (int) e); 240 exit (1); 241 } 242 mpfr_free_str (s); 243 mpfr_set_str_binary (x, "10000001001001001100011101010011011011111000011000100E93"); 244 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU); 245 if (strcmp (s, "46") || e != 44) 246 { 247 printf ("Error in mpfr_get_str (8): s=%s e=%d\n", s, (int) e); 248 exit (1); 249 } 250 mpfr_free_str (s); 251 mpfr_set_str_binary (x, "10010001111100000111001111010101001010000010111010101E55"); 252 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN); 253 if (strcmp (s, "19") || e != 33) 254 { 255 printf ("Error in mpfr_get_str (9): s=%s e=%d\n", s, (int) e); 256 exit (1); 257 } 258 mpfr_free_str (s); 259 mpfr_set_str_binary (x, "11011001010010111110010101101100111110111000010110110E44"); 260 s = mpfr_get_str (NULL, &e, 10, 3, x, MPFR_RNDN); 261 if (strcmp (s, "135") || e != 30) 262 { 263 printf ("Error in mpfr_get_str (10): s=%s e=%d\n", s, (int) e); 264 exit (1); 265 } 266 mpfr_free_str (s); 267 mpfr_set_str_binary (x, "11101111101000001011100001111000011111101111011001100E72"); 268 s = mpfr_get_str (NULL, &e, 10, 4, x, MPFR_RNDN); 269 if (strcmp (s, "3981") || e != 38) 270 { 271 printf ("Error in mpfr_get_str (11): s=%s e=%d\n", s, (int) e); 272 exit (1); 273 } 274 mpfr_free_str (s); 275 mpfr_set_str_binary (x, "10011001001100100010111100001101110101001001111110000E46"); 276 s = mpfr_get_str (NULL, &e, 10, 5, x, MPFR_RNDN); 277 if (strcmp (s, "37930") || e != 30) 278 { 279 printf ("Error in mpfr_get_str (12): s=%s e=%d\n", s, (int) e); 280 exit (1); 281 } 282 mpfr_free_str (s); 283 mpfr_set_str_binary (x, "10001100110111001011011110011011011101100011010001011E-72"); 284 s = mpfr_get_str (NULL, &e, 10, 6, x, MPFR_RNDN); 285 if (strcmp (s, "104950") || e != -5) 286 { 287 printf ("Error in mpfr_get_str (13): s=%s e=%d\n", s, (int) e); 288 exit (1); 289 } 290 mpfr_free_str (s); 291 292 mpfr_set_str_binary (x, "10100100001011001000011001101101000110100110000010111E89"); 293 s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDN); 294 if (strcmp (s, "3575392") || e != 43) 295 { 296 printf ("Error in mpfr_get_str (14): s=%s e=%d\n", s, (int) e); 297 exit (1); 298 } 299 mpfr_free_str (s); 300 301 mpfr_set_str_binary (x, "11000011011110110010100110001010000001010011001011001E-73"); 302 s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDN); 303 if (strcmp (s, "72822386") || e != -6) 304 { 305 printf ("Error in mpfr_get_str (15): s=%s e=%d\n", s, (int) e); 306 exit (1); 307 } 308 mpfr_free_str (s); 309 310 mpfr_set_str_binary (x, "10101010001101000111001100001000100011100010010001010E78"); 311 s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDN); 312 if (strcmp (s, "180992873") || e != 40) 313 { 314 printf ("Error in mpfr_get_str (16): s=%s e=%d\n", s, (int) e); 315 exit (1); 316 } 317 mpfr_free_str (s); 318 319 mpfr_set_str_binary (x, "10110111001000100000001101111001100101101110011011101E91"); 320 s = mpfr_get_str (NULL, &e, 10, 10, x, MPFR_RNDN); 321 if (strcmp (s, "1595312255") || e != 44) 322 { 323 printf ("Error in mpfr_get_str (17): s=%s e=%d\n", s, (int) e); 324 exit (1); 325 } 326 mpfr_free_str (s); 327 mpfr_set_str_binary (x, "10011101010111101111000100111011101011110100110110101E93"); 328 s = mpfr_get_str (NULL, &e, 10, 11, x, MPFR_RNDN); 329 if (strcmp (s, "54835744350") || e != 44) 330 { 331 printf ("Error in mpfr_get_str (18): s=%s e=%d\n", s, (int) e); 332 exit (1); 333 } 334 mpfr_free_str (s); 335 mpfr_set_str_binary (x, "10011101010111101111000100111011101011110100110110101E92"); 336 s = mpfr_get_str (NULL, &e, 10, 12, x, MPFR_RNDN); 337 if (strcmp (s, "274178721752") || e != 44) 338 { 339 printf ("Error in mpfr_get_str (19): s=%s e=%d\n", s, (int) e); 340 exit (1); 341 } 342 mpfr_free_str (s); 343 mpfr_set_str_binary (x, "10011101010111101111000100111011101011110100110110101E91"); 344 s = mpfr_get_str (NULL, &e, 10, 13, x, MPFR_RNDN); 345 if (strcmp (s, "1370893608762") || e != 44) 346 { 347 printf ("Error in mpfr_get_str (20): s=%s e=%d\n", s, (int) e); 348 exit (1); 349 } 350 mpfr_free_str (s); 351 352 mpfr_set_str_binary (x, "10010011010110011100010010100101100011101000011111111E92"); 353 s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDN); 354 if (strcmp (s, "25672105101864") || e != 44) 355 { 356 printf ("Error in mpfr_get_str (21): s=%s e=%d\n", s, (int) e); 357 exit (1); 358 } 359 mpfr_free_str (s); 360 361 mpfr_set_str_binary (x, "100110111110110001000101110100100101101000011111001E87"); 362 s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDN); 363 if (strcmp (s, "212231308858721") || e != 42) 364 { 365 printf ("Error in mpfr_get_str (22): s=%s e=%d\n", s, (int) e); 366 exit (1); 367 } 368 mpfr_free_str (s); 369 mpfr_set_str_binary (x, "10111010110000111000101100101111001011011100101001111E-128"); 370 s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDN); 371 if (strcmp (s, "193109287087290") || e != -22) 372 { 373 printf ("Error in mpfr_get_str (22b): s=%s e=%d\n", s, (int) e); 374 exit (1); 375 } 376 mpfr_free_str (s); 377 378 mpfr_set_str_binary (x, "10001101101011010001111110000111010111010000110101010E80"); 379 s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDN); 380 if (strcmp (s, "6026241735727920") || e != 40) 381 { 382 printf ("Error in mpfr_get_str (23): s=%s e=%d\n", s, (int) e); 383 exit (1); 384 } 385 mpfr_free_str (s); 386 387 mpfr_set_str_binary (x, "100010001011101001110101000110011001001000110001001E-81"); 388 s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN); 389 if (strcmp (s, "49741483709103481") || e != -9) 390 { 391 printf ("Error in mpfr_get_str (24): s=%s e=%d\n", s, (int) e); 392 exit (1); 393 } 394 mpfr_free_str (s); 395 mpfr_set_str_binary (x, "11000100001001001110111010011001111001001010110101111E-101"); 396 s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDN); 397 if (strcmp (s, "2722049") || e != -14) 398 { 399 printf ("Error in mpfr_get_str (25): s=%s e=%d\n", s, (int) e); 400 exit (1); 401 } 402 mpfr_free_str (s); 403 mpfr_set_str_binary (x, "11111001010011100101000001111111110001001001110110001E-135"); 404 s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDN); 405 if (strcmp (s, "20138772") || e != -24) 406 { 407 printf ("Error in mpfr_get_str (26): s=%s e=%d\n", s, (int) e); 408 exit (1); 409 } 410 mpfr_free_str (s); 411 412 mpfr_set_str_binary (x, "11111001010011100101000001111111110001001001110110001E-136"); 413 s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDN); 414 if (strcmp (s, "100693858") || e != -24) 415 { 416 printf ("Error in mpfr_get_str (27): s=%s e=%d\n", s, (int) e); 417 exit (1); 418 } 419 mpfr_free_str (s); 420 mpfr_set_str_binary (x, "10001000001110010110001011111011111011011010000110001E-110"); 421 s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDN); 422 if (strcmp (s, "36923634350619") || e != -17) 423 { 424 printf ("Error in mpfr_get_str (28): s=%s e=%d\n", s, (int) e); 425 exit (1); 426 } 427 mpfr_free_str (s); 428 mpfr_set_str_binary (x, "11001100010111000111100010000110011101110001000101111E-87"); 429 s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDN); 430 if (strcmp (s, "4646636036100804") || e != -10) 431 { 432 printf ("Error in mpfr_get_str (29): s=%s e=%d\n", s, (int) e); 433 exit (1); 434 } 435 mpfr_free_str (s); 436 mpfr_set_str_binary (x, "10011111001111110100001001010111111011010101111111000E-99"); 437 s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN); 438 if (strcmp (s, "88399901882446712") || e != -14) 439 { 440 printf ("Error in mpfr_get_str (30): s=%s e=%d\n", s, (int) e); 441 exit (1); 442 } 443 mpfr_free_str (s); 444 445 /* 8116315218207718*2^(-293) ~ 0.5100000000000000000015*10^(-72) */ 446 mpfr_set_str_binary (x, "11100110101011011111011100101011101110110001111100110E-293"); 447 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU); 448 if (strcmp (s, "52") || e != -72) 449 { 450 printf ("Error in mpfr_get_str (31u): s=%s e=%d\n", s, (int) e); 451 exit (1); 452 } 453 mpfr_free_str (s); 454 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDD); 455 if (strcmp (s, "51") || e != -72) 456 { 457 printf ("Error in mpfr_get_str (31d): s=%s e=%d\n", s, (int) e); 458 exit (1); 459 } 460 mpfr_free_str (s); 461 462 /* 6712731423444934*2^536 ~ .151000000000000000000067*10^178 */ 463 mpfr_set_str_binary (x, "10111110110010011000110010011111101111000111111000110E536"); 464 s = mpfr_get_str (NULL, &e, 10, 3, x, MPFR_RNDU); 465 if (strcmp (s, "152") || e != 178) 466 { 467 printf ("Error in mpfr_get_str (32u): s=%s e=%d\n", s, (int) e); 468 exit (1); 469 } 470 mpfr_free_str (s); 471 s = mpfr_get_str (NULL, &e, 10, 3, x, MPFR_RNDD); 472 if (strcmp (s, "151") || e != 178) 473 { 474 printf ("Error in mpfr_get_str (32d): s=%s e=%d\n", s, (int) e); 475 exit (1); 476 } 477 mpfr_free_str (s); 478 479 /* 3356365711722467*2^540 ~ .120800000000000000000054*10^179 */ 480 mpfr_set_str_binary (x, "1011111011001001100011001001111110111100011111100011E540"); 481 s = mpfr_get_str (NULL, &e, 10, 4, x, MPFR_RNDU); 482 if (strcmp (s, "1209") || e != 179) 483 { 484 printf ("Error in mpfr_get_str (33u): s=%s e=%d\n", s, (int) e); 485 exit (1); 486 } 487 mpfr_free_str (s); 488 s = mpfr_get_str (NULL, &e, 10, 4, x, MPFR_RNDD); 489 if (strcmp (s, "1208") || e != 179) 490 { 491 printf ("Error in mpfr_get_str (33d): s=%s e=%d\n", s, (int) e); 492 exit (1); 493 } 494 mpfr_free_str (s); 495 496 /* 6475049196144587*2^100 ~ .8208099999999999999999988*10^46 */ 497 mpfr_set_str_binary (x, "10111000000010000010111011111001111010100011111001011E100"); 498 s = mpfr_get_str (NULL, &e, 10, 5, x, MPFR_RNDU); 499 if (strcmp (s, "82081") || e != 46) 500 { 501 printf ("Error in mpfr_get_str (34u): s=%s e=%d\n", s, (int) e); 502 exit (1); 503 } 504 mpfr_free_str (s); 505 s = mpfr_get_str (NULL, &e, 10, 5, x, MPFR_RNDD); 506 if (strcmp (s, "82080") || e != 46) 507 { 508 printf ("Error in mpfr_get_str (34d): s=%s e=%d\n", s, (int) e); 509 exit (1); 510 } 511 mpfr_free_str (s); 512 513 /* 6722280709661868*2^364 ~ .25260100000000000000000012*10^126 */ 514 mpfr_set_str_binary (x, "10111111000011110000011110001110001111010010010101100E364"); 515 s = mpfr_get_str (NULL, &e, 10, 6, x, MPFR_RNDU); 516 if (strcmp (s, "252602") || e != 126) 517 { 518 printf ("Error in mpfr_get_str (35u): s=%s e=%d\n", s, (int) e); 519 exit (1); 520 } 521 mpfr_free_str (s); 522 s = mpfr_get_str (NULL, &e, 10, 6, x, MPFR_RNDD); 523 if (strcmp (s, "252601") || e != 126) 524 { 525 printf ("Error in mpfr_get_str (35d): s=%s e=%d\n", s, (int) e); 526 exit (1); 527 } 528 mpfr_free_str (s); 529 530 /* 5381065484265332*2^(-455) ~ .578389299999999999999999982*10^(-121) */ 531 mpfr_set_str_binary (x, "10011000111100000110011110000101100111110011101110100E-455"); 532 s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDU); 533 if (strcmp (s, "5783893") || e != -121) 534 { 535 printf ("Error in mpfr_get_str (36u): s=%s e=%d\n", s, (int) e); 536 exit (1); 537 } 538 mpfr_free_str (s); 539 s = mpfr_get_str (NULL, &e, 10, 7, x, MPFR_RNDD); 540 if (strcmp (s, "5783892") || e != -121) 541 { 542 printf ("Error in mpfr_get_str (36d): s=%s e=%d\n", s, (int) e); 543 exit (1); 544 } 545 mpfr_free_str (s); 546 547 /* 8369123604277281*2^(-852) ~ .27869147000000000000000000056*10^(-240) */ 548 mpfr_set_str_binary (x, "11101101110111010110001101111100000111010100000100001E-852"); 549 s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDU); 550 if (strcmp (s, "27869148") || e != -240) 551 { 552 printf ("Error in mpfr_get_str (37u): s=%s e=%d\n", s, (int) e); 553 exit (1); 554 } 555 mpfr_free_str (s); 556 s = mpfr_get_str (NULL, &e, 10, 8, x, MPFR_RNDD); 557 if (strcmp (s, "27869147") || e != -240) 558 { 559 printf ("Error in mpfr_get_str (37d): s=%s e=%d\n", s, (int) e); 560 exit (1); 561 } 562 mpfr_free_str (s); 563 564 /* 7976538478610756*2^377 ~ .245540326999999999999999999982*10^130 */ 565 mpfr_set_str_binary (x, "11100010101101001111010010110100011100000100101000100E377"); 566 s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDU); 567 if (strcmp (s, "245540327") || e != 130) 568 { 569 printf ("Error in mpfr_get_str (38u): s=%s e=%d\n", s, (int) e); 570 exit (1); 571 } 572 mpfr_free_str (s); 573 s = mpfr_get_str (NULL, &e, 10, 9, x, MPFR_RNDD); 574 if (strcmp (s, "245540326") || e != 130) 575 { 576 printf ("Error in mpfr_get_str (38d): s=%s e=%d\n", s, (int) e); 577 exit (1); 578 } 579 mpfr_free_str (s); 580 581 /* 8942832835564782*2^(-382) ~ .9078555839000000000000000000038*10^(-99) */ 582 mpfr_set_str_binary (x, "11111110001010111010110000110011100110001010011101110E-382"); 583 s = mpfr_get_str (NULL, &e, 10, 10, x, MPFR_RNDU); 584 if (strcmp (s, "9078555840") || e != -99) 585 { 586 printf ("Error in mpfr_get_str (39u): s=%s e=%d\n", s, (int) e); 587 exit (1); 588 } 589 mpfr_free_str (s); 590 s = mpfr_get_str (NULL, &e, 10, 10, x, MPFR_RNDD); 591 if (strcmp (s, "9078555839") || e != -99) 592 { 593 printf ("Error in mpfr_get_str (39d): s=%s e=%d\n", s, (int) e); 594 exit (1); 595 } 596 mpfr_free_str (s); 597 598 /* 4471416417782391*2^(-380) ~ .18157111678000000000000000000077*10^(-98) */ 599 mpfr_set_str_binary (x, "1111111000101011101011000011001110011000101001110111E-380"); 600 s = mpfr_get_str (NULL, &e, 10, 11, x, MPFR_RNDU); 601 if (strcmp (s, "18157111679") || e != -98) 602 { 603 printf ("Error in mpfr_get_str (40u): s=%s e=%d\n", s, (int) e); 604 exit (1); 605 } 606 mpfr_free_str (s); 607 s = mpfr_get_str (NULL, &e, 10, 11, x, MPFR_RNDD); 608 if (strcmp (s, "18157111678") || e != -98) 609 { 610 printf ("Error in mpfr_get_str (40d): s=%s e=%d\n", s, (int) e); 611 exit (1); 612 } 613 mpfr_free_str (s); 614 615 /* 7225450889282194*2^711 ~ .778380362292999999999999999999971*10^230 */ 616 mpfr_set_str_binary (x, "11001101010111000001001100001100110010000001010010010E711"); 617 s = mpfr_get_str (NULL, &e, 10, 12, x, MPFR_RNDU); 618 if (strcmp (s, "778380362293") || e != 230) 619 { 620 printf ("Error in mpfr_get_str (41u): s=%s e=%d\n", s, (int) e); 621 exit (1); 622 } 623 mpfr_free_str (s); 624 s = mpfr_get_str (NULL, &e, 10, 12, x, MPFR_RNDD); 625 if (strcmp (s, "778380362292") || e != 230) 626 { 627 printf ("Error in mpfr_get_str (41d): s=%s e=%d\n", s, (int) e); 628 exit (1); 629 } 630 mpfr_free_str (s); 631 632 /* 3612725444641097*2^713 ~ .1556760724585999999999999999999942*10^231 */ 633 mpfr_set_str_binary (x, "1100110101011100000100110000110011001000000101001001E713"); 634 s = mpfr_get_str (NULL, &e, 10, 13, x, MPFR_RNDU); 635 if (strcmp (s, "1556760724586") || e != 231) 636 { 637 printf ("Error in mpfr_get_str (42u): s=%s e=%d\n", s, (int) e); 638 exit (1); 639 } 640 mpfr_free_str (s); 641 s = mpfr_get_str (NULL, &e, 10, 13, x, MPFR_RNDD); 642 if (strcmp (s, "1556760724585") || e != 231) 643 { 644 printf ("Error in mpfr_get_str (42d): s=%s e=%d\n", s, (int) e); 645 exit (1); 646 } 647 mpfr_free_str (s); 648 649 /* 6965949469487146*2^(-248) ~ .15400733123779000000000000000000016*10^(-58) */ 650 mpfr_set_str_binary (x, "11000101111110111111001111111101001101111000000101010E-248"); 651 s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDU); 652 if (strcmp (s, "15400733123780") || e != -58) 653 { 654 printf ("Error in mpfr_get_str (43u): s=%s e=%d\n", s, (int) e); 655 exit (1); 656 } 657 mpfr_free_str (s); 658 s = mpfr_get_str (NULL, &e, 10, 14, x, MPFR_RNDD); 659 if (strcmp (s, "15400733123779") || e != -58) 660 { 661 printf ("Error in mpfr_get_str (43d): s=%s e=%d\n", s, (int) e); 662 exit (1); 663 } 664 mpfr_free_str (s); 665 666 /* 3482974734743573*2^(-244) ~ .12320586499023200000000000000000013*10^(-57) */ 667 mpfr_set_str_binary (x, "1100010111111011111100111111110100110111100000010101E-244"); 668 s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDU); 669 if (strcmp (s, "123205864990233") || e != -57) 670 { 671 printf ("Error in mpfr_get_str (44u): s=%s e=%d\n", s, (int) e); 672 exit (1); 673 } 674 mpfr_free_str (s); 675 s = mpfr_get_str (NULL, &e, 10, 15, x, MPFR_RNDD); 676 if (strcmp (s, "123205864990232") || e != -57) 677 { 678 printf ("Error in mpfr_get_str (44d): s=%s e=%d\n", s, (int) e); 679 exit (1); 680 } 681 mpfr_free_str (s); 682 683 /* 7542952370752766*2^(-919) ~ .170206189963739699999999999999999974*10^(-260) */ 684 mpfr_set_str_binary (x, "11010110011000100011001110100100111011100110011111110E-919"); 685 s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDU); 686 if (strcmp (s, "1702061899637397") || e != -260) 687 { 688 printf ("Error in mpfr_get_str (45u): s=%s e=%d\n", s, (int) e); 689 exit (1); 690 } 691 mpfr_free_str (s); 692 s = mpfr_get_str (NULL, &e, 10, 16, x, MPFR_RNDD); 693 if (strcmp (s, "1702061899637396") || e != -260) 694 { 695 printf ("Error in mpfr_get_str (45d): s=%s e=%d\n", s, (int) e); 696 exit (1); 697 } 698 mpfr_free_str (s); 699 700 /* 5592117679628511*2^165 ~ .26153245263757307000000000000000000074*10^66 */ 701 mpfr_set_str_binary (x, "10011110111100000000001011011110101100010000011011111E165"); 702 s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDU); 703 if (strcmp (s, "26153245263757308") || e != 66) 704 { 705 printf ("Error in mpfr_get_str (46u): s=%s e=%d\n", s, (int) e); 706 exit (1); 707 } 708 mpfr_free_str (s); 709 s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDD); 710 if (strcmp (s, "26153245263757307") || e != 66) 711 { 712 printf ("Error in mpfr_get_str (46d): s=%s e=%d\n", s, (int) e); 713 exit (1); 714 } 715 mpfr_free_str (s); 716 717 mpfr_set_str_binary (x, "11010010110111100001011010000110010000100001011011101E1223"); 718 s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN); 719 if (strcmp (s, "10716284017294180") || e != 385) 720 { 721 printf ("Error in mpfr_get_str (47n): s=%s e=%d\n", s, (int) e); 722 exit (1); 723 } 724 mpfr_free_str (s); 725 s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDU); 726 if (strcmp (s, "107162840172941805") || e != 385) 727 { 728 printf ("Error in mpfr_get_str (47u): s=%s e=%d\n", s, (int) e); 729 exit (1); 730 } 731 mpfr_free_str (s); 732 s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDD); 733 if (strcmp (s, "107162840172941804") || e != 385) 734 { 735 printf ("Error in mpfr_get_str (47d): s=%s e=%d\n", s, (int) e); 736 exit (1); 737 } 738 mpfr_free_str (s); 739 740 mpfr_set_str_binary (x, "11111101111011000001010100001101101000010010001111E122620"); 741 s = mpfr_get_str (NULL, &e, 10, 17, x, MPFR_RNDN); 742 if (strcmp (s, "22183435284042374") || e != 36928) 743 { 744 printf ("Error in mpfr_get_str (48n): s=%s e=%ld\n", s, (long) e); 745 exit (1); 746 } 747 mpfr_free_str (s); 748 s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDU); 749 if (strcmp (s, "221834352840423736") || e != 36928) 750 { 751 printf ("Error in mpfr_get_str (48u): s=%s e=%ld\n", s, (long) e); 752 exit (1); 753 } 754 mpfr_free_str (s); 755 s = mpfr_get_str (NULL, &e, 10, 18, x, MPFR_RNDD); 756 if (strcmp (s, "221834352840423735") || e != 36928) 757 { 758 printf ("Error in mpfr_get_str (48d): s=%s e=%ld\n", s, (long) e); 759 exit (1); 760 } 761 mpfr_free_str (s); 762 763 mpfr_set_prec (x, 45); 764 mpfr_set_str_binary (x, "1E45"); 765 s = mpfr_get_str (NULL, &e, 32, 9, x, MPFR_RNDN); 766 mpfr_free_str (s); 767 768 mpfr_set_prec (x, 7); 769 mpfr_set_str_binary (x, "0.1010101E10"); 770 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU); 771 mpfr_free_str (s); 772 773 /* checks rounding of negative numbers */ 774 mpfr_set_prec (x, 7); 775 mpfr_set_str (x, "-11.5", 10, MPFR_RNDN); 776 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDD); 777 if (strcmp (s, "-12")) 778 { 779 printf ("Error in mpfr_get_str for x=-11.5 and rnd=MPFR_RNDD\n" 780 "got %s instead of -12\n", s); 781 exit (1); 782 } 783 mpfr_free_str (s); 784 785 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDU); 786 if (strcmp (s, "-11")) 787 { 788 printf ("Error in mpfr_get_str for x=-11.5 and rnd=MPFR_RNDU\n"); 789 exit (1); 790 } 791 mpfr_free_str (s); 792 793 /* bug found by Jean-Pierre Merlet, produced error in mpfr_get_str */ 794 mpfr_set_prec (x, 128); 795 mpfr_set_str_binary (x, "0.10111001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011010E3"); 796 s = mpfr_get_str (NULL, &e, 10, 0, x, MPFR_RNDU); 797 mpfr_free_str (s); 798 799 mpfr_set_prec (x, 381); 800 mpfr_set_str_binary (x, "0.111111111111111111111111111111111111111111111111111111111111111111101110110000100110011101101101001010111000101111000100100011110101010110101110100000010100001000110100000100011111001000010010000010001010111001011110000001110010111101100001111000101101100000010110000101100100000101010110010110001010100111001111100011100101100000100100111001100010010011110011011010110000001000010"); 801 s = mpfr_get_str (NULL, &e, 10, 0, x, MPFR_RNDD); 802 if (e != 0) 803 { 804 printf ("Error in mpfr_get_str for x=0.999999..., exponent is %d" 805 " instead of 0\n", (int) e); 806 exit (1); 807 } 808 mpfr_free_str (s); 809 810 mpfr_set_prec (x, 5); 811 mpfr_set_str_binary (x, "1101.1"); /* 13.5, or (16)_7 + 1/2 */ 812 s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN); 813 /* we are in the tie case: both surrounding numbers are (16)_7 and 814 (20)_7: since (16)_7 = 13 is odd and (20)_7 = 14 is even, 815 we should have s = "20" and e = 2 */ 816 if (e != 2 || strcmp (s, "20")) 817 { 818 printf ("Error in mpfr_get_str for x=13.5, base 7\n"); 819 printf ("Expected s=20, e=2, got s=%s, e=%ld\n", s, e); 820 exit (1); 821 } 822 mpfr_free_str (s); 823 /* try the same example, with input just below or above 13.5 */ 824 mpfr_set_prec (x, 1000); 825 mpfr_set_str_binary (x, "1101.1"); 826 mpfr_nextabove (x); 827 s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN); 828 if (e != 2 || strcmp (s, "20")) 829 { 830 printf ("Error in mpfr_get_str for x=13.5+tiny, base 7\n"); 831 printf ("Expected s=20, e=2, got s=%s, e=%ld\n", s, e); 832 exit (1); 833 } 834 mpfr_free_str (s); 835 mpfr_set_str_binary (x, "1101.1"); 836 mpfr_nextbelow (x); 837 s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN); 838 if (e != 2 || strcmp (s, "16")) 839 { 840 printf ("Error in mpfr_get_str for x=13.5-tiny, base 7\n"); 841 printf ("Expected s=16, e=2, got s=%s, e=%ld\n", s, e); 842 exit (1); 843 } 844 mpfr_free_str (s); 845 846 mpfr_set_prec (x, 7); 847 mpfr_set_str_binary (x, "110000.1"); /* 48.5, or (66)_7 + 1/2 */ 848 s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN); 849 /* we are in the tie case: both surrounding numbers are (66)_7 and 850 (100)_7: since (66)_7 = 48 is even and (100)_7 is odd, 851 we should hase s = "66" and e = 2 */ 852 if (e != 2 || strcmp (s, "66")) 853 { 854 printf ("Error in mpfr_get_str for x=48.5, base 7\n"); 855 printf ("Expected s=66, e=2, got s=%s, e=%ld\n", s, e); 856 exit (1); 857 } 858 mpfr_free_str (s); 859 /* try the same example, with input just below or above 48.5 */ 860 mpfr_set_prec (x, 1000); 861 mpfr_set_str_binary (x, "110000.1"); 862 mpfr_nextabove (x); 863 s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN); 864 if (e != 3 || strcmp (s, "10")) 865 { 866 printf ("Error in mpfr_get_str for x=48.5+tiny, base 7\n"); 867 printf ("Expected s=10, e=3, got s=%s, e=%ld\n", s, e); 868 exit (1); 869 } 870 mpfr_free_str (s); 871 mpfr_set_str_binary (x, "110000.1"); 872 mpfr_nextbelow (x); 873 s = mpfr_get_str (NULL, &e, 7, 2, x, MPFR_RNDN); 874 if (e != 2 || strcmp (s, "66")) 875 { 876 printf ("Error in mpfr_get_str for x=48.5-tiny, base 7\n"); 877 printf ("Expected s=66, e=2, got s=%s, e=%ld\n", s, e); 878 exit (1); 879 } 880 mpfr_free_str (s); 881 882 mpfr_clear (x); 883} 884 885/* bugs found by Alain Delplanque */ 886static void 887check_large (void) 888{ 889 mpfr_t x; 890 char *s, s1[7]; 891 const char xm[] = { '1', '1', '9', '1', '3', '2', '9', '3', '7', '3', 892 '5', '8', '4', '4', '5', '4', '9', '0', '2', '9', 893 '6', '3', '4', '4', '6', '9', '9', '1', '9', '5', 894 '5', '7', '2', '0', '1', '7', '5', '2', '8', '6', 895 '1', '2', '5', '2', '5', '2', '7', '4', '0', '2', 896 '7', '9', '1', '1', '7', '4', '5', '6', '7', '5', 897 '9', '3', '1', '4', '2', '5', '5', '6', '6', '6', 898 '1', '6', '4', '3', '8', '1', '2', '8', '7', '6', 899 '2', '9', '2', '0', '8', '8', '9', '4', '3', '9', 900 '6', '2', '8', '4', '1', '1', '8', '1', '0', '6', 901 '2', '3', '7', '6', '3', '8', '1', '5', '1', '7', 902 '3', '4', '6', '1', '2', '4', '0', '1', '3', '0', 903 '8', '4', '1', '3', '9', '3', '2', '0', '1', '6', 904 '3', '6', '7', '1', '5', '1', '7', '5', '0', '1', 905 '9', '8', '4', '0', '8', '2', '7', '9', '1', '3', 906 '2', '2', '8', '3', '4', '1', '6', '2', '3', '9', 907 '6', '2', '0', '7', '3', '5', '5', '5', '3', '4', 908 '2', '1', '7', '0', '9', '7', '6', '2', '1', '0', 909 '3', '3', '5', '4', '7', '6', '0', '9', '7', '6', 910 '9', '3', '5', '1', '7', '8', '6', '8', '8', '2', 911 '8', '1', '4', '3', '7', '4', '3', '3', '2', '4', 912 '1', '5', '4', '7', '8', '1', '1', '4', '2', '1', 913 '2', '4', '2', '7', '6', '5', '9', '5', '4', '5', 914 '2', '6', '7', '3', '0', '3', '4', '0', '6', '9', 915 '1', '8', '9', '9', '9', '8', '0', '5', '7', '0', 916 '9', '3', '8', '7', '6', '2', '4', '6', '1', '6', 917 '7', '2', '0', '3', '5', '9', '3', '5', '8', '8', 918 '9', '7', '7', '9', '2', '7', '0', '8', '1', '6', 919 '8', '7', '4', '8', '5', '3', '0', '8', '4', '3', 920 '5', '6', '5', '1', '6', '6', '0', '9', '7', '9', 921 '8', '9', '2', '7', '2', '6', '8', '5', '9', '4', 922 '5', '8', '1', '3', '7', '2', '9', '3', '8', '3', 923 '7', '9', '1', '7', '9', '9', '7', '7', '2', '8', 924 '4', '6', '5', '5', '7', '3', '3', '8', '3', '6', 925 '6', '9', '7', '1', '4', '3', '3', '7', '1', '4', 926 '9', '4', '1', '2', '4', '9', '5', '1', '4', '7', 927 '2', '6', '4', '4', '8', '0', '6', '2', '6', '0', 928 '6', '9', '8', '1', '1', '7', '9', '9', '3', '9', 929 '3', '8', '4', '7', '3', '1', '9', '0', '2', '3', 930 '5', '3', '5', '4', '2', '1', '1', '7', '6', '7', 931 '4', '3', '2', '2', '0', '6', '5', '9', '9', '3', 932 '2', '6', '7', '1', '2', '0', '0', '3', '7', '3', 933 '8', '7', '4', '3', '3', '3', '3', '3', '2', '3', 934 '8', '2', '8', '6', '3', '1', '5', '5', '2', '2', 935 '5', '9', '3', '3', '7', '0', '6', '2', '8', '1', 936 '0', '3', '6', '7', '6', '9', '6', '5', '9', '0', 937 '6', '6', '6', '3', '6', '9', '9', '3', '8', '7', 938 '6', '5', '4', '5', '3', '5', '9', '4', '0', '0', 939 '7', '5', '8', '5', '4', '1', '4', '3', '1', '5', 940 '7', '6', '6', '3', '4', '4', '5', '0', '8', '7', 941 '5', '7', '5', '0', '1', '0', '1', '8', '4', '7', 942 '3', '1', '9', '9', '2', '7', '1', '1', '1', '2', 943 '3', '9', '9', '6', '5', '9', '2', '3', '2', '8', 944 '1', '5', '5', '1', '2', '6', '4', '9', '6', '6', 945 '4', '5', '1', '1', '6', '0', '0', '3', '2', '8', 946 '4', '8', '7', '1', '4', '9', '6', '8', '1', '6', 947 '5', '9', '8', '3', '4', '2', '9', '7', '0', '1', 948 '9', '2', '6', '6', '9', '1', '3', '5', '9', '3', 949 '2', '9', '6', '2', '3', '0', '6', '0', '1', '1', 950 '6', '5', '1', '7', '9', '0', '7', '5', '8', '6', 951 '8', '4', '2', '1', '0', '3', '8', '6', '6', '4', 952 '4', '9', '9', '7', '5', '8', '1', '7', '5', '7', 953 '9', '6', '6', '8', '8', '5', '8', '6', '7', '4', 954 '0', '7', '2', '0', '2', '9', '9', '4', '4', '1', 955 '9', '5', '8', '6', '5', '0', '6', '7', '4', '2', 956 '7', '3', '2', '3', '2', '7', '0', '2', '1', '3', 957 '0', '5', '9', '0', '3', '9', '1', '4', '5', '3', 958 '7', '2', '7', '0', '8', '5', '5', '4', '6', '1', 959 '1', '0', '0', '9', '2', '0', '4', '1', '6', '6', 960 '4', '6', '9', '1', '3', '2', '8', '5', '0', '3', 961 '3', '8', '9', '8', '7', '8', '5', '9', '5', '5', 962 '9', '1', '9', '3', '6', '5', '4', '1', '7', '4', 963 '0', '2', '4', '7', '2', '9', '7', '1', '2', '4', 964 '5', '8', '1', '4', '4', '6', '1', '8', '5', '8', 965 '7', '6', '9', '7', '2', '1', '2', '0', '8', '9', 966 '5', '9', '5', '5', '3', '8', '1', '2', '5', '4', 967 '3', '0', '7', '6', '5', '1', '7', '8', '2', '0', 968 '0', '7', '6', '7', '4', '8', '1', '0', '6', '3', 969 '2', '3', '0', '5', '2', '5', '0', '1', '1', '4', 970 '3', '8', '4', '5', '2', '3', '9', '5', '0', '9', 971 '8', '2', '6', '4', '7', '4', '8', '0', '1', '1', 972 '7', '1', '5', '4', '9', '0', '9', '2', '2', '3', 973 '8', '1', '6', '9', '0', '4', '6', '4', '5', '4', 974 '6', '3', '8', '7', '3', '6', '1', '7', '2', '3', 975 '4', '5', '5', '2', '0', '2', '5', '8', '1', '4', 976 '9', '3', '0', '7', '4', '1', '6', '8', '7', '8', 977 '2', '6', '2', '5', '1', '0', '7', '4', '7', '3', 978 '6', '6', '4', '5', '6', '6', '6', '6', '8', '5', 979 '1', '3', '5', '7', '1', '6', '2', '0', '9', '2', 980 '3', '2', '6', '0', '7', '9', '8', '1', '6', '2', 981 '0', '3', '8', '8', '0', '2', '8', '7', '7', '5', 982 '9', '3', '1', '0', '6', '7', '5', '7', '3', '1', 983 '2', '7', '7', '2', '0', '0', '4', '1', '2', '8', 984 '2', '0', '8', '4', '0', '5', '0', '5', '0', '1', 985 '9', '3', '3', '6', '3', '6', '9', '6', '2', '8', 986 '2', '9', '7', '5', '3', '8', '8', '9', '1', '1', 987 '4', '5', '7', '7', '5', '6', '0', '2', '7', '9', 988 '7', '2', '1', '7', '4', '3', '0', '3', '6', '7', 989 '3', '7', '2', '2', '7', '5', '6', '2', '3', '1', 990 '2', '1', '3', '1', '4', '2', '6', '9', '2', '3', 991 '\0' }; 992 mpfr_exp_t e; 993 994 mpfr_init2 (x, 3322); 995 mpfr_set_str (x, xm, 10, MPFR_RNDN); 996 mpfr_div_2exp (x, x, 4343, MPFR_RNDN); 997 s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN); 998 if (s[999] != '1') /* s must be 5.04383...689071e-309 */ 999 { 1000 printf ("Error in check_large: expected '689071', got '%s'\n", 1001 s + 994); 1002 exit (1); 1003 } 1004 mpfr_free_str (s); 1005 1006 mpfr_mul_2exp (x, x, 4343, MPFR_RNDN); 1007 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN); 1008 if (strcmp (s, "12") || (e != 1000)) 1009 { 1010 printf ("Error in check_large: expected 0.12e1000\n"); 1011 printf ("got %se%d\n", s, (int) e); 1012 exit (1); 1013 } 1014 mpfr_free_str (s); 1015 1016 mpfr_set_nan (x); 1017 s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN); 1018 if (strcmp (s, "@NaN@")) 1019 { 1020 printf ("Error for NaN\n"); 1021 exit (1); 1022 } 1023 mpfr_free_str (s); 1024 1025 mpfr_get_str (s1, &e, 10, 1000, x, MPFR_RNDN); 1026 1027 mpfr_set_inf (x, 1); 1028 s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN); 1029 if (strcmp (s, "@Inf@")) 1030 { 1031 printf ("Error for Inf\n"); 1032 exit (1); 1033 } 1034 mpfr_free_str (s); 1035 1036 mpfr_get_str (s1, &e, 10, 1000, x, MPFR_RNDN); 1037 1038 mpfr_set_inf (x, -1); 1039 s = mpfr_get_str (NULL, &e, 10, 1000, x, MPFR_RNDN); 1040 if (strcmp (s, "-@Inf@")) 1041 { 1042 printf ("Error for -Inf\n"); 1043 exit (1); 1044 } 1045 mpfr_free_str (s); 1046 1047 mpfr_get_str (s1, &e, 10, 1000, x, MPFR_RNDN); 1048 1049 mpfr_set_ui (x, 0, MPFR_RNDN); 1050 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN); 1051 if (e != 0 || strcmp (s, "00")) 1052 { 1053 printf ("Error for 0.0\n"); 1054 exit (1); 1055 } 1056 mpfr_free_str (s); 1057 mpfr_get_str (s1, &e, 10, 2, x, MPFR_RNDN); 1058 1059 mpfr_neg (x, x, MPFR_RNDN); /* -0.0 */ 1060 s = mpfr_get_str (NULL, &e, 10, 2, x, MPFR_RNDN); 1061 if (e != 0 || strcmp (s, "-00")) 1062 { 1063 printf ("Error for -0.0\ngot %se%d\n", s, (int) e); 1064 exit (1); 1065 } 1066 mpfr_free_str (s); 1067 mpfr_get_str (s1, &e, 10, 2, x, MPFR_RNDN); 1068 1069 mpfr_clear (x); 1070} 1071 1072#define MAX_DIGITS 100 1073 1074static void 1075check_special (int b, mpfr_prec_t p) 1076{ 1077 mpfr_t x; 1078 int i, j; 1079 char s[MAX_DIGITS + 2], s2[MAX_DIGITS + 2], c; 1080 mpfr_exp_t e; 1081 int r; 1082 size_t m; 1083 1084 /* check for invalid base */ 1085 if (mpfr_get_str (s, &e, 1, 10, x, MPFR_RNDN) != NULL) 1086 { 1087 printf ("Error: mpfr_get_str should not accept base = 1\n"); 1088 exit (1); 1089 } 1090 if (mpfr_get_str (s, &e, 63, 10, x, MPFR_RNDN) != NULL) 1091 { 1092 printf ("Error: mpfr_get_str should not accept base = 63\n"); 1093 exit (1); 1094 } 1095 1096 s2[0] = '1'; 1097 for (i=1; i<MAX_DIGITS+2; i++) 1098 s2[i] = '0'; 1099 1100 mpfr_init2 (x, p); 1101 mpfr_set_ui (x, 1, MPFR_RNDN); 1102 for (i=1; i<MAX_DIGITS && mpfr_mul_ui (x, x, b, MPFR_RNDN) == 0; i++) 1103 { 1104 /* x = b^i (exact) */ 1105 for (r = 0; r < MPFR_RND_MAX; r++) 1106 for (m= (i<3)? 2 : i-1 ; (int) m <= i+1 ; m++) 1107 { 1108 mpfr_get_str (s, &e, b, m, x, (mpfr_rnd_t) r); 1109 /* s should be 1 followed by (m-1) zeros, and e should be i+1 */ 1110 if ((e != i+1) || strncmp (s, s2, m) != 0) 1111 { 1112 printf ("Error in mpfr_get_str for %d^%d\n", b, i); 1113 exit (1); 1114 } 1115 } 1116 if (mpfr_sub_ui (x, x, 1, MPFR_RNDN) != 0) 1117 break; 1118 /* now x = b^i-1 (exact) */ 1119 for (r = 0; r < MPFR_RND_MAX; r++) 1120 if (i >= 2) 1121 { 1122 mpfr_get_str (s, &e, b, i, x, (mpfr_rnd_t) r); 1123 /* should be i times (b-1) */ 1124 c = (b <= 10) ? '0' + b - 1 : 'a' + (b - 11); 1125 for (j=0; (j < i) && (s[j] == c); j++); 1126 if ((j < i) || (e != i)) 1127 { 1128 printf ("Error in mpfr_get_str for %d^%d-1\n", b, i); 1129 printf ("got 0.%s*2^%d\n", s, (int) e); 1130 exit (1); 1131 } 1132 } 1133 if (i >= 3) 1134 { 1135 mpfr_get_str (s, &e, b, i - 1, x, MPFR_RNDU); 1136 /* should be b^i */ 1137 if ((e != i+1) || strncmp (s, s2, i - 1) != 0) 1138 { 1139 printf ("Error in mpfr_get_str for %d^%d-1\n", b, i); 1140 printf ("got 0.%s*2^%d\n", s, (int) e); 1141 exit (1); 1142 } 1143 } 1144 1145 mpfr_add_ui (x, x, 1, MPFR_RNDN); 1146 } 1147 mpfr_clear (x); 1148} 1149 1150static void 1151check_bug_base2k (void) 1152{ 1153 /* 1154 * -2.63b22b55697e800000000000@130 1155 * +-0.1001100011101100100010101101010101011010010111111010000000000000000000000000+00000000000000000000001E522 1156 */ 1157 mpfr_t xx, yy, zz; 1158 char *s; 1159 mpfr_exp_t e; 1160 1161 mpfr_init2 (xx, 107); 1162 mpfr_init2 (yy, 79); 1163 mpfr_init2 (zz, 99); 1164 1165 mpfr_set_str (xx, "-1.90e8c3e525d7c0000000000000@-18", 16, MPFR_RNDN); 1166 mpfr_set_str (yy, "-2.63b22b55697e8000000@130", 16, MPFR_RNDN); 1167 mpfr_add (zz, xx, yy, MPFR_RNDD); 1168 s = mpfr_get_str (NULL, &e, 16, 0, zz, MPFR_RNDN); 1169 if (strcmp (s, "-263b22b55697e8000000000008")) 1170 { 1171 printf ("Error for get_str base 16\n" 1172 "Got %s expected -263b22b55697e8000000000008\n", s); 1173 exit (1); 1174 } 1175 mpfr_free_str (s); 1176 mpfr_clears (xx, yy, zz, (mpfr_ptr) 0); 1177} 1178 1179static void 1180check_reduced_exprange (void) 1181{ 1182 mpfr_t x; 1183 char *s; 1184 mpfr_exp_t emax, e; 1185 1186 emax = mpfr_get_emax (); 1187 mpfr_init2 (x, 8); 1188 mpfr_set_str (x, "0.11111111E0", 2, MPFR_RNDN); 1189 set_emax (0); 1190 s = mpfr_get_str (NULL, &e, 16, 0, x, MPFR_RNDN); 1191 set_emax (emax); 1192 if (strcmp (s, "ff0")) 1193 { 1194 printf ("Error for mpfr_get_str on 0.11111111E0 in base 16:\n" 1195 "Got \"%s\" instead of \"ff0\".\n", s); 1196 exit (1); 1197 } 1198 mpfr_free_str (s); 1199 mpfr_clear (x); 1200} 1201 1202#define ITER 1000 1203 1204int 1205main (int argc, char *argv[]) 1206{ 1207 int b; 1208 mpfr_t x; 1209 mpfr_rnd_t r; 1210 char s[MAX_DIGITS + 2]; 1211 mpfr_exp_t e, f; 1212 size_t m; 1213 mpfr_prec_t p; 1214 int i; 1215 1216 tests_start_mpfr (); 1217 1218 check_small (); 1219 1220 check_special (2, 2); 1221 for (i = 0; i < ITER; i++) 1222 { 1223 p = 2 + (randlimb () % (MAX_DIGITS - 1)); 1224 b = 2 + (randlimb () % 35); 1225 check_special (b, p); 1226 } 1227 1228 mpfr_init2 (x, MAX_DIGITS); 1229 for (i = 0; i < ITER; i++) 1230 { 1231 m = 2 + (randlimb () % (MAX_DIGITS - 1)); 1232 mpfr_urandomb (x, RANDS); 1233 e = (mpfr_exp_t) (randlimb () % 21) - 10; 1234 mpfr_set_exp (x, (e == -10) ? mpfr_get_emin () : 1235 ((e == 10) ? mpfr_get_emax () : e)); 1236 b = 2 + (randlimb () % 35); 1237 r = RND_RAND (); 1238 mpfr_get_str (s, &f, b, m, x, r); 1239 } 1240 mpfr_clear (x); 1241 1242 check_large (); 1243 check3 ("4.059650008e-83", MPFR_RNDN, "40597"); 1244 check3 ("-6.606499965302424244461355e233", MPFR_RNDN, "-66065"); 1245 check3 ("-7.4", MPFR_RNDN, "-74000"); 1246 check3 ("0.997", MPFR_RNDN, "99700"); 1247 check3 ("-4.53063926135729747564e-308", MPFR_RNDN, "-45306"); 1248 check3 ("2.14478198760196000000e+16", MPFR_RNDN, "21448"); 1249 check3 ("7.02293374921793516813e-84", MPFR_RNDN, "70229"); 1250 1251 check3 ("-6.7274500420134077e-87", MPFR_RNDN, "-67275"); 1252 check3 ("-6.7274500420134077e-87", MPFR_RNDZ, "-67274"); 1253 check3 ("-6.7274500420134077e-87", MPFR_RNDU, "-67274"); 1254 check3 ("-6.7274500420134077e-87", MPFR_RNDD, "-67275"); 1255 check3 ("-6.7274500420134077e-87", MPFR_RNDA, "-67275"); 1256 1257 check3 ("6.7274500420134077e-87", MPFR_RNDN, "67275"); 1258 check3 ("6.7274500420134077e-87", MPFR_RNDZ, "67274"); 1259 check3 ("6.7274500420134077e-87", MPFR_RNDU, "67275"); 1260 check3 ("6.7274500420134077e-87", MPFR_RNDD, "67274"); 1261 check3 ("6.7274500420134077e-87", MPFR_RNDA, "67275"); 1262 1263 check_bug_base2k (); 1264 check_reduced_exprange (); 1265 1266 tests_end_mpfr (); 1267 return 0; 1268} 1269