Home | History | Annotate | Line # | Download | only in tests
tset_sj.c revision 1.1.1.5
      1      1.1  mrg /* Test file for
      2      1.1  mrg    mpfr_set_sj, mpfr_set_uj, mpfr_set_sj_2exp and mpfr_set_uj_2exp.
      3      1.1  mrg 
      4  1.1.1.5  mrg Copyright 2004, 2006-2020 Free Software Foundation, Inc.
      5  1.1.1.3  mrg Contributed by the AriC and Caramba projects, INRIA.
      6      1.1  mrg 
      7      1.1  mrg This file is part of the GNU MPFR Library.
      8      1.1  mrg 
      9      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
     10      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     11      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     12      1.1  mrg option) any later version.
     13      1.1  mrg 
     14      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     15      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     17      1.1  mrg License for more details.
     18      1.1  mrg 
     19      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     20      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     21  1.1.1.5  mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     22      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     23      1.1  mrg 
     24  1.1.1.5  mrg #define MPFR_NEED_INTMAX_H
     25      1.1  mrg #include "mpfr-test.h"
     26      1.1  mrg 
     27      1.1  mrg #ifndef _MPFR_H_HAVE_INTMAX_T
     28  1.1.1.2  mrg 
     29      1.1  mrg int
     30      1.1  mrg main (void)
     31      1.1  mrg {
     32  1.1.1.2  mrg   return 77;
     33      1.1  mrg }
     34  1.1.1.2  mrg 
     35      1.1  mrg #else
     36      1.1  mrg 
     37  1.1.1.4  mrg #define PRINT_ERROR(str) \
     38  1.1.1.4  mrg   do { printf ("Error for %s\n", str); exit (1); } while (0)
     39      1.1  mrg 
     40      1.1  mrg static int
     41      1.1  mrg inexact_sign (int x)
     42      1.1  mrg {
     43      1.1  mrg   return (x < 0) ? -1 : (x > 0);
     44      1.1  mrg }
     45      1.1  mrg 
     46      1.1  mrg static void
     47      1.1  mrg check_set_uj (mpfr_prec_t pmin, mpfr_prec_t pmax, int N)
     48      1.1  mrg {
     49      1.1  mrg   mpfr_t x, y;
     50      1.1  mrg   mpfr_prec_t p;
     51      1.1  mrg   int inex1, inex2, n;
     52      1.1  mrg   mp_limb_t limb;
     53      1.1  mrg 
     54      1.1  mrg   mpfr_inits2 (pmax, x, y, (mpfr_ptr) 0);
     55      1.1  mrg 
     56  1.1.1.4  mrg   for (p = pmin ; p < pmax ; p++)
     57      1.1  mrg     {
     58      1.1  mrg       mpfr_set_prec (x, p);
     59      1.1  mrg       mpfr_set_prec (y, p);
     60      1.1  mrg       for (n = 0 ; n < N ; n++)
     61      1.1  mrg         {
     62      1.1  mrg           /* mp_limb_t may be unsigned long long */
     63      1.1  mrg           limb = (unsigned long) randlimb ();
     64      1.1  mrg           inex1 = mpfr_set_uj (x, limb, MPFR_RNDN);
     65      1.1  mrg           inex2 = mpfr_set_ui (y, limb, MPFR_RNDN);
     66      1.1  mrg           if (mpfr_cmp (x, y))
     67      1.1  mrg             {
     68      1.1  mrg               printf ("ERROR for mpfr_set_uj and j=%lu and p=%lu\n",
     69  1.1.1.2  mrg                       (unsigned long) limb, (unsigned long) p);
     70      1.1  mrg               printf ("X="); mpfr_dump (x);
     71      1.1  mrg               printf ("Y="); mpfr_dump (y);
     72      1.1  mrg               exit (1);
     73      1.1  mrg             }
     74      1.1  mrg           if (inexact_sign (inex1) != inexact_sign (inex2))
     75      1.1  mrg             {
     76      1.1  mrg               printf ("ERROR for inexact(set_uj): j=%lu p=%lu\n"
     77      1.1  mrg                       "Inexact1= %d Inexact2= %d\n",
     78  1.1.1.2  mrg                       (unsigned long) limb, (unsigned long) p, inex1, inex2);
     79      1.1  mrg               exit (1);
     80      1.1  mrg             }
     81      1.1  mrg         }
     82      1.1  mrg     }
     83      1.1  mrg   /* Special case */
     84      1.1  mrg   mpfr_set_prec (x, sizeof(uintmax_t)*CHAR_BIT);
     85  1.1.1.5  mrg   inex1 = mpfr_set_uj (x, UINTMAX_MAX, MPFR_RNDN);
     86      1.1  mrg   if (inex1 != 0 || mpfr_sgn(x) <= 0)
     87  1.1.1.4  mrg     PRINT_ERROR ("inexact / UINTMAX_MAX");
     88      1.1  mrg   inex1 = mpfr_add_ui (x, x, 1, MPFR_RNDN);
     89      1.1  mrg   if (inex1 != 0 || !mpfr_powerof2_raw (x)
     90  1.1.1.4  mrg       || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1)
     91  1.1.1.4  mrg     PRINT_ERROR ("power of 2");
     92      1.1  mrg   mpfr_set_uj (x, 0, MPFR_RNDN);
     93      1.1  mrg   if (!MPFR_IS_ZERO (x))
     94  1.1.1.4  mrg     PRINT_ERROR ("Setting 0");
     95      1.1  mrg 
     96      1.1  mrg   mpfr_clears (x, y, (mpfr_ptr) 0);
     97      1.1  mrg }
     98      1.1  mrg 
     99      1.1  mrg static void
    100      1.1  mrg check_set_uj_2exp (void)
    101      1.1  mrg {
    102      1.1  mrg   mpfr_t x;
    103      1.1  mrg   int inex;
    104      1.1  mrg 
    105      1.1  mrg   mpfr_init2 (x, sizeof(uintmax_t)*CHAR_BIT);
    106      1.1  mrg 
    107      1.1  mrg   inex = mpfr_set_uj_2exp (x, 1, 0, MPFR_RNDN);
    108      1.1  mrg   if (inex || mpfr_cmp_ui(x, 1))
    109  1.1.1.4  mrg     PRINT_ERROR ("(1U,0)");
    110      1.1  mrg 
    111      1.1  mrg   inex = mpfr_set_uj_2exp (x, 1024, -10, MPFR_RNDN);
    112      1.1  mrg   if (inex || mpfr_cmp_ui(x, 1))
    113  1.1.1.4  mrg     PRINT_ERROR ("(1024U,-10)");
    114      1.1  mrg 
    115      1.1  mrg   inex = mpfr_set_uj_2exp (x, 1024, 10, MPFR_RNDN);
    116      1.1  mrg   if (inex || mpfr_cmp_ui(x, 1024L * 1024L))
    117  1.1.1.4  mrg     PRINT_ERROR ("(1024U,+10)");
    118      1.1  mrg 
    119  1.1.1.5  mrg   inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, 1000, MPFR_RNDN);
    120      1.1  mrg   inex |= mpfr_div_2ui (x, x, 1000, MPFR_RNDN);
    121      1.1  mrg   inex |= mpfr_add_ui (x, x, 1, MPFR_RNDN);
    122      1.1  mrg   if (inex || !mpfr_powerof2_raw (x)
    123  1.1.1.4  mrg       || MPFR_EXP (x) != sizeof(uintmax_t) * CHAR_BIT + 1)
    124  1.1.1.4  mrg     PRINT_ERROR ("(UINTMAX_MAX)");
    125      1.1  mrg 
    126  1.1.1.5  mrg   inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, MPFR_EMAX_MAX-10, MPFR_RNDN);
    127      1.1  mrg   if (inex == 0 || !mpfr_inf_p (x))
    128  1.1.1.4  mrg     PRINT_ERROR ("Overflow");
    129      1.1  mrg 
    130  1.1.1.5  mrg   inex = mpfr_set_uj_2exp (x, UINTMAX_MAX, MPFR_EMIN_MIN-1000, MPFR_RNDN);
    131      1.1  mrg   if (inex == 0 || !MPFR_IS_ZERO (x))
    132  1.1.1.4  mrg     PRINT_ERROR ("Underflow");
    133      1.1  mrg 
    134      1.1  mrg   mpfr_clear (x);
    135      1.1  mrg }
    136      1.1  mrg 
    137      1.1  mrg static void
    138      1.1  mrg check_set_sj (void)
    139      1.1  mrg {
    140      1.1  mrg   mpfr_t x;
    141      1.1  mrg   int inex;
    142      1.1  mrg 
    143      1.1  mrg   mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
    144      1.1  mrg 
    145  1.1.1.5  mrg   inex = mpfr_set_sj (x, -INTMAX_MAX, MPFR_RNDN);
    146      1.1  mrg   inex |= mpfr_add_si (x, x, -1, MPFR_RNDN);
    147      1.1  mrg   if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
    148  1.1.1.4  mrg       || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT)
    149  1.1.1.4  mrg     PRINT_ERROR ("set_sj (-INTMAX_MAX)");
    150      1.1  mrg 
    151      1.1  mrg   inex = mpfr_set_sj (x, 1742, MPFR_RNDN);
    152      1.1  mrg   if (inex || mpfr_cmp_ui (x, 1742))
    153  1.1.1.4  mrg     PRINT_ERROR ("set_sj (1742)");
    154      1.1  mrg 
    155      1.1  mrg   mpfr_clear (x);
    156      1.1  mrg }
    157      1.1  mrg 
    158      1.1  mrg static void
    159      1.1  mrg check_set_sj_2exp (void)
    160      1.1  mrg {
    161      1.1  mrg   mpfr_t x;
    162      1.1  mrg   int inex;
    163      1.1  mrg 
    164      1.1  mrg   mpfr_init2 (x, sizeof(intmax_t)*CHAR_BIT-1);
    165      1.1  mrg 
    166  1.1.1.5  mrg   inex = mpfr_set_sj_2exp (x, INTMAX_MIN, 1000, MPFR_RNDN);
    167      1.1  mrg   if (inex || mpfr_sgn (x) >=0 || !mpfr_powerof2_raw (x)
    168  1.1.1.4  mrg       || MPFR_EXP (x) != sizeof(intmax_t) * CHAR_BIT + 1000)
    169  1.1.1.4  mrg     PRINT_ERROR ("set_sj_2exp (INTMAX_MIN)");
    170      1.1  mrg 
    171      1.1  mrg   mpfr_clear (x);
    172      1.1  mrg }
    173      1.1  mrg 
    174  1.1.1.5  mrg #define REXP 1024
    175  1.1.1.5  mrg 
    176  1.1.1.5  mrg static void
    177  1.1.1.5  mrg test_2exp_extreme_aux (void)
    178  1.1.1.5  mrg {
    179  1.1.1.5  mrg   mpfr_t x1, x2, y;
    180  1.1.1.5  mrg   mpfr_exp_t e, ep[1 + 8 * 5], eb[] =
    181  1.1.1.5  mrg     { MPFR_EMIN_MIN, -REXP, REXP, MPFR_EMAX_MAX, MPFR_EXP_MAX };
    182  1.1.1.5  mrg   mpfr_flags_t flags1, flags2;
    183  1.1.1.5  mrg   int i, j, rnd, inex1, inex2;
    184  1.1.1.5  mrg   char s;
    185  1.1.1.5  mrg 
    186  1.1.1.5  mrg   ep[0] = MPFR_EXP_MIN;
    187  1.1.1.5  mrg   for (i = 0; i < numberof(eb); i++)
    188  1.1.1.5  mrg     for (j = 0; j < 8; j++)
    189  1.1.1.5  mrg       ep[1 + 8 * i + j] = eb[i] - j;
    190  1.1.1.5  mrg 
    191  1.1.1.5  mrg   mpfr_inits2 (3, x1, x2, (mpfr_ptr) 0);
    192  1.1.1.5  mrg   mpfr_init2 (y, 32);
    193  1.1.1.5  mrg 
    194  1.1.1.5  mrg   /* The cast to int is needed if numberof(ep) is of unsigned type, in
    195  1.1.1.5  mrg      which case the condition without the cast would be always false. */
    196  1.1.1.5  mrg   for (i = -2; i < (int) numberof(ep); i++)
    197  1.1.1.5  mrg     for (j = -31; j <= 31; j++)
    198  1.1.1.5  mrg       RND_LOOP_NO_RNDF (rnd)
    199  1.1.1.5  mrg         {
    200  1.1.1.5  mrg           int sign = j < 0 ? -1 : 1;
    201  1.1.1.5  mrg           intmax_t em;
    202  1.1.1.5  mrg 
    203  1.1.1.5  mrg           if (i < 0)
    204  1.1.1.5  mrg             {
    205  1.1.1.5  mrg               em = i == -2 ? INTMAX_MIN : INTMAX_MAX;
    206  1.1.1.5  mrg               mpfr_clear_flags ();
    207  1.1.1.5  mrg               inex1 = j == 0 ?
    208  1.1.1.5  mrg                 (mpfr_set_zero (x1, +1), 0) : i == -2 ?
    209  1.1.1.5  mrg                 mpfr_underflow (x1, rnd == MPFR_RNDN ?
    210  1.1.1.5  mrg                                 MPFR_RNDZ : (mpfr_rnd_t) rnd, sign) :
    211  1.1.1.5  mrg                 mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign);
    212  1.1.1.5  mrg               flags1 = __gmpfr_flags;
    213  1.1.1.5  mrg             }
    214  1.1.1.5  mrg           else
    215  1.1.1.5  mrg             {
    216  1.1.1.5  mrg               em = ep[i];
    217  1.1.1.5  mrg               /* Compute the expected value, inex and flags */
    218  1.1.1.5  mrg               inex1 = mpfr_set_si (y, j, MPFR_RNDN);
    219  1.1.1.5  mrg               MPFR_ASSERTN (inex1 == 0);
    220  1.1.1.5  mrg               inex1 = mpfr_set (x1, y, (mpfr_rnd_t) rnd);
    221  1.1.1.5  mrg               /* x1 is the rounded value and inex1 the ternary value,
    222  1.1.1.5  mrg                  assuming that the exponent argument is 0 (this is the
    223  1.1.1.5  mrg                  rounded significand of the final result, assuming an
    224  1.1.1.5  mrg                  unbounded exponent range). The multiplication by a
    225  1.1.1.5  mrg                  power of 2 is exact, unless underflow/overflow occurs.
    226  1.1.1.5  mrg                  The tests on the exponent below avoid integer overflows
    227  1.1.1.5  mrg                  (ep[i] may take extreme values). */
    228  1.1.1.5  mrg               e = mpfr_get_exp (x1);
    229  1.1.1.5  mrg               mpfr_clear_flags ();
    230  1.1.1.5  mrg               if (j != 0 && ep[i] < __gmpfr_emin - e)  /* underflow */
    231  1.1.1.5  mrg                 {
    232  1.1.1.5  mrg                   mpfr_rnd_t r =
    233  1.1.1.5  mrg                     (rnd == MPFR_RNDN &&
    234  1.1.1.5  mrg                      (ep[i] < __gmpfr_emin - mpfr_get_exp (y) - 1 ||
    235  1.1.1.5  mrg                       IS_POW2 (sign * j))) ?
    236  1.1.1.5  mrg                     MPFR_RNDZ : (mpfr_rnd_t) rnd;
    237  1.1.1.5  mrg                   inex1 = mpfr_underflow (x1, r, sign);
    238  1.1.1.5  mrg                   flags1 = __gmpfr_flags;
    239  1.1.1.5  mrg                 }
    240  1.1.1.5  mrg               else if (j != 0 && ep[i] > __gmpfr_emax - e)  /* overflow */
    241  1.1.1.5  mrg                 {
    242  1.1.1.5  mrg                   inex1 = mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign);
    243  1.1.1.5  mrg                   flags1 = __gmpfr_flags;
    244  1.1.1.5  mrg                 }
    245  1.1.1.5  mrg               else
    246  1.1.1.5  mrg                 {
    247  1.1.1.5  mrg                   if (j != 0)
    248  1.1.1.5  mrg                     mpfr_set_exp (x1, ep[i] + e);
    249  1.1.1.5  mrg                   flags1 = inex1 != 0 ? MPFR_FLAGS_INEXACT : 0;
    250  1.1.1.5  mrg                 }
    251  1.1.1.5  mrg             }
    252  1.1.1.5  mrg 
    253  1.1.1.5  mrg           /* Test mpfr_set_sj_2exp */
    254  1.1.1.5  mrg           mpfr_clear_flags ();
    255  1.1.1.5  mrg           inex2 = mpfr_set_sj_2exp (x2, j, em, (mpfr_rnd_t) rnd);
    256  1.1.1.5  mrg           flags2 = __gmpfr_flags;
    257  1.1.1.5  mrg 
    258  1.1.1.5  mrg           if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) &&
    259  1.1.1.5  mrg                  mpfr_equal_p (x1, x2)))
    260  1.1.1.5  mrg             {
    261  1.1.1.5  mrg               s = 's';
    262  1.1.1.5  mrg               goto err_extreme;
    263  1.1.1.5  mrg             }
    264  1.1.1.5  mrg 
    265  1.1.1.5  mrg           if (j < 0)
    266  1.1.1.5  mrg             continue;
    267  1.1.1.5  mrg 
    268  1.1.1.5  mrg           /* Test mpfr_set_uj_2exp */
    269  1.1.1.5  mrg           mpfr_clear_flags ();
    270  1.1.1.5  mrg           inex2 = mpfr_set_uj_2exp (x2, j, em, (mpfr_rnd_t) rnd);
    271  1.1.1.5  mrg           flags2 = __gmpfr_flags;
    272  1.1.1.5  mrg 
    273  1.1.1.5  mrg           if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) &&
    274  1.1.1.5  mrg                  mpfr_equal_p (x1, x2)))
    275  1.1.1.5  mrg             {
    276  1.1.1.5  mrg               s = 'u';
    277  1.1.1.5  mrg             err_extreme:
    278  1.1.1.5  mrg               printf ("Error in extreme mpfr_set_%cj_2exp for i=%d j=%d %s\n",
    279  1.1.1.5  mrg                       s, i, j, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    280  1.1.1.5  mrg               printf ("emin=%" MPFR_EXP_FSPEC "d "
    281  1.1.1.5  mrg                       "emax=%" MPFR_EXP_FSPEC "d\n",
    282  1.1.1.5  mrg                       (mpfr_eexp_t) __gmpfr_emin,
    283  1.1.1.5  mrg                       (mpfr_eexp_t) __gmpfr_emax);
    284  1.1.1.5  mrg #ifndef NPRINTF_J
    285  1.1.1.5  mrg               printf ("e = %jd\n", em);
    286  1.1.1.5  mrg #endif
    287  1.1.1.5  mrg               printf ("Expected ");
    288  1.1.1.5  mrg               mpfr_dump (x1);
    289  1.1.1.5  mrg               printf ("with inex = %d and flags =", inex1);
    290  1.1.1.5  mrg               flags_out (flags1);
    291  1.1.1.5  mrg               printf ("Got      ");
    292  1.1.1.5  mrg               mpfr_dump (x2);
    293  1.1.1.5  mrg               printf ("with inex = %d and flags =", inex2);
    294  1.1.1.5  mrg               flags_out (flags2);
    295  1.1.1.5  mrg               exit (1);
    296  1.1.1.5  mrg             }
    297  1.1.1.5  mrg         }
    298  1.1.1.5  mrg 
    299  1.1.1.5  mrg   mpfr_clears (x1, x2, y, (mpfr_ptr) 0);
    300  1.1.1.5  mrg }
    301  1.1.1.5  mrg 
    302  1.1.1.5  mrg static void
    303  1.1.1.5  mrg test_2exp_extreme (void)
    304  1.1.1.5  mrg {
    305  1.1.1.5  mrg   mpfr_exp_t emin, emax;
    306  1.1.1.5  mrg 
    307  1.1.1.5  mrg   emin = mpfr_get_emin ();
    308  1.1.1.5  mrg   emax = mpfr_get_emax ();
    309  1.1.1.5  mrg 
    310  1.1.1.5  mrg   set_emin (MPFR_EMIN_MIN);
    311  1.1.1.5  mrg   set_emax (MPFR_EMAX_MAX);
    312  1.1.1.5  mrg   test_2exp_extreme_aux ();
    313  1.1.1.5  mrg 
    314  1.1.1.5  mrg   set_emin (-REXP);
    315  1.1.1.5  mrg   set_emax (REXP);
    316  1.1.1.5  mrg   test_2exp_extreme_aux ();
    317  1.1.1.5  mrg 
    318  1.1.1.5  mrg   set_emin (emin);
    319  1.1.1.5  mrg   set_emax (emax);
    320  1.1.1.5  mrg }
    321  1.1.1.5  mrg 
    322      1.1  mrg int
    323      1.1  mrg main (int argc, char *argv[])
    324      1.1  mrg {
    325      1.1  mrg   tests_start_mpfr ();
    326      1.1  mrg 
    327      1.1  mrg   check_set_uj (2, 128, 50);
    328      1.1  mrg   check_set_uj_2exp ();
    329      1.1  mrg   check_set_sj ();
    330      1.1  mrg   check_set_sj_2exp ();
    331  1.1.1.5  mrg   test_2exp_extreme ();
    332      1.1  mrg 
    333      1.1  mrg   tests_end_mpfr ();
    334      1.1  mrg   return 0;
    335      1.1  mrg }
    336      1.1  mrg 
    337      1.1  mrg #endif
    338