Home | History | Annotate | Line # | Download | only in tests
texp10.c revision 1.1.1.3
      1      1.1  mrg /* Test file for mpfr_exp10.
      2      1.1  mrg 
      3  1.1.1.3  mrg Copyright 2007-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 <stdio.h>
     24      1.1  mrg #include <stdlib.h>
     25      1.1  mrg #include <limits.h>
     26      1.1  mrg 
     27      1.1  mrg #include "mpfr-test.h"
     28      1.1  mrg 
     29      1.1  mrg #define TEST_FUNCTION mpfr_exp10
     30      1.1  mrg #define TEST_RANDOM_EMIN -36
     31      1.1  mrg #define TEST_RANDOM_EMAX 36
     32      1.1  mrg #include "tgeneric.c"
     33      1.1  mrg 
     34      1.1  mrg static void
     35      1.1  mrg special_overflow (void)
     36      1.1  mrg {
     37      1.1  mrg   mpfr_t x, y;
     38      1.1  mrg   int inex;
     39      1.1  mrg   mpfr_exp_t emin, emax;
     40      1.1  mrg 
     41      1.1  mrg   emin = mpfr_get_emin ();
     42      1.1  mrg   emax = mpfr_get_emax ();
     43      1.1  mrg 
     44      1.1  mrg   set_emin (-125);
     45      1.1  mrg   set_emax (128);
     46      1.1  mrg 
     47      1.1  mrg   mpfr_init2 (x, 24);
     48      1.1  mrg   mpfr_init2 (y, 24);
     49      1.1  mrg 
     50      1.1  mrg   mpfr_set_str_binary (x, "0.101100100000000000110100E15");
     51      1.1  mrg   inex = mpfr_exp10 (y, x, MPFR_RNDN);
     52      1.1  mrg   if (!mpfr_inf_p (y) || inex <= 0)
     53      1.1  mrg     {
     54      1.1  mrg       printf ("Overflow error.\n");
     55      1.1  mrg       mpfr_dump (y);
     56      1.1  mrg       printf ("inex = %d\n", inex);
     57      1.1  mrg       exit (1);
     58      1.1  mrg     }
     59      1.1  mrg 
     60      1.1  mrg   mpfr_clear (y);
     61      1.1  mrg   mpfr_clear (x);
     62      1.1  mrg   set_emin (emin);
     63      1.1  mrg   set_emax (emax);
     64      1.1  mrg }
     65      1.1  mrg 
     66      1.1  mrg static void
     67      1.1  mrg emax_m_eps (void)
     68      1.1  mrg {
     69      1.1  mrg   if (mpfr_get_emax () <= LONG_MAX)
     70      1.1  mrg     {
     71      1.1  mrg       mpfr_t x, y;
     72      1.1  mrg       int inex, ov;
     73      1.1  mrg 
     74      1.1  mrg       mpfr_init2 (x, sizeof(mpfr_exp_t) * CHAR_BIT * 4);
     75      1.1  mrg       mpfr_init2 (y, 8);
     76      1.1  mrg       mpfr_set_si (x, mpfr_get_emax (), MPFR_RNDN);
     77      1.1  mrg 
     78      1.1  mrg       mpfr_clear_flags ();
     79      1.1  mrg       inex = mpfr_exp10 (y, x, MPFR_RNDN);
     80      1.1  mrg       ov = mpfr_overflow_p ();
     81      1.1  mrg       if (!ov || !mpfr_inf_p (y) || inex <= 0)
     82      1.1  mrg         {
     83      1.1  mrg           printf ("Overflow error for x = emax, MPFR_RNDN.\n");
     84      1.1  mrg           mpfr_dump (y);
     85      1.1  mrg           printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
     86      1.1  mrg           exit (1);
     87      1.1  mrg         }
     88      1.1  mrg 
     89      1.1  mrg       mpfr_clear (x);
     90      1.1  mrg       mpfr_clear (y);
     91      1.1  mrg     }
     92      1.1  mrg }
     93      1.1  mrg 
     94      1.1  mrg static void
     95      1.1  mrg exp_range (void)
     96      1.1  mrg {
     97      1.1  mrg   mpfr_t x;
     98      1.1  mrg   mpfr_exp_t emin;
     99      1.1  mrg 
    100      1.1  mrg   emin = mpfr_get_emin ();
    101      1.1  mrg   set_emin (3);
    102      1.1  mrg   mpfr_init2 (x, 16);
    103      1.1  mrg   mpfr_set_ui (x, 4, MPFR_RNDN);
    104      1.1  mrg   mpfr_exp10 (x, x, MPFR_RNDN);
    105      1.1  mrg   set_emin (emin);
    106      1.1  mrg   if (mpfr_nan_p (x) || mpfr_cmp_ui (x, 10000) != 0)
    107      1.1  mrg     {
    108      1.1  mrg       printf ("Error in mpfr_exp10 for x = 4, with emin = 3\n");
    109      1.1  mrg       printf ("Expected 10000, got ");
    110      1.1  mrg       mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
    111      1.1  mrg       printf ("\n");
    112      1.1  mrg       exit (1);
    113      1.1  mrg     }
    114      1.1  mrg   mpfr_clear (x);
    115      1.1  mrg }
    116      1.1  mrg 
    117      1.1  mrg static void
    118      1.1  mrg overfl_exp10_0 (void)
    119      1.1  mrg {
    120      1.1  mrg   mpfr_t x, y;
    121      1.1  mrg   int emax, i, inex, rnd, err = 0;
    122      1.1  mrg   mpfr_exp_t old_emax;
    123      1.1  mrg 
    124      1.1  mrg   old_emax = mpfr_get_emax ();
    125      1.1  mrg 
    126      1.1  mrg   mpfr_init2 (x, 8);
    127      1.1  mrg   mpfr_init2 (y, 8);
    128      1.1  mrg 
    129      1.1  mrg   for (emax = -1; emax <= 0; emax++)
    130      1.1  mrg     {
    131      1.1  mrg       mpfr_set_ui_2exp (y, 1, emax, MPFR_RNDN);
    132      1.1  mrg       mpfr_nextbelow (y);
    133      1.1  mrg       set_emax (emax);  /* 1 is not representable. */
    134      1.1  mrg       /* and if emax < 0, 1 - eps is not representable either. */
    135      1.1  mrg       for (i = -1; i <= 1; i++)
    136      1.1  mrg         RND_LOOP (rnd)
    137      1.1  mrg           {
    138      1.1  mrg             mpfr_set_si_2exp (x, i, -512 * ABS (i), MPFR_RNDN);
    139      1.1  mrg             mpfr_clear_flags ();
    140      1.1  mrg             inex = mpfr_exp10 (x, x, (mpfr_rnd_t) rnd);
    141      1.1  mrg             if ((i >= 0 || emax < 0 || rnd == MPFR_RNDN || rnd == MPFR_RNDU) &&
    142      1.1  mrg                 ! mpfr_overflow_p ())
    143      1.1  mrg               {
    144      1.1  mrg                 printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    145      1.1  mrg                         "  The overflow flag is not set.\n",
    146      1.1  mrg                         i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    147      1.1  mrg                 err = 1;
    148      1.1  mrg               }
    149      1.1  mrg             if (rnd == MPFR_RNDZ || rnd == MPFR_RNDD)
    150      1.1  mrg               {
    151      1.1  mrg                 if (inex >= 0)
    152      1.1  mrg                   {
    153      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    154      1.1  mrg                             "  The inexact value must be negative.\n",
    155      1.1  mrg                             i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    156      1.1  mrg                     err = 1;
    157      1.1  mrg                   }
    158      1.1  mrg                 if (! mpfr_equal_p (x, y))
    159      1.1  mrg                   {
    160      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    161      1.1  mrg                             "  Got ", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    162      1.1  mrg                     mpfr_print_binary (x);
    163      1.1  mrg                     printf (" instead of 0.11111111E%d.\n", emax);
    164      1.1  mrg                     err = 1;
    165      1.1  mrg                   }
    166      1.1  mrg               }
    167      1.1  mrg             else
    168      1.1  mrg               {
    169      1.1  mrg                 if (inex <= 0)
    170      1.1  mrg                   {
    171      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    172      1.1  mrg                             "  The inexact value must be positive.\n",
    173      1.1  mrg                             i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    174      1.1  mrg                     err = 1;
    175      1.1  mrg                   }
    176      1.1  mrg                 if (! (mpfr_inf_p (x) && MPFR_SIGN (x) > 0))
    177      1.1  mrg                   {
    178      1.1  mrg                     printf ("Error in overfl_exp10_0 (i = %d, rnd = %s):\n"
    179      1.1  mrg                             "  Got ", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    180      1.1  mrg                     mpfr_print_binary (x);
    181      1.1  mrg                     printf (" instead of +Inf.\n");
    182      1.1  mrg                     err = 1;
    183      1.1  mrg                   }
    184      1.1  mrg               }
    185      1.1  mrg           }
    186      1.1  mrg       set_emax (old_emax);
    187      1.1  mrg     }
    188      1.1  mrg 
    189      1.1  mrg   if (err)
    190      1.1  mrg     exit (1);
    191      1.1  mrg   mpfr_clear (x);
    192      1.1  mrg   mpfr_clear (y);
    193      1.1  mrg }
    194      1.1  mrg 
    195      1.1  mrg int
    196      1.1  mrg main (int argc, char *argv[])
    197      1.1  mrg {
    198      1.1  mrg   mpfr_t x, y;
    199      1.1  mrg   mpfr_exp_t emin, emax;
    200      1.1  mrg   int inex, ov;
    201      1.1  mrg 
    202      1.1  mrg   tests_start_mpfr ();
    203      1.1  mrg 
    204      1.1  mrg   special_overflow ();
    205      1.1  mrg   emax_m_eps ();
    206      1.1  mrg   exp_range ();
    207      1.1  mrg 
    208      1.1  mrg   mpfr_init (x);
    209      1.1  mrg   mpfr_init (y);
    210      1.1  mrg 
    211      1.1  mrg   mpfr_set_ui (x, 4, MPFR_RNDN);
    212      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    213      1.1  mrg   if (mpfr_cmp_ui (y, 10000) != 0)
    214      1.1  mrg     {
    215      1.1  mrg       printf ("Error for 10^4, MPFR_RNDN\n");
    216      1.1  mrg       exit (1);
    217      1.1  mrg     }
    218      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDD);
    219      1.1  mrg   if (mpfr_cmp_ui (y, 10000) != 0)
    220      1.1  mrg     {
    221      1.1  mrg       printf ("Error for 10^4, MPFR_RNDD\n");
    222      1.1  mrg       exit (1);
    223      1.1  mrg     }
    224      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDU);
    225      1.1  mrg   if (mpfr_cmp_ui (y, 10000) != 0)
    226      1.1  mrg     {
    227      1.1  mrg       printf ("Error for 10^4, MPFR_RNDU\n");
    228      1.1  mrg       exit (1);
    229      1.1  mrg     }
    230      1.1  mrg 
    231      1.1  mrg   mpfr_set_prec (x, 10);
    232      1.1  mrg   mpfr_set_prec (y, 10);
    233      1.1  mrg   /* save emin */
    234      1.1  mrg   emin = mpfr_get_emin ();
    235      1.1  mrg   set_emin (-11);
    236      1.1  mrg   mpfr_set_si (x, -4, MPFR_RNDN);
    237      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    238      1.1  mrg   if (mpfr_cmp_ui (y, 0) || mpfr_sgn (y) < 0)
    239      1.1  mrg     {
    240      1.1  mrg       printf ("Error for emin = -11, x = -4, RNDN\n");
    241      1.1  mrg       printf ("Expected +0\n");
    242      1.1  mrg       printf ("Got      "); mpfr_print_binary (y); puts ("");
    243      1.1  mrg       exit (1);
    244      1.1  mrg     }
    245      1.1  mrg   /* restore emin */
    246      1.1  mrg   set_emin (emin);
    247      1.1  mrg 
    248      1.1  mrg   /* save emax */
    249      1.1  mrg   emax = mpfr_get_emax ();
    250      1.1  mrg   set_emax (13);
    251      1.1  mrg   mpfr_set_ui (x, 4, MPFR_RNDN);
    252      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    253      1.1  mrg   if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
    254      1.1  mrg     {
    255      1.1  mrg       printf ("Error for emax = 13, x = 4, RNDN\n");
    256      1.1  mrg       printf ("Expected +inf\n");
    257      1.1  mrg       printf ("Got      "); mpfr_print_binary (y); puts ("");
    258      1.1  mrg       exit (1);
    259      1.1  mrg     }
    260      1.1  mrg   /* restore emax */
    261      1.1  mrg   set_emax (emax);
    262      1.1  mrg 
    263      1.1  mrg   MPFR_SET_INF (x);
    264      1.1  mrg   MPFR_SET_POS (x);
    265      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    266      1.1  mrg   if (!MPFR_IS_INF (y))
    267      1.1  mrg     {
    268      1.1  mrg       printf ("evaluation of function in INF does not return INF\n");
    269      1.1  mrg       exit (1);
    270      1.1  mrg     }
    271      1.1  mrg 
    272      1.1  mrg   MPFR_CHANGE_SIGN (x);
    273      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    274      1.1  mrg   if (!MPFR_IS_ZERO (y))
    275      1.1  mrg     {
    276      1.1  mrg       printf ("evaluation of function in -INF does not return 0\n");
    277      1.1  mrg       exit (1);
    278      1.1  mrg     }
    279      1.1  mrg 
    280      1.1  mrg   MPFR_SET_NAN (x);
    281      1.1  mrg   mpfr_exp10 (y, x, MPFR_RNDN);
    282      1.1  mrg   if (!MPFR_IS_NAN (y))
    283      1.1  mrg     {
    284      1.1  mrg       printf ("evaluation of function in NaN does not return NaN\n");
    285      1.1  mrg       exit (1);
    286      1.1  mrg     }
    287      1.1  mrg 
    288      1.1  mrg   if ((mpfr_uexp_t) 8 << 31 != 0 ||
    289      1.1  mrg       mpfr_get_emax () <= (mpfr_uexp_t) 100000 * 100000)
    290      1.1  mrg     {
    291      1.1  mrg       /* emax <= 10000000000 */
    292      1.1  mrg       mpfr_set_prec (x, 40);
    293      1.1  mrg       mpfr_set_prec (y, 40);
    294      1.1  mrg       mpfr_set_str (x, "3010299957", 10, MPFR_RNDN);
    295      1.1  mrg       mpfr_clear_flags ();
    296      1.1  mrg       inex = mpfr_exp10 (y, x, MPFR_RNDN);
    297      1.1  mrg       ov = mpfr_overflow_p ();
    298      1.1  mrg       if (!(MPFR_IS_INF (y) && MPFR_IS_POS (y) && ov))
    299      1.1  mrg         {
    300      1.1  mrg           printf ("Overflow error for x = 3010299957, MPFR_RNDN.\n");
    301      1.1  mrg           mpfr_dump (y);
    302      1.1  mrg           printf ("inex = %d, %soverflow\n", inex, ov ? "" : "no ");
    303      1.1  mrg           exit (1);
    304      1.1  mrg         }
    305      1.1  mrg     }
    306      1.1  mrg 
    307      1.1  mrg   test_generic (2, 100, 100);
    308      1.1  mrg 
    309      1.1  mrg   mpfr_clear (x);
    310      1.1  mrg   mpfr_clear (y);
    311      1.1  mrg 
    312      1.1  mrg   overfl_exp10_0 ();
    313      1.1  mrg 
    314      1.1  mrg   data_check ("data/exp10", mpfr_exp10, "mpfr_exp10");
    315      1.1  mrg 
    316      1.1  mrg   tests_end_mpfr ();
    317      1.1  mrg   return 0;
    318      1.1  mrg }
    319