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