Home | History | Annotate | Line # | Download | only in tests
      1      1.1  mrg /* Test file for mpfr_exp10.
      2      1.1  mrg 
      3  1.1.1.6  mrg Copyright 2007-2023 Free Software Foundation, Inc.
      4  1.1.1.3  mrg Contributed by the AriC and Caramba projects, INRIA.
      5      1.1  mrg 
      6      1.1  mrg This file is part of the GNU MPFR Library.
      7      1.1  mrg 
      8      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
      9      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     10      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     11      1.1  mrg option) any later version.
     12      1.1  mrg 
     13      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     14      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     16      1.1  mrg License for more details.
     17      1.1  mrg 
     18      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     19      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     20  1.1.1.5  mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     21      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     22      1.1  mrg 
     23      1.1  mrg #include "mpfr-test.h"
     24      1.1  mrg 
     25      1.1  mrg #define TEST_FUNCTION mpfr_exp10
     26      1.1  mrg #define TEST_RANDOM_EMIN -36
     27      1.1  mrg #define TEST_RANDOM_EMAX 36
     28      1.1  mrg #include "tgeneric.c"
     29      1.1  mrg 
     30      1.1  mrg static void
     31      1.1  mrg special_overflow (void)
     32      1.1  mrg {
     33      1.1  mrg   mpfr_t x, y;
     34      1.1  mrg   int inex;
     35      1.1  mrg   mpfr_exp_t emin, emax;
     36      1.1  mrg 
     37      1.1  mrg   emin = mpfr_get_emin ();
     38      1.1  mrg   emax = mpfr_get_emax ();
     39      1.1  mrg 
     40      1.1  mrg   set_emin (-125);
     41      1.1  mrg   set_emax (128);
     42      1.1  mrg 
     43      1.1  mrg   mpfr_init2 (x, 24);
     44      1.1  mrg   mpfr_init2 (y, 24);
     45      1.1  mrg 
     46      1.1  mrg   mpfr_set_str_binary (x, "0.101100100000000000110100E15");
     47      1.1  mrg   inex = mpfr_exp10 (y, x, MPFR_RNDN);
     48      1.1  mrg   if (!mpfr_inf_p (y) || inex <= 0)
     49      1.1  mrg     {
     50      1.1  mrg       printf ("Overflow error.\n");
     51      1.1  mrg       mpfr_dump (y);
     52      1.1  mrg       printf ("inex = %d\n", inex);
     53      1.1  mrg       exit (1);
     54      1.1  mrg     }
     55      1.1  mrg 
     56      1.1  mrg   mpfr_clear (y);
     57      1.1  mrg   mpfr_clear (x);
     58      1.1  mrg   set_emin (emin);
     59      1.1  mrg   set_emax (emax);
     60      1.1  mrg }
     61      1.1  mrg 
     62      1.1  mrg static void
     63      1.1  mrg emax_m_eps (void)
     64      1.1  mrg {
     65      1.1  mrg   if (mpfr_get_emax () <= LONG_MAX)
     66      1.1  mrg     {
     67      1.1  mrg       mpfr_t x, y;
     68      1.1  mrg       int inex, ov;
     69      1.1  mrg 
     70      1.1  mrg       mpfr_init2 (x, sizeof(mpfr_exp_t) * CHAR_BIT * 4);
     71      1.1  mrg       mpfr_init2 (y, 8);
     72      1.1  mrg       mpfr_set_si (x, mpfr_get_emax (), MPFR_RNDN);
     73      1.1  mrg 
     74      1.1  mrg       mpfr_clear_flags ();
     75      1.1  mrg       inex = mpfr_exp10 (y, x, MPFR_RNDN);
     76      1.1  mrg       ov = mpfr_overflow_p ();
     77      1.1  mrg       if (!ov || !mpfr_inf_p (y) || inex <= 0)
     78      1.1  mrg         {
     79      1.1  mrg           printf ("Overflow error for x = emax, MPFR_RNDN.\n");
     80      1.1  mrg           mpfr_dump (y);
     81      1.1  mrg           printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
     82      1.1  mrg           exit (1);
     83      1.1  mrg         }
     84      1.1  mrg 
     85      1.1  mrg       mpfr_clear (x);
     86      1.1  mrg       mpfr_clear (y);
     87      1.1  mrg     }
     88      1.1  mrg }
     89      1.1  mrg 
     90      1.1  mrg static void
     91      1.1  mrg exp_range (void)
     92      1.1  mrg {
     93      1.1  mrg   mpfr_t x;
     94      1.1  mrg   mpfr_exp_t emin;
     95      1.1  mrg 
     96      1.1  mrg   emin = mpfr_get_emin ();
     97      1.1  mrg   set_emin (3);
     98      1.1  mrg   mpfr_init2 (x, 16);
     99      1.1  mrg   mpfr_set_ui (x, 4, MPFR_RNDN);
    100      1.1  mrg   mpfr_exp10 (x, x, MPFR_RNDN);
    101      1.1  mrg   set_emin (emin);
    102      1.1  mrg   if (mpfr_nan_p (x) || mpfr_cmp_ui (x, 10000) != 0)
    103      1.1  mrg     {
    104      1.1  mrg       printf ("Error in mpfr_exp10 for x = 4, with emin = 3\n");
    105      1.1  mrg       printf ("Expected 10000, got ");
    106      1.1  mrg       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
    107      1.1  mrg       printf ("\n");
    108      1.1  mrg       exit (1);
    109      1.1  mrg     }
    110      1.1  mrg   mpfr_clear (x);
    111      1.1  mrg }
    112      1.1  mrg 
    113      1.1  mrg static void
    114      1.1  mrg overfl_exp10_0 (void)
    115      1.1  mrg {
    116      1.1  mrg   mpfr_t x, y;
    117      1.1  mrg   int emax, i, inex, rnd, err = 0;
    118      1.1  mrg   mpfr_exp_t old_emax;
    119      1.1  mrg 
    120      1.1  mrg   old_emax = mpfr_get_emax ();
    121      1.1  mrg 
    122      1.1  mrg   mpfr_init2 (x, 8);
    123      1.1  mrg   mpfr_init2 (y, 8);
    124      1.1  mrg 
    125      1.1  mrg   for (emax = -1; emax <= 0; emax++)
    126      1.1  mrg     {
    127      1.1  mrg       mpfr_set_ui_2exp (y, 1, emax, MPFR_RNDN);
    128      1.1  mrg       mpfr_nextbelow (y);
    129      1.1  mrg       set_emax (emax);  /* 1 is not representable. */
    130      1.1  mrg       /* and if emax < 0, 1 - eps is not representable either. */
    131      1.1  mrg       for (i = -1; i <= 1; i++)
    132      1.1  mrg         RND_LOOP (rnd)
    133      1.1  mrg           {
    134      1.1  mrg             mpfr_set_si_2exp (x, i, -512 * ABS (i), MPFR_RNDN);
    135      1.1  mrg             mpfr_clear_flags ();
    136      1.1  mrg             inex = mpfr_exp10 (x, x, (mpfr_rnd_t) rnd);
    137      1.1  mrg             if ((i >= 0 || emax < 0 || rnd == MPFR_RNDN || rnd == MPFR_RNDU) &&
    138      1.1  mrg                 ! mpfr_overflow_p ())
    139      1.1  mrg               {
    140      1.1  mrg                 printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    141      1.1  mrg                         "  The overflow flag is not set.\n",
    142      1.1  mrg                         i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    143      1.1  mrg                 err = 1;
    144      1.1  mrg               }
    145      1.1  mrg             if (rnd == MPFR_RNDZ || rnd == MPFR_RNDD)
    146      1.1  mrg               {
    147      1.1  mrg                 if (inex >= 0)
    148      1.1  mrg                   {
    149      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    150      1.1  mrg                             "  The inexact value must be negative.\n",
    151      1.1  mrg                             i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    152      1.1  mrg                     err = 1;
    153      1.1  mrg                   }
    154      1.1  mrg                 if (! mpfr_equal_p (x, y))
    155      1.1  mrg                   {
    156      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    157  1.1.1.4  mrg                             "  Got        ", i,
    158  1.1.1.4  mrg                             mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    159  1.1.1.4  mrg                     mpfr_dump (x);
    160  1.1.1.4  mrg                     printf ("  instead of 0.11111111E%d.\n", emax);
    161      1.1  mrg                     err = 1;
    162      1.1  mrg                   }
    163      1.1  mrg               }
    164  1.1.1.4  mrg             else if (rnd != MPFR_RNDF)
    165      1.1  mrg               {
    166      1.1  mrg                 if (inex <= 0)
    167      1.1  mrg                   {
    168      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    169      1.1  mrg                             "  The inexact value must be positive.\n",
    170      1.1  mrg                             i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    171      1.1  mrg                     err = 1;
    172      1.1  mrg                   }
    173  1.1.1.4  mrg                 if (! (mpfr_inf_p (x) && MPFR_IS_POS (x)))
    174      1.1  mrg                   {
    175      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    176  1.1.1.4  mrg                             "  Got        ", i,
    177  1.1.1.4  mrg                             mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    178  1.1.1.4  mrg                     mpfr_dump (x);
    179  1.1.1.4  mrg                     printf ("  instead of +Inf.\n");
    180      1.1  mrg                     err = 1;
    181      1.1  mrg                   }
    182      1.1  mrg               }
    183      1.1  mrg           }
    184      1.1  mrg       set_emax (old_emax);
    185      1.1  mrg     }
    186      1.1  mrg 
    187      1.1  mrg   if (err)
    188      1.1  mrg     exit (1);
    189      1.1  mrg   mpfr_clear (x);
    190      1.1  mrg   mpfr_clear (y);
    191      1.1  mrg }
    192      1.1  mrg 
    193  1.1.1.7  mrg /* Bug in mpfr_pow_general found by ofuf_thresholds (on 2023-02-13 for
    194  1.1.1.7  mrg    a 32-bit exponent, changed on 2023-03-06 for a 64-bit exponent too),
    195  1.1.1.7  mrg    fixed in commit b62966df913f73f08b3c5252e1d0c702bc20442f.
    196  1.1.1.7  mrg    With a 32-bit exponent, failure for i=0.
    197  1.1.1.7  mrg      expected 0.1111E1073741823
    198  1.1.1.7  mrg      got      @Inf@
    199  1.1.1.7  mrg      expected flags = inexact (8)
    200  1.1.1.7  mrg      got flags      = overflow inexact (10)
    201  1.1.1.7  mrg    With a 64-bit exponent, failure for i=1.
    202  1.1.1.7  mrg      expected 0.11111111111111111111111E4611686018427387903
    203  1.1.1.7  mrg      got      @Inf@
    204  1.1.1.7  mrg      expected flags = inexact (8)
    205  1.1.1.7  mrg      got flags      = overflow inexact (10)
    206  1.1.1.7  mrg    Note: ofuf_thresholds was added to the master branch, but for the
    207  1.1.1.7  mrg    time being, there are issues with these tests.
    208  1.1.1.7  mrg */
    209  1.1.1.7  mrg static void
    210  1.1.1.7  mrg bug20230213 (void)
    211  1.1.1.7  mrg {
    212  1.1.1.7  mrg   const char *s[2] = {
    213  1.1.1.7  mrg     "0x1.34413504b3ccdbd5dd8p+28",
    214  1.1.1.7  mrg     "0x1.34413509f79fef2c4e0dd14a7ae0ecfbacdbp+60"
    215  1.1.1.7  mrg   };
    216  1.1.1.7  mrg   mpfr_t x1, x2, y1, y2;
    217  1.1.1.7  mrg   mpfr_prec_t px[2] = { 74, 147 };
    218  1.1.1.7  mrg   mpfr_prec_t py[2] = { 4, 23 };
    219  1.1.1.7  mrg   mpfr_exp_t old_emax, emax;
    220  1.1.1.7  mrg   mpfr_flags_t flags1, flags2;
    221  1.1.1.7  mrg   int i;
    222  1.1.1.7  mrg 
    223  1.1.1.7  mrg   old_emax = mpfr_get_emax ();
    224  1.1.1.7  mrg 
    225  1.1.1.7  mrg   for (i = 0; i < 2; i++)
    226  1.1.1.7  mrg     {
    227  1.1.1.7  mrg       if (i != 0)
    228  1.1.1.7  mrg         set_emax (MPFR_EMAX_MAX);
    229  1.1.1.7  mrg 
    230  1.1.1.7  mrg       emax = mpfr_get_emax ();
    231  1.1.1.7  mrg 
    232  1.1.1.7  mrg       mpfr_inits2 (px[i], x1, x2, (mpfr_ptr) 0);
    233  1.1.1.7  mrg       mpfr_inits2 (py[i], y1, y2, (mpfr_ptr) 0);
    234  1.1.1.7  mrg 
    235  1.1.1.7  mrg       mpfr_setmax (y1, emax);
    236  1.1.1.7  mrg       mpfr_log10 (x1, y1, MPFR_RNDD);
    237  1.1.1.7  mrg       mpfr_set_str (x2, s[i], 0, MPFR_RNDN);
    238  1.1.1.7  mrg       /* For i == 0, emax == 2^30, so that the value can be checked.
    239  1.1.1.7  mrg          For i != 0, check the value for the case emax == 2^62.
    240  1.1.1.7  mrg          The "0UL" ensures that the shifts are valid. */
    241  1.1.1.7  mrg       if (i == 0 || (((0UL + MPFR_EMAX_MAX) >> 31) >> 30) == 1)
    242  1.1.1.7  mrg         {
    243  1.1.1.7  mrg           /* printf ("Checking x1 for i=%d\n", i); */
    244  1.1.1.7  mrg           MPFR_ASSERTN (mpfr_equal_p (x1, x2));
    245  1.1.1.7  mrg         }
    246  1.1.1.7  mrg 
    247  1.1.1.7  mrg       /* Let MAXF be the maximum finite value (y1 above).
    248  1.1.1.7  mrg          Since x1 < log10(MAXF), one should have exp10(x1) < MAXF, and
    249  1.1.1.7  mrg          therefore, y2 = RU(exp10(x1)) <= RU(MAXF) = MAXF (no overflow). */
    250  1.1.1.7  mrg       flags1 = MPFR_FLAGS_INEXACT;
    251  1.1.1.7  mrg       mpfr_clear_flags ();
    252  1.1.1.7  mrg       mpfr_exp10 (y2, x1, MPFR_RNDU);
    253  1.1.1.7  mrg       flags2 = __gmpfr_flags;
    254  1.1.1.7  mrg 
    255  1.1.1.7  mrg       if (! (mpfr_lessequal_p (y2, y1) && flags2 == flags1))
    256  1.1.1.7  mrg         {
    257  1.1.1.7  mrg           printf ("Error in bug20230213 for i=%d\n", i);
    258  1.1.1.7  mrg           printf ("emax = %" MPFR_EXP_FSPEC "d\n", (mpfr_eexp_t) emax);
    259  1.1.1.7  mrg           printf ("expected "); mpfr_dump (y1);
    260  1.1.1.7  mrg           printf ("got      "); mpfr_dump (y2);
    261  1.1.1.7  mrg           printf ("expected flags =");
    262  1.1.1.7  mrg           flags_out (flags1);
    263  1.1.1.7  mrg           printf ("got flags      =");
    264  1.1.1.7  mrg           flags_out (flags2);
    265  1.1.1.7  mrg           exit (1);
    266  1.1.1.7  mrg         }
    267  1.1.1.7  mrg 
    268  1.1.1.7  mrg       mpfr_clears (x1, x2, y1, y2, (mpfr_ptr) 0);
    269  1.1.1.7  mrg     }
    270  1.1.1.7  mrg 
    271  1.1.1.7  mrg   set_emax (old_emax);
    272  1.1.1.7  mrg }
    273  1.1.1.7  mrg 
    274  1.1.1.7  mrg /* Bug in mpfr_pow_general in precision 1 in the particular case of
    275  1.1.1.7  mrg    rounding to nearest, z * 2^k = 2^(emin - 2) and real result larger
    276  1.1.1.7  mrg    than this value; fixed in ff5012b61d5e5fee5156c57b8aa8fc1739c2a771
    277  1.1.1.7  mrg    (which is simplified in 4f5de980be290687ac1409aa02873e9e0dd1a030);
    278  1.1.1.7  mrg    initially found by ofuf_thresholds (though the test was incorrect).
    279  1.1.1.7  mrg    With a 32-bit exponent, failure for i=0.
    280  1.1.1.7  mrg    With a 64-bit exponent, failure for i=1.
    281  1.1.1.7  mrg    The result was correct, but the underflow flag was missing.
    282  1.1.1.7  mrg    Note: ofuf_thresholds was added to the master branch, but for the
    283  1.1.1.7  mrg    time being, there are issues with these tests.
    284  1.1.1.7  mrg */
    285  1.1.1.7  mrg static void
    286  1.1.1.7  mrg bug20230427 (void)
    287  1.1.1.7  mrg {
    288  1.1.1.7  mrg   const char *s[2] = {
    289  1.1.1.7  mrg     "-0.1001101000100000100110101000011E29",
    290  1.1.1.7  mrg     "-0.100110100010000010011010100001001111101111001111111101111001101E61"
    291  1.1.1.7  mrg   };
    292  1.1.1.7  mrg   mpfr_t x, y, z, t1, t2;
    293  1.1.1.7  mrg   mpfr_exp_t old_emin;
    294  1.1.1.7  mrg   mpfr_flags_t flags, ex_flags;
    295  1.1.1.7  mrg   int i, inex;
    296  1.1.1.7  mrg 
    297  1.1.1.7  mrg   old_emin = mpfr_get_emin ();
    298  1.1.1.7  mrg 
    299  1.1.1.7  mrg   mpfr_init2 (x, 63);
    300  1.1.1.7  mrg   mpfr_inits2 (1, y, z, (mpfr_ptr) 0);
    301  1.1.1.7  mrg   mpfr_inits2 (128, t1, t2, (mpfr_ptr) 0);
    302  1.1.1.7  mrg 
    303  1.1.1.7  mrg   for (i = 0; i < 2; i++)
    304  1.1.1.7  mrg     {
    305  1.1.1.7  mrg       if (i == 0)
    306  1.1.1.7  mrg         {
    307  1.1.1.7  mrg           /* Basic check: the default emin should be -2^30 (exactly). */
    308  1.1.1.7  mrg           if (mpfr_get_emin () != -1073741823)
    309  1.1.1.7  mrg             abort ();
    310  1.1.1.7  mrg         }
    311  1.1.1.7  mrg       else
    312  1.1.1.7  mrg         {
    313  1.1.1.7  mrg           /* This test assumes that MPFR_EMIN_MIN = -2^62 (exactly).
    314  1.1.1.7  mrg              The "0UL" ensures that the shifts are valid. */
    315  1.1.1.7  mrg           if ((((0UL - MPFR_EMIN_MIN) >> 31) >> 30) != 1)
    316  1.1.1.7  mrg             break;
    317  1.1.1.7  mrg 
    318  1.1.1.7  mrg           set_emin (MPFR_EMIN_MIN);
    319  1.1.1.7  mrg         }
    320  1.1.1.7  mrg 
    321  1.1.1.7  mrg       mpfr_set_str_binary (x, s[i]);
    322  1.1.1.7  mrg 
    323  1.1.1.7  mrg       /* We will test 10^x rounded to nearest in precision 1.
    324  1.1.1.7  mrg          Check that 2^(emin - 2) < 10^x < (3/2) * 2^(emin - 2).
    325  1.1.1.7  mrg          This is approximate, but by outputting the values, one can check
    326  1.1.1.7  mrg          that one is not too close to the boundaries:
    327  1.1.1.7  mrg            emin - 2              = -4611686018427387905
    328  1.1.1.7  mrg            log2(10^x)           ~= -4611686018427387904.598
    329  1.1.1.7  mrg            emin - 2 + log2(3/2) ~= -4611686018427387904.415
    330  1.1.1.7  mrg          Thus the result should be the smallest positive number 2^(emin - 1)
    331  1.1.1.7  mrg          because 10^x is closer to this number than to 0, the midpoint being
    332  1.1.1.7  mrg          2^(emin - 2). And there should be an underflow in precision 1 because
    333  1.1.1.7  mrg          the result rounded to nearest in an unbounded exponent range should
    334  1.1.1.7  mrg          have been 2^(emin - 2), the midpoint being (3/2) * 2^(emin - 2).
    335  1.1.1.7  mrg       */
    336  1.1.1.7  mrg       mpfr_set_ui (t1, 10, MPFR_RNDN);
    337  1.1.1.7  mrg       mpfr_log2 (t2, t1, MPFR_RNDN);
    338  1.1.1.7  mrg       mpfr_mul (t1, t2, x, MPFR_RNDN);
    339  1.1.1.7  mrg       inex = mpfr_set_exp_t (t2, mpfr_get_emin () - 2, MPFR_RNDN);
    340  1.1.1.7  mrg       MPFR_ASSERTN (inex == 0);
    341  1.1.1.7  mrg       MPFR_ASSERTN (mpfr_greater_p (t1, t2));  /* log2(10^x) > emin - 2 */
    342  1.1.1.7  mrg       inex = mpfr_sub (t1, t1, t2, MPFR_RNDN);
    343  1.1.1.7  mrg       MPFR_ASSERTN (inex == 0);
    344  1.1.1.7  mrg       mpfr_set_ui (t2, 3, MPFR_RNDN);
    345  1.1.1.7  mrg       mpfr_log2 (t2, t2, MPFR_RNDN);
    346  1.1.1.7  mrg       mpfr_sub_ui (t2, t2, 1, MPFR_RNDN);  /* log2(3/2) */
    347  1.1.1.7  mrg       MPFR_ASSERTN (mpfr_less_p (t1, t2));
    348  1.1.1.7  mrg 
    349  1.1.1.7  mrg       mpfr_clear_flags ();
    350  1.1.1.7  mrg       mpfr_exp10 (y, x, MPFR_RNDN);
    351  1.1.1.7  mrg       flags = __gmpfr_flags;
    352  1.1.1.7  mrg       ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT;
    353  1.1.1.7  mrg 
    354  1.1.1.7  mrg       mpfr_setmin (z, mpfr_get_emin ());  /* z = 0.1@emin */
    355  1.1.1.7  mrg       if (! (mpfr_equal_p (y, z) && flags == ex_flags))
    356  1.1.1.7  mrg         {
    357  1.1.1.7  mrg           printf ("Error in bug20230427 for i=%d\n", i);
    358  1.1.1.7  mrg           printf ("expected "); mpfr_dump (z);
    359  1.1.1.7  mrg           printf ("got      "); mpfr_dump (y);
    360  1.1.1.7  mrg           printf ("emin =       %" MPFR_EXP_FSPEC "d\n",
    361  1.1.1.7  mrg                   (mpfr_eexp_t) mpfr_get_emin ());
    362  1.1.1.7  mrg           printf ("expected flags =");
    363  1.1.1.7  mrg           flags_out (ex_flags);
    364  1.1.1.7  mrg           printf ("got flags      =");
    365  1.1.1.7  mrg           flags_out (flags);
    366  1.1.1.7  mrg           exit (1);
    367  1.1.1.7  mrg         }
    368  1.1.1.7  mrg     }
    369  1.1.1.7  mrg 
    370  1.1.1.7  mrg   mpfr_clears (x, y, z, t1, t2, (mpfr_ptr) 0);
    371  1.1.1.7  mrg   set_emin (old_emin);
    372  1.1.1.7  mrg }
    373  1.1.1.7  mrg 
    374      1.1  mrg int
    375      1.1  mrg main (int argc, char *argv[])
    376      1.1  mrg {
    377      1.1  mrg   mpfr_t x, y;
    378      1.1  mrg   mpfr_exp_t emin, emax;
    379      1.1  mrg   int inex, ov;
    380      1.1  mrg 
    381      1.1  mrg   tests_start_mpfr ();
    382      1.1  mrg 
    383  1.1.1.7  mrg   bug20230213 ();
    384  1.1.1.7  mrg   bug20230427 ();
    385  1.1.1.7  mrg 
    386      1.1  mrg   special_overflow ();
    387      1.1  mrg   emax_m_eps ();
    388      1.1  mrg   exp_range ();
    389      1.1  mrg 
    390      1.1  mrg   mpfr_init (x);
    391      1.1  mrg   mpfr_init (y);
    392      1.1  mrg 
    393      1.1  mrg   mpfr_set_ui (x, 4, MPFR_RNDN);
    394      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    395      1.1  mrg   if (mpfr_cmp_ui (y, 10000) != 0)
    396      1.1  mrg     {
    397      1.1  mrg       printf ("Error for 10^4, MPFR_RNDN\n");
    398      1.1  mrg       exit (1);
    399      1.1  mrg     }
    400      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDD);
    401      1.1  mrg   if (mpfr_cmp_ui (y, 10000) != 0)
    402      1.1  mrg     {
    403      1.1  mrg       printf ("Error for 10^4, MPFR_RNDD\n");
    404      1.1  mrg       exit (1);
    405      1.1  mrg     }
    406      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDU);
    407      1.1  mrg   if (mpfr_cmp_ui (y, 10000) != 0)
    408      1.1  mrg     {
    409      1.1  mrg       printf ("Error for 10^4, MPFR_RNDU\n");
    410      1.1  mrg       exit (1);
    411      1.1  mrg     }
    412      1.1  mrg 
    413      1.1  mrg   mpfr_set_prec (x, 10);
    414      1.1  mrg   mpfr_set_prec (y, 10);
    415      1.1  mrg   /* save emin */
    416      1.1  mrg   emin = mpfr_get_emin ();
    417      1.1  mrg   set_emin (-11);
    418      1.1  mrg   mpfr_set_si (x, -4, MPFR_RNDN);
    419      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    420  1.1.1.4  mrg   if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
    421      1.1  mrg     {
    422      1.1  mrg       printf ("Error for emin = -11, x = -4, RNDN\n");
    423      1.1  mrg       printf ("Expected +0\n");
    424  1.1.1.4  mrg       printf ("Got      "); mpfr_dump (y);
    425      1.1  mrg       exit (1);
    426      1.1  mrg     }
    427      1.1  mrg   /* restore emin */
    428      1.1  mrg   set_emin (emin);
    429      1.1  mrg 
    430      1.1  mrg   /* save emax */
    431      1.1  mrg   emax = mpfr_get_emax ();
    432      1.1  mrg   set_emax (13);
    433      1.1  mrg   mpfr_set_ui (x, 4, MPFR_RNDN);
    434      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    435      1.1  mrg   if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
    436      1.1  mrg     {
    437      1.1  mrg       printf ("Error for emax = 13, x = 4, RNDN\n");
    438      1.1  mrg       printf ("Expected +inf\n");
    439  1.1.1.4  mrg       printf ("Got      "); mpfr_dump (y);
    440      1.1  mrg       exit (1);
    441      1.1  mrg     }
    442      1.1  mrg   /* restore emax */
    443      1.1  mrg   set_emax (emax);
    444      1.1  mrg 
    445      1.1  mrg   MPFR_SET_INF (x);
    446      1.1  mrg   MPFR_SET_POS (x);
    447      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    448      1.1  mrg   if (!MPFR_IS_INF (y))
    449      1.1  mrg     {
    450      1.1  mrg       printf ("evaluation of function in INF does not return INF\n");
    451      1.1  mrg       exit (1);
    452      1.1  mrg     }
    453      1.1  mrg 
    454      1.1  mrg   MPFR_CHANGE_SIGN (x);
    455      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    456      1.1  mrg   if (!MPFR_IS_ZERO (y))
    457      1.1  mrg     {
    458      1.1  mrg       printf ("evaluation of function in -INF does not return 0\n");
    459      1.1  mrg       exit (1);
    460      1.1  mrg     }
    461      1.1  mrg 
    462      1.1  mrg   MPFR_SET_NAN (x);
    463      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    464      1.1  mrg   if (!MPFR_IS_NAN (y))
    465      1.1  mrg     {
    466      1.1  mrg       printf ("evaluation of function in NaN does not return NaN\n");
    467      1.1  mrg       exit (1);
    468      1.1  mrg     }
    469      1.1  mrg 
    470      1.1  mrg   if ((mpfr_uexp_t) 8 << 31 != 0 ||
    471      1.1  mrg       mpfr_get_emax () <= (mpfr_uexp_t) 100000 * 100000)
    472      1.1  mrg     {
    473      1.1  mrg       /* emax <= 10000000000 */
    474      1.1  mrg       mpfr_set_prec (x, 40);
    475      1.1  mrg       mpfr_set_prec (y, 40);
    476      1.1  mrg       mpfr_set_str (x, "3010299957", 10, MPFR_RNDN);
    477      1.1  mrg       mpfr_clear_flags ();
    478      1.1  mrg       inex = mpfr_exp10 (y, x, MPFR_RNDN);
    479      1.1  mrg       ov = mpfr_overflow_p ();
    480      1.1  mrg       if (!(MPFR_IS_INF (y) && MPFR_IS_POS (y) && ov))
    481      1.1  mrg         {
    482      1.1  mrg           printf ("Overflow error for x = 3010299957, MPFR_RNDN.\n");
    483      1.1  mrg           mpfr_dump (y);
    484      1.1  mrg           printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
    485      1.1  mrg           exit (1);
    486      1.1  mrg         }
    487      1.1  mrg     }
    488      1.1  mrg 
    489  1.1.1.4  mrg   test_generic (MPFR_PREC_MIN, 100, 100);
    490      1.1  mrg 
    491      1.1  mrg   mpfr_clear (x);
    492      1.1  mrg   mpfr_clear (y);
    493      1.1  mrg 
    494      1.1  mrg   overfl_exp10_0 ();
    495      1.1  mrg 
    496      1.1  mrg   data_check ("data/exp10", mpfr_exp10, "mpfr_exp10");
    497  1.1.1.7  mrg   bad_cases (mpfr_exp10, mpfr_log10, "mpfr_exp10",
    498  1.1.1.7  mrg              0, -256, 255, 4, 128, 800, 50);
    499      1.1  mrg 
    500      1.1  mrg   tests_end_mpfr ();
    501      1.1  mrg   return 0;
    502      1.1  mrg }
    503