Home | History | Annotate | Line # | Download | only in tests
tlog_ui.c revision 1.1.1.1
      1  1.1  mrg /* Test file for mpfr_log_ui.
      2  1.1  mrg 
      3  1.1  mrg Copyright 2016-2018 Free Software Foundation, Inc.
      4  1.1  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 "mpfr-test.h"
     24  1.1  mrg 
     25  1.1  mrg static void
     26  1.1  mrg compare_with_log (unsigned long n, mpfr_prec_t p)
     27  1.1  mrg {
     28  1.1  mrg   mpfr_t x, y;
     29  1.1  mrg   int inex1, inex2;
     30  1.1  mrg   mpfr_flags_t flags1;
     31  1.1  mrg 
     32  1.1  mrg   mpfr_init2 (x, sizeof (unsigned long) * CHAR_BIT);
     33  1.1  mrg   mpfr_init2 (y, p);
     34  1.1  mrg   inex1 = mpfr_set_ui (x, n, MPFR_RNDN);
     35  1.1  mrg   MPFR_ASSERTN(inex1 == 0);
     36  1.1  mrg   inex1 = mpfr_log (y, x, MPFR_RNDN);
     37  1.1  mrg   flags1 = __gmpfr_flags;
     38  1.1  mrg   mpfr_set_prec (x, p);
     39  1.1  mrg   inex2 = mpfr_log_ui (x, n, MPFR_RNDN);
     40  1.1  mrg   MPFR_ASSERTN(inex1 == inex2);
     41  1.1  mrg   MPFR_ASSERTN(flags1 == __gmpfr_flags);
     42  1.1  mrg   MPFR_ASSERTN(mpfr_equal_p (x, y));
     43  1.1  mrg   mpfr_clears (x, y, (mpfr_ptr) 0);
     44  1.1  mrg }
     45  1.1  mrg 
     46  1.1  mrg #define TEST_FUNCTION mpfr_log_ui
     47  1.1  mrg #define ONE_ARG
     48  1.1  mrg #define ULONG_ARG1
     49  1.1  mrg #define RAND_FUNCTION(x) mpfr_set_ui (x, randlimb (), MPFR_RNDN)
     50  1.1  mrg #include "tgeneric.c"
     51  1.1  mrg 
     52  1.1  mrg #define TEST_FUNCTION mpfr_log_ui
     53  1.1  mrg 
     54  1.1  mrg int
     55  1.1  mrg main (int argc, char *argv[])
     56  1.1  mrg {
     57  1.1  mrg   unsigned int prec, yprec;
     58  1.1  mrg   int rnd;
     59  1.1  mrg   mpfr_t x, y, z, t, v;
     60  1.1  mrg   unsigned long m, n;
     61  1.1  mrg   int inex;
     62  1.1  mrg   mpfr_exp_t emin, emax;
     63  1.1  mrg   int i;
     64  1.1  mrg 
     65  1.1  mrg   tests_start_mpfr ();
     66  1.1  mrg 
     67  1.1  mrg   emin = mpfr_get_emin ();
     68  1.1  mrg   emax = mpfr_get_emax ();
     69  1.1  mrg 
     70  1.1  mrg   mpfr_inits2 (53, x, y, z, t, (mpfr_ptr) 0);
     71  1.1  mrg   mpfr_init2 (v, sizeof (unsigned long) * CHAR_BIT);
     72  1.1  mrg 
     73  1.1  mrg   if (argc >= 3) /* tlog_ui n prec [rnd] */
     74  1.1  mrg     {
     75  1.1  mrg       mpfr_set_prec (x, strtoul (argv[2], NULL, 10));
     76  1.1  mrg       TEST_FUNCTION (x, strtoul (argv[1], NULL, 10),
     77  1.1  mrg                     argc > 3 ? (mpfr_rnd_t) atoi (argv[3]) : MPFR_RNDN);
     78  1.1  mrg       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
     79  1.1  mrg       printf ("\n");
     80  1.1  mrg       goto clear_and_exit;
     81  1.1  mrg     }
     82  1.1  mrg 
     83  1.1  mrg   mpfr_set_prec (x, 33);
     84  1.1  mrg   mpfr_set_prec (y, 33);
     85  1.1  mrg   mpfr_log_ui (x, 3, MPFR_RNDZ);
     86  1.1  mrg   mpfr_set_str_binary (y, "1.0001100100111110101001111010101");
     87  1.1  mrg   if (mpfr_cmp (x, y))
     88  1.1  mrg     {
     89  1.1  mrg       printf ("Error for log(3), prec=33, MPFR_RNDZ\n");
     90  1.1  mrg       printf ("expected "); mpfr_dump (y);
     91  1.1  mrg       printf ("got      "); mpfr_dump (x);
     92  1.1  mrg       exit (1);
     93  1.1  mrg     }
     94  1.1  mrg 
     95  1.1  mrg   mpfr_set_prec (x, 60);
     96  1.1  mrg   mpfr_set_prec (y, 60);
     97  1.1  mrg   mpfr_log_ui (x, 19, MPFR_RNDU);
     98  1.1  mrg   mpfr_set_str_binary (y, "10.1111000111000110110000001100000010010110011001011000111010");
     99  1.1  mrg   if (mpfr_cmp (x, y))
    100  1.1  mrg     {
    101  1.1  mrg       printf ("Error for log(19), prec=60, MPFR_RNDU\n");
    102  1.1  mrg       printf ("expected "); mpfr_dump (y);
    103  1.1  mrg       printf ("got      "); mpfr_dump (x);
    104  1.1  mrg       exit (1);
    105  1.1  mrg     }
    106  1.1  mrg 
    107  1.1  mrg   mpfr_clear_flags ();
    108  1.1  mrg   inex = mpfr_log_ui (x, 0, MPFR_RNDN);
    109  1.1  mrg   MPFR_ASSERTN (inex == 0);
    110  1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (x));
    111  1.1  mrg   MPFR_ASSERTN (mpfr_sgn (x) < 0);
    112  1.1  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    113  1.1  mrg 
    114  1.1  mrg   mpfr_clear_flags ();
    115  1.1  mrg   inex = mpfr_log_ui (x, 1, MPFR_RNDN);
    116  1.1  mrg   MPFR_ASSERTN (inex == 0);
    117  1.1  mrg   MPFR_ASSERTN (mpfr_zero_p (x));
    118  1.1  mrg   MPFR_ASSERTN (mpfr_signbit (x) == 0);
    119  1.1  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    120  1.1  mrg 
    121  1.1  mrg   for (prec = MPFR_PREC_MIN; prec <= 100; prec++)
    122  1.1  mrg     {
    123  1.1  mrg       mpfr_set_prec (x, prec);
    124  1.1  mrg       mpfr_set_prec (z, prec);
    125  1.1  mrg       mpfr_set_prec (t, prec);
    126  1.1  mrg       yprec = prec + 20;
    127  1.1  mrg       mpfr_set_prec (y, yprec);
    128  1.1  mrg 
    129  1.1  mrg       for (m = 2; m < 130; m++)
    130  1.1  mrg         RND_LOOP (rnd)
    131  1.1  mrg           {
    132  1.1  mrg             /* Start with n = 2 to 49 (mpfr_can_round would fail for n < 2),
    133  1.1  mrg                then around ULONG_MAX/3, then around LONG_MAX, then
    134  1.1  mrg                ULONG_MAX down to ULONG_MAX-19. */
    135  1.1  mrg             n = (m < 50 ? m :
    136  1.1  mrg                  m < 80 ? ULONG_MAX/3 + m - 65 :
    137  1.1  mrg                  m < 110 ? (unsigned long) LONG_MAX + m - 95 :
    138  1.1  mrg                  ULONG_MAX - (m - 110));
    139  1.1  mrg             inex = mpfr_set_ui (v, n, MPFR_RNDN);
    140  1.1  mrg             MPFR_ASSERTN (inex == 0);
    141  1.1  mrg             mpfr_log (y, v, MPFR_RNDN);
    142  1.1  mrg             if (mpfr_can_round (y, yprec, MPFR_RNDN, MPFR_RNDZ, prec
    143  1.1  mrg                                 + (rnd == MPFR_RNDN)))
    144  1.1  mrg               {
    145  1.1  mrg                 mpfr_set (t, y, (mpfr_rnd_t) rnd);
    146  1.1  mrg                 for (i = 0; i <= 1; i++)
    147  1.1  mrg                   {
    148  1.1  mrg                     if (i)
    149  1.1  mrg                       {
    150  1.1  mrg                         mpfr_exp_t e;
    151  1.1  mrg 
    152  1.1  mrg                         if (MPFR_IS_SINGULAR (t))
    153  1.1  mrg                           break;
    154  1.1  mrg                         e = mpfr_get_exp (t);
    155  1.1  mrg                         set_emin (e);
    156  1.1  mrg                         set_emax (e);
    157  1.1  mrg                       }
    158  1.1  mrg                     TEST_FUNCTION (z, n, (mpfr_rnd_t) rnd);
    159  1.1  mrg                     if (i)
    160  1.1  mrg                       {
    161  1.1  mrg                         set_emin (emin);
    162  1.1  mrg                         set_emax (emax);
    163  1.1  mrg                       }
    164  1.1  mrg                     if (mpfr_cmp (t, z))
    165  1.1  mrg                       {
    166  1.1  mrg                         printf ("results differ for n = %lu, prec = %u,"
    167  1.1  mrg                                 " %s%s\n", n, prec,
    168  1.1  mrg                                 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd),
    169  1.1  mrg                                 i ? ", reduced exponent range" : "");
    170  1.1  mrg                         printf ("  got      ");
    171  1.1  mrg                         mpfr_dump (z);
    172  1.1  mrg                         printf ("  expected ");
    173  1.1  mrg                         mpfr_dump (t);
    174  1.1  mrg                         printf ("  approx   ");
    175  1.1  mrg                         mpfr_dump (y);
    176  1.1  mrg                         exit (1);
    177  1.1  mrg                       }
    178  1.1  mrg                   }
    179  1.1  mrg               }
    180  1.1  mrg             else
    181  1.1  mrg               {
    182  1.1  mrg                 /* We are not doing random tests. The precision increase
    183  1.1  mrg                    must have be chosen so that this case never occurs. */
    184  1.1  mrg                 printf ("mpfr_can_round failed for n = %lu, prec = %u, %s\n",
    185  1.1  mrg                         n, prec, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    186  1.1  mrg                 exit (1);
    187  1.1  mrg               }
    188  1.1  mrg           }
    189  1.1  mrg     }
    190  1.1  mrg 
    191  1.1  mrg 
    192  1.1  mrg   test_generic (MPFR_PREC_MIN, 1000, 1);
    193  1.1  mrg 
    194  1.1  mrg   for (n = 1; n < ULONG_MAX / 3; n *= 3)
    195  1.1  mrg     compare_with_log (n, 10);
    196  1.1  mrg 
    197  1.1  mrg  clear_and_exit:
    198  1.1  mrg   mpfr_clears (x, y, z, t, v, (mpfr_ptr) 0);
    199  1.1  mrg 
    200  1.1  mrg   tests_end_mpfr ();
    201  1.1  mrg   return 0;
    202  1.1  mrg }
    203