Home | History | Annotate | Line # | Download | only in tests
      1  1.1.1.4  mrg /* Test file for mpfr_set_si, mpfr_set_ui, mpfr_get_si and mpfr_get_ui.
      2      1.1  mrg 
      3  1.1.1.6  mrg Copyright 1999, 2001-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.1.4  mrg #define PRINT_ERROR(str) \
     26  1.1.1.4  mrg   do { printf ("Error for %s\n", str); exit (1); } while (0)
     27      1.1  mrg 
     28      1.1  mrg static void
     29      1.1  mrg test_2exp (void)
     30      1.1  mrg {
     31      1.1  mrg   mpfr_t x;
     32      1.1  mrg   int res;
     33      1.1  mrg 
     34      1.1  mrg   mpfr_init2 (x, 32);
     35      1.1  mrg 
     36      1.1  mrg   mpfr_set_ui_2exp (x, 1, 0, MPFR_RNDN);
     37  1.1.1.4  mrg   if (mpfr_cmp_ui (x, 1) != 0)
     38  1.1.1.4  mrg     PRINT_ERROR ("(1U,0)");
     39      1.1  mrg 
     40      1.1  mrg   mpfr_set_ui_2exp (x, 1024, -10, MPFR_RNDN);
     41  1.1.1.4  mrg   if (mpfr_cmp_ui(x, 1) != 0)
     42  1.1.1.4  mrg     PRINT_ERROR ("(1024U,-10)");
     43      1.1  mrg 
     44      1.1  mrg   mpfr_set_ui_2exp (x, 1024, 10, MPFR_RNDN);
     45  1.1.1.4  mrg   if (mpfr_cmp_ui (x, 1024 * 1024) != 0)
     46  1.1.1.4  mrg     PRINT_ERROR ("(1024U,+10)");
     47      1.1  mrg 
     48      1.1  mrg   mpfr_set_si_2exp (x, -1024L * 1024L, -10, MPFR_RNDN);
     49  1.1.1.4  mrg   if (mpfr_cmp_si (x, -1024) != 0)
     50  1.1.1.4  mrg     PRINT_ERROR ("(1M,-10)");
     51      1.1  mrg 
     52      1.1  mrg   mpfr_set_ui_2exp (x, 0x92345678, 16, MPFR_RNDN);
     53  1.1.1.4  mrg   if (mpfr_cmp_str (x, "92345678@4", 16, MPFR_RNDN) != 0)
     54  1.1.1.4  mrg     PRINT_ERROR ("(x92345678U,+16)");
     55      1.1  mrg 
     56      1.1  mrg   mpfr_set_si_2exp (x, -0x1ABCDEF0, -256, MPFR_RNDN);
     57  1.1.1.4  mrg   if (mpfr_cmp_str (x, "-1ABCDEF0@-64", 16, MPFR_RNDN) != 0)
     58  1.1.1.4  mrg     PRINT_ERROR ("(-x1ABCDEF0,-256)");
     59      1.1  mrg 
     60      1.1  mrg   mpfr_set_prec (x, 2);
     61      1.1  mrg   res = mpfr_set_si_2exp (x, 7, 10, MPFR_RNDU);
     62  1.1.1.4  mrg   if (mpfr_cmp_ui (x, 1<<13) != 0 || res <= 0)
     63  1.1.1.4  mrg     PRINT_ERROR ("Prec 2 + si_2exp");
     64      1.1  mrg 
     65      1.1  mrg   res = mpfr_set_ui_2exp (x, 7, 10, MPFR_RNDU);
     66  1.1.1.4  mrg   if (mpfr_cmp_ui (x, 1<<13) != 0 || res <= 0)
     67  1.1.1.4  mrg     PRINT_ERROR ("Prec 2 + ui_2exp");
     68      1.1  mrg 
     69      1.1  mrg   mpfr_clear_flags ();
     70      1.1  mrg   mpfr_set_ui_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN);
     71      1.1  mrg   if (!mpfr_inf_p (x) || MPFR_IS_NEG (x))
     72  1.1.1.4  mrg     PRINT_ERROR ("mpfr_set_ui_2exp and overflow (bad result)");
     73      1.1  mrg   if (!mpfr_overflow_p ())
     74  1.1.1.4  mrg     PRINT_ERROR ("mpfr_set_ui_2exp and overflow (overflow flag not set)");
     75      1.1  mrg 
     76      1.1  mrg   mpfr_clear_flags ();
     77      1.1  mrg   mpfr_set_si_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN);
     78      1.1  mrg   if (!mpfr_inf_p (x) || MPFR_IS_NEG (x))
     79  1.1.1.4  mrg     PRINT_ERROR ("mpfr_set_si_2exp (pos) and overflow (bad result)");
     80      1.1  mrg   if (!mpfr_overflow_p ())
     81  1.1.1.4  mrg     PRINT_ERROR ("mpfr_set_si_2exp (pos) and overflow (overflow flag not set)");
     82      1.1  mrg 
     83      1.1  mrg   mpfr_clear_flags ();
     84      1.1  mrg   mpfr_set_si_2exp (x, -17, MPFR_EMAX_MAX, MPFR_RNDN);
     85      1.1  mrg   if (!mpfr_inf_p (x) || MPFR_IS_POS (x))
     86  1.1.1.4  mrg     PRINT_ERROR ("mpfr_set_si_2exp (neg) and overflow (bad result)");
     87      1.1  mrg   if (!mpfr_overflow_p ())
     88  1.1.1.4  mrg     PRINT_ERROR ("mpfr_set_si_2exp (neg) and overflow (overflow flag not set)");
     89      1.1  mrg 
     90      1.1  mrg   mpfr_clear (x);
     91      1.1  mrg }
     92      1.1  mrg 
     93  1.1.1.5  mrg #define REXP 1024
     94  1.1.1.5  mrg 
     95  1.1.1.5  mrg static void
     96  1.1.1.5  mrg test_2exp_extreme_aux (void)
     97  1.1.1.5  mrg {
     98  1.1.1.5  mrg   mpfr_t x1, x2, y;
     99  1.1.1.5  mrg   mpfr_exp_t e, ep[1 + 8 * 5], eb[] =
    100  1.1.1.5  mrg     { MPFR_EMIN_MIN, -REXP, REXP, MPFR_EMAX_MAX, MPFR_EXP_MAX };
    101  1.1.1.5  mrg   mpfr_flags_t flags1, flags2;
    102  1.1.1.5  mrg   int i, j, rnd, inex1, inex2;
    103  1.1.1.5  mrg   char s;
    104  1.1.1.5  mrg 
    105  1.1.1.5  mrg   ep[0] = MPFR_EXP_MIN;
    106  1.1.1.5  mrg   for (i = 0; i < numberof(eb); i++)
    107  1.1.1.5  mrg     for (j = 0; j < 8; j++)
    108  1.1.1.5  mrg       ep[1 + 8 * i + j] = eb[i] - j;
    109  1.1.1.5  mrg 
    110  1.1.1.5  mrg   mpfr_inits2 (3, x1, x2, (mpfr_ptr) 0);
    111  1.1.1.5  mrg   mpfr_init2 (y, 32);
    112  1.1.1.5  mrg 
    113  1.1.1.5  mrg   for (i = 0; i < numberof(ep); i++)
    114  1.1.1.5  mrg     for (j = -31; j <= 31; j++)
    115  1.1.1.5  mrg       RND_LOOP_NO_RNDF (rnd)
    116  1.1.1.5  mrg         {
    117  1.1.1.5  mrg           int sign = j < 0 ? -1 : 1;
    118  1.1.1.5  mrg 
    119  1.1.1.5  mrg           /* Compute the expected value, inex and flags */
    120  1.1.1.5  mrg           inex1 = mpfr_set_si (y, j, MPFR_RNDN);
    121  1.1.1.5  mrg           MPFR_ASSERTN (inex1 == 0);
    122  1.1.1.5  mrg           inex1 = mpfr_set (x1, y, (mpfr_rnd_t) rnd);
    123  1.1.1.5  mrg           /* x1 is the rounded value and inex1 the ternary value,
    124  1.1.1.5  mrg              assuming that the exponent argument is 0 (this is the
    125  1.1.1.5  mrg              rounded significand of the final result, assuming an
    126  1.1.1.5  mrg              unbounded exponent range). The multiplication by a
    127  1.1.1.5  mrg              power of 2 is exact, unless underflow/overflow occurs.
    128  1.1.1.5  mrg              The tests on the exponent below avoid integer overflows
    129  1.1.1.5  mrg              (ep[i] may take extreme values). */
    130  1.1.1.5  mrg           mpfr_clear_flags ();
    131  1.1.1.6  mrg           if (j == 0)
    132  1.1.1.6  mrg             goto zero;
    133  1.1.1.6  mrg           e = MPFR_GET_EXP (x1);
    134  1.1.1.6  mrg           if (ep[i] < __gmpfr_emin - e)  /* underflow */
    135  1.1.1.5  mrg             {
    136  1.1.1.5  mrg               mpfr_rnd_t r =
    137  1.1.1.5  mrg                 (rnd == MPFR_RNDN &&
    138  1.1.1.6  mrg                  (ep[i] < __gmpfr_emin - MPFR_GET_EXP (y) - 1 ||
    139  1.1.1.5  mrg                   IS_POW2 (sign * j))) ?
    140  1.1.1.5  mrg                 MPFR_RNDZ : (mpfr_rnd_t) rnd;
    141  1.1.1.5  mrg               inex1 = mpfr_underflow (x1, r, sign);
    142  1.1.1.5  mrg               flags1 = __gmpfr_flags;
    143  1.1.1.5  mrg             }
    144  1.1.1.6  mrg           else if (ep[i] > __gmpfr_emax - e)  /* overflow */
    145  1.1.1.5  mrg             {
    146  1.1.1.5  mrg               inex1 = mpfr_overflow (x1, (mpfr_rnd_t) rnd, sign);
    147  1.1.1.5  mrg               flags1 = __gmpfr_flags;
    148  1.1.1.5  mrg             }
    149  1.1.1.5  mrg           else
    150  1.1.1.5  mrg             {
    151  1.1.1.6  mrg               mpfr_set_exp (x1, ep[i] + e);
    152  1.1.1.6  mrg             zero:
    153  1.1.1.5  mrg               flags1 = inex1 != 0 ? MPFR_FLAGS_INEXACT : 0;
    154  1.1.1.5  mrg             }
    155  1.1.1.5  mrg 
    156  1.1.1.5  mrg           /* Test mpfr_set_si_2exp */
    157  1.1.1.5  mrg           mpfr_clear_flags ();
    158  1.1.1.5  mrg           inex2 = mpfr_set_si_2exp (x2, j, ep[i], (mpfr_rnd_t) rnd);
    159  1.1.1.5  mrg           flags2 = __gmpfr_flags;
    160  1.1.1.5  mrg 
    161  1.1.1.5  mrg           if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) &&
    162  1.1.1.5  mrg                  mpfr_equal_p (x1, x2)))
    163  1.1.1.5  mrg             {
    164  1.1.1.5  mrg               s = 's';
    165  1.1.1.5  mrg               goto err_extreme;
    166  1.1.1.5  mrg             }
    167  1.1.1.5  mrg 
    168  1.1.1.5  mrg           if (j < 0)
    169  1.1.1.5  mrg             continue;
    170  1.1.1.5  mrg 
    171  1.1.1.5  mrg           /* Test mpfr_set_ui_2exp */
    172  1.1.1.5  mrg           mpfr_clear_flags ();
    173  1.1.1.5  mrg           inex2 = mpfr_set_ui_2exp (x2, j, ep[i], (mpfr_rnd_t) rnd);
    174  1.1.1.5  mrg           flags2 = __gmpfr_flags;
    175  1.1.1.5  mrg 
    176  1.1.1.5  mrg           if (! (flags1 == flags2 && SAME_SIGN (inex1, inex2) &&
    177  1.1.1.5  mrg                  mpfr_equal_p (x1, x2)))
    178  1.1.1.5  mrg             {
    179  1.1.1.5  mrg               s = 'u';
    180  1.1.1.5  mrg             err_extreme:
    181  1.1.1.5  mrg               printf ("Error in extreme mpfr_set_%ci_2exp for i=%d j=%d %s\n",
    182  1.1.1.5  mrg                       s, i, j, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
    183  1.1.1.5  mrg               printf ("emin=%" MPFR_EXP_FSPEC "d "
    184  1.1.1.5  mrg                       "emax=%" MPFR_EXP_FSPEC "d\n",
    185  1.1.1.5  mrg                       (mpfr_eexp_t) __gmpfr_emin,
    186  1.1.1.5  mrg                       (mpfr_eexp_t) __gmpfr_emax);
    187  1.1.1.5  mrg               printf ("ep[%d] = %" MPFR_EXP_FSPEC "d\n",
    188  1.1.1.5  mrg                       i, (mpfr_eexp_t) ep[i]);
    189  1.1.1.5  mrg               printf ("Expected ");
    190  1.1.1.5  mrg               mpfr_dump (x1);
    191  1.1.1.5  mrg               printf ("with inex = %d and flags =", inex1);
    192  1.1.1.5  mrg               flags_out (flags1);
    193  1.1.1.5  mrg               printf ("Got      ");
    194  1.1.1.5  mrg               mpfr_dump (x2);
    195  1.1.1.5  mrg               printf ("with inex = %d and flags =", inex2);
    196  1.1.1.5  mrg               flags_out (flags2);
    197  1.1.1.5  mrg               exit (1);
    198  1.1.1.5  mrg             }
    199  1.1.1.5  mrg         }
    200  1.1.1.5  mrg 
    201  1.1.1.5  mrg   mpfr_clears (x1, x2, y, (mpfr_ptr) 0);
    202  1.1.1.5  mrg }
    203  1.1.1.5  mrg 
    204  1.1.1.5  mrg static void
    205  1.1.1.5  mrg test_2exp_extreme (void)
    206  1.1.1.5  mrg {
    207  1.1.1.5  mrg   mpfr_exp_t emin, emax;
    208  1.1.1.5  mrg 
    209  1.1.1.5  mrg   emin = mpfr_get_emin ();
    210  1.1.1.5  mrg   emax = mpfr_get_emax ();
    211  1.1.1.5  mrg 
    212  1.1.1.5  mrg   set_emin (MPFR_EMIN_MIN);
    213  1.1.1.5  mrg   set_emax (MPFR_EMAX_MAX);
    214  1.1.1.5  mrg   test_2exp_extreme_aux ();
    215  1.1.1.5  mrg 
    216  1.1.1.5  mrg   set_emin (-REXP);
    217  1.1.1.5  mrg   set_emax (REXP);
    218  1.1.1.5  mrg   test_2exp_extreme_aux ();
    219  1.1.1.5  mrg 
    220  1.1.1.5  mrg   set_emin (emin);
    221  1.1.1.5  mrg   set_emax (emax);
    222  1.1.1.5  mrg }
    223  1.1.1.5  mrg 
    224      1.1  mrg static void
    225      1.1  mrg test_macros (void)
    226      1.1  mrg {
    227      1.1  mrg   mpfr_t x[3];
    228      1.1  mrg   mpfr_ptr p;
    229      1.1  mrg   int r;
    230      1.1  mrg 
    231  1.1.1.4  mrg   /* Note: the ++'s below allow one to check that the corresponding
    232  1.1.1.4  mrg      arguments are evaluated only once by the macros. */
    233  1.1.1.4  mrg 
    234      1.1  mrg   mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0);
    235      1.1  mrg   p = x[0];
    236      1.1  mrg   r = 0;
    237      1.1  mrg   mpfr_set_ui (p++, 0, (mpfr_rnd_t) r++);
    238      1.1  mrg   if (p != x[1] || r != 1)
    239      1.1  mrg     {
    240      1.1  mrg       printf ("Error in mpfr_set_ui macro: p - x[0] = %d (expecting 1), "
    241      1.1  mrg               "r = %d (expecting 1)\n", (int) (p - x[0]), r);
    242      1.1  mrg       exit (1);
    243      1.1  mrg     }
    244      1.1  mrg   p = x[0];
    245      1.1  mrg   r = 0;
    246      1.1  mrg   mpfr_set_si (p++, 0, (mpfr_rnd_t) r++);
    247      1.1  mrg   if (p != x[1] || r != 1)
    248      1.1  mrg     {
    249      1.1  mrg       printf ("Error in mpfr_set_si macro: p - x[0] = %d (expecting 1), "
    250      1.1  mrg               "r = %d (expecting 1)\n", (int) (p - x[0]), r);
    251      1.1  mrg       exit (1);
    252      1.1  mrg     }
    253      1.1  mrg   mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0);
    254      1.1  mrg }
    255      1.1  mrg 
    256  1.1.1.2  mrg static void
    257  1.1.1.2  mrg test_macros_keyword (void)
    258  1.1.1.2  mrg {
    259  1.1.1.2  mrg   mpfr_t x;
    260  1.1.1.2  mrg   unsigned long i;
    261  1.1.1.2  mrg 
    262  1.1.1.2  mrg   mpfr_init2 (x, 64);
    263  1.1.1.2  mrg #define MKN 0x1000000
    264  1.1.1.2  mrg #define long short
    265  1.1.1.2  mrg   mpfr_set_ui (x, MKN, MPFR_RNDN);
    266  1.1.1.2  mrg #undef long
    267  1.1.1.2  mrg   i = mpfr_get_ui (x, MPFR_RNDN);
    268  1.1.1.2  mrg   if (i != MKN)
    269  1.1.1.2  mrg     {
    270  1.1.1.2  mrg       printf ("Error in test_macros_keyword: expected 0x%lx, got 0x%lx.\n",
    271  1.1.1.2  mrg               (unsigned long) MKN, i);
    272  1.1.1.2  mrg       exit (1);
    273  1.1.1.2  mrg     }
    274  1.1.1.2  mrg   mpfr_clear (x);
    275  1.1.1.2  mrg }
    276  1.1.1.2  mrg 
    277  1.1.1.4  mrg static void
    278  1.1.1.4  mrg test_get_ui_smallneg (void)
    279  1.1.1.4  mrg {
    280  1.1.1.4  mrg   mpfr_t x;
    281  1.1.1.4  mrg   int i;
    282  1.1.1.4  mrg 
    283  1.1.1.4  mrg   mpfr_init2 (x, 64);
    284  1.1.1.4  mrg 
    285  1.1.1.4  mrg   for (i = 1; i <= 4; i++)
    286  1.1.1.4  mrg     {
    287  1.1.1.4  mrg       int r;
    288  1.1.1.4  mrg 
    289  1.1.1.4  mrg       mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN);
    290  1.1.1.4  mrg       RND_LOOP (r)
    291  1.1.1.4  mrg         {
    292  1.1.1.4  mrg           long s;
    293  1.1.1.4  mrg           unsigned long u;
    294  1.1.1.4  mrg 
    295  1.1.1.4  mrg           mpfr_clear_erangeflag ();
    296  1.1.1.4  mrg           s = mpfr_get_si (x, r != MPFR_RNDF ? (mpfr_rnd_t) r : MPFR_RNDA);
    297  1.1.1.4  mrg           if (mpfr_erangeflag_p ())
    298  1.1.1.4  mrg             {
    299  1.1.1.4  mrg               printf ("ERROR for get_si + ERANGE + small negative op"
    300  1.1.1.4  mrg                       " for rnd = %s and x = -%d/4\n",
    301  1.1.1.4  mrg                       mpfr_print_rnd_mode ((mpfr_rnd_t) r), i);
    302  1.1.1.4  mrg               exit (1);
    303  1.1.1.4  mrg             }
    304  1.1.1.4  mrg           u = mpfr_get_ui (x, (mpfr_rnd_t) r);
    305  1.1.1.4  mrg           if (u != 0)
    306  1.1.1.4  mrg             {
    307  1.1.1.4  mrg               printf ("ERROR for get_ui + ERANGE + small negative op"
    308  1.1.1.4  mrg                       " for rnd = %s and x = -%d/4\n",
    309  1.1.1.4  mrg                       mpfr_print_rnd_mode ((mpfr_rnd_t) r), i);
    310  1.1.1.4  mrg               printf ("Expected 0, got %lu\n", u);
    311  1.1.1.4  mrg               exit (1);
    312  1.1.1.4  mrg             }
    313  1.1.1.4  mrg           if ((s == 0) ^ !mpfr_erangeflag_p ())
    314  1.1.1.4  mrg             {
    315  1.1.1.4  mrg               const char *Not = s == 0 ? "" : " not";
    316  1.1.1.4  mrg 
    317  1.1.1.4  mrg               printf ("ERROR for get_ui + ERANGE + small negative op"
    318  1.1.1.4  mrg                       " for rnd = %s and x = -%d/4\n",
    319  1.1.1.4  mrg                       mpfr_print_rnd_mode ((mpfr_rnd_t) r), i);
    320  1.1.1.4  mrg               printf ("The rounding integer (%ld) is%s representable in "
    321  1.1.1.4  mrg                       "unsigned long,\nbut the erange flag is%s set.\n",
    322  1.1.1.4  mrg                       s, Not, Not);
    323  1.1.1.4  mrg               exit (1);
    324  1.1.1.4  mrg             }
    325  1.1.1.4  mrg         }
    326  1.1.1.4  mrg     }
    327  1.1.1.4  mrg 
    328  1.1.1.4  mrg   mpfr_clear (x);
    329  1.1.1.4  mrg }
    330  1.1.1.4  mrg 
    331  1.1.1.4  mrg /* Test mpfr_get_si and mpfr_get_ui, on values around some particular
    332  1.1.1.4  mrg  * integers (see ts[] and tu[]): x = t?[i] + j/4, where '?' is 's' or
    333  1.1.1.4  mrg  * 'u', and j is an integer from -8 to 8.
    334  1.1.1.4  mrg  */
    335  1.1.1.4  mrg static void get_tests (void)
    336  1.1.1.4  mrg {
    337  1.1.1.4  mrg   mpfr_exp_t emin, emax;
    338  1.1.1.4  mrg   mpfr_t x, z;
    339  1.1.1.4  mrg   long ts[5] = { LONG_MIN, LONG_MAX, -17, 0, 17 };
    340  1.1.1.4  mrg   unsigned long tu[3] = { 0, ULONG_MAX, 17 };
    341  1.1.1.4  mrg   int s, i, j, odd, ctr = 0;
    342  1.1.1.4  mrg   int inex;
    343  1.1.1.4  mrg   int r;
    344  1.1.1.4  mrg 
    345  1.1.1.4  mrg   emin = mpfr_get_emin ();
    346  1.1.1.4  mrg   emax = mpfr_get_emax ();
    347  1.1.1.4  mrg 
    348  1.1.1.4  mrg   /* We need the bitsize of an unsigned long + 3 bits (1 additional bit for
    349  1.1.1.4  mrg    * the cases >= ULONG_MAX + 1; 2 additional bits for the fractional part).
    350  1.1.1.4  mrg    */
    351  1.1.1.4  mrg   mpfr_init2 (x, sizeof (unsigned long) * CHAR_BIT + 3);
    352  1.1.1.4  mrg 
    353  1.1.1.4  mrg   mpfr_init2 (z, MPFR_PREC_MIN);
    354  1.1.1.4  mrg   mpfr_set_ui_2exp (z, 1, -2, MPFR_RNDN);  /* z = 1/4 */
    355  1.1.1.4  mrg 
    356  1.1.1.4  mrg   for (s = 1; s >= 0; s--)
    357  1.1.1.4  mrg     for (i = 0; i < (s ? 5 : 3); i++)
    358  1.1.1.4  mrg       {
    359  1.1.1.4  mrg         odd = (s ? (unsigned long) ts[i] : tu[i]) & 1;
    360  1.1.1.4  mrg         inex = s ?
    361  1.1.1.4  mrg           mpfr_set_si (x, ts[i], MPFR_RNDN) :
    362  1.1.1.4  mrg           mpfr_set_ui (x, tu[i], MPFR_RNDN);
    363  1.1.1.4  mrg         MPFR_ASSERTN (inex == 0);
    364  1.1.1.4  mrg         inex = mpfr_sub_ui (x, x, 2, MPFR_RNDN);
    365  1.1.1.4  mrg         MPFR_ASSERTN (inex == 0);
    366  1.1.1.4  mrg         for (j = -8; j <= 8; j++)
    367  1.1.1.4  mrg           {
    368  1.1.1.4  mrg             /* Test x = t?[i] + j/4 in each non-RNDF rounding mode... */
    369  1.1.1.4  mrg             RND_LOOP_NO_RNDF (r)
    370  1.1.1.4  mrg               {
    371  1.1.1.4  mrg                 mpfr_flags_t ex_flags, flags;
    372  1.1.1.4  mrg                 int e, k, overflow;
    373  1.1.1.4  mrg 
    374  1.1.1.4  mrg                 ctr++;  /* for the check below */
    375  1.1.1.4  mrg 
    376  1.1.1.4  mrg                 /* Let's determine k such that the rounded integer should
    377  1.1.1.4  mrg                    be t?[i] + k, assuming an unbounded exponent range. */
    378  1.1.1.4  mrg                 k = (j + 8 +
    379  1.1.1.4  mrg                      (MPFR_IS_LIKE_RNDD (r, MPFR_SIGN (x)) ? 0 :
    380  1.1.1.4  mrg                       MPFR_IS_LIKE_RNDU (r, MPFR_SIGN (x)) ? 3 :
    381  1.1.1.4  mrg                       2)) / 4 - 2;
    382  1.1.1.4  mrg                 if (r == MPFR_RNDN && ((unsigned int) j & 3) == 2 &&
    383  1.1.1.4  mrg                     ((odd + k) & 1))
    384  1.1.1.4  mrg                   k--;  /* even rounding */
    385  1.1.1.4  mrg 
    386  1.1.1.4  mrg                 /* Overflow cases. Note that with the above choices:
    387  1.1.1.4  mrg                    _ t?[0] == minval(type)
    388  1.1.1.4  mrg                    _ t?[1] == maxval(type)
    389  1.1.1.4  mrg                 */
    390  1.1.1.4  mrg                 overflow = (i == 0 && k < 0) || (i == 1 && k > 0);
    391  1.1.1.4  mrg 
    392  1.1.1.4  mrg                 /* Expected flags. Note that in case of overflow, only the
    393  1.1.1.4  mrg                    erange flag is set. Otherwise, the result is inexact iff
    394  1.1.1.4  mrg                    j mod 1 != 0, i.e. the last two bits are not 00. */
    395  1.1.1.4  mrg                 ex_flags = overflow ? MPFR_FLAGS_ERANGE
    396  1.1.1.4  mrg                   : ((unsigned int) j & 3) != 0 ? MPFR_FLAGS_INEXACT : 0;
    397  1.1.1.4  mrg 
    398  1.1.1.4  mrg                 mpfr_clear_flags ();
    399  1.1.1.4  mrg 
    400  1.1.1.4  mrg #define GET_TESTS_TEST(TYPE,TZ,F,C,FMT)                                 \
    401  1.1.1.4  mrg                 do {                                                    \
    402  1.1.1.4  mrg                   TYPE a, d;                                            \
    403  1.1.1.4  mrg                                                                         \
    404  1.1.1.4  mrg                   a = TZ[i] + (overflow ? 0 : k);                       \
    405  1.1.1.4  mrg                   if (e)                                                \
    406  1.1.1.4  mrg                     {                                                   \
    407  1.1.1.4  mrg                       mpfr_exp_t ex;                                    \
    408  1.1.1.4  mrg                       ex = MPFR_GET_EXP (x);                            \
    409  1.1.1.4  mrg                       set_emin (ex);                                    \
    410  1.1.1.4  mrg                       set_emax (ex);                                    \
    411  1.1.1.4  mrg                     }                                                   \
    412  1.1.1.4  mrg                   d = F (x, (mpfr_rnd_t) r);                            \
    413  1.1.1.4  mrg                   flags = __gmpfr_flags;                                \
    414  1.1.1.4  mrg                   set_emin (emin);                                      \
    415  1.1.1.4  mrg                   set_emax (emax);                                      \
    416  1.1.1.4  mrg                   if (flags != ex_flags || a != d)                      \
    417  1.1.1.4  mrg                     {                                                   \
    418  1.1.1.4  mrg                       printf ("Error in get_tests for " #F " on %s%s\n", \
    419  1.1.1.4  mrg                               mpfr_print_rnd_mode ((mpfr_rnd_t) r),     \
    420  1.1.1.4  mrg                               e ? ", reduced exponent range" : "");     \
    421  1.1.1.4  mrg                       printf ("x = t" C "[%d] + (%d/4) = ", i, j);      \
    422  1.1.1.4  mrg                       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);       \
    423  1.1.1.4  mrg                       printf ("\n--> k = %d\n", k);                     \
    424  1.1.1.4  mrg                       printf ("Expected %l" FMT "\n", a);               \
    425  1.1.1.4  mrg                       printf ("Got      %l" FMT "\n", d);               \
    426  1.1.1.4  mrg                       printf ("Expected flags:");                       \
    427  1.1.1.4  mrg                       flags_out (ex_flags);                             \
    428  1.1.1.4  mrg                       printf ("Got flags:     ");                       \
    429  1.1.1.4  mrg                       flags_out (flags);                                \
    430  1.1.1.4  mrg                       exit (1);                                         \
    431  1.1.1.4  mrg                     }                                                   \
    432  1.1.1.4  mrg                 } while (0)
    433  1.1.1.4  mrg 
    434  1.1.1.4  mrg                 for (e = 0; e < 2; e++)
    435  1.1.1.4  mrg                   {
    436  1.1.1.4  mrg                     if (e && MPFR_IS_ZERO (x))
    437  1.1.1.4  mrg                       break;
    438  1.1.1.4  mrg                     if (s)
    439  1.1.1.4  mrg                       GET_TESTS_TEST (long,
    440  1.1.1.4  mrg                                       ts, mpfr_get_si, "s", "d");
    441  1.1.1.4  mrg                     else
    442  1.1.1.4  mrg                       GET_TESTS_TEST (unsigned long,
    443  1.1.1.4  mrg                                       tu, mpfr_get_ui, "u", "u");
    444  1.1.1.4  mrg                   }
    445  1.1.1.4  mrg               }
    446  1.1.1.4  mrg             inex = mpfr_add (x, x, z, MPFR_RNDN);
    447  1.1.1.4  mrg             MPFR_ASSERTN (inex == 0);
    448  1.1.1.4  mrg           }
    449  1.1.1.4  mrg       }
    450  1.1.1.4  mrg 
    451  1.1.1.4  mrg   /* Check that we have tested everything: 8 = 5 + 3 integers t?[i]
    452  1.1.1.4  mrg    * with 17 = 8 - (-8) + 1 additional terms (j/4) for each integer,
    453  1.1.1.4  mrg    * and each non-RNDF rounding mode.
    454  1.1.1.4  mrg    */
    455  1.1.1.4  mrg   MPFR_ASSERTN (ctr == 8 * 17 * ((int) MPFR_RND_MAX - 1));
    456  1.1.1.4  mrg 
    457  1.1.1.4  mrg   mpfr_clear (x);
    458  1.1.1.4  mrg   mpfr_clear (z);
    459  1.1.1.4  mrg }
    460  1.1.1.4  mrg 
    461      1.1  mrg /* FIXME: Comparing against mpfr_get_si/ui is not ideal, it'd be better to
    462      1.1  mrg    have all tests examine the bits in mpfr_t for what should come out.  */
    463      1.1  mrg 
    464      1.1  mrg int
    465      1.1  mrg main (int argc, char *argv[])
    466      1.1  mrg {
    467      1.1  mrg   mpfr_t x;
    468      1.1  mrg   long k, z, d, N;
    469      1.1  mrg   unsigned long zl, dl;
    470      1.1  mrg   int inex;
    471      1.1  mrg   int r;
    472      1.1  mrg   mpfr_exp_t emin, emax;
    473      1.1  mrg   int flag;
    474      1.1  mrg 
    475      1.1  mrg   tests_start_mpfr ();
    476      1.1  mrg 
    477  1.1.1.4  mrg   get_tests ();
    478  1.1.1.4  mrg 
    479      1.1  mrg   mpfr_init2 (x, 100);
    480      1.1  mrg 
    481  1.1.1.4  mrg   N = (argc == 1) ? 100000 : atol (argv[1]);
    482      1.1  mrg 
    483      1.1  mrg   for (k = 1; k <= N; k++)
    484      1.1  mrg     {
    485      1.1  mrg       z = (long) (randlimb () & LONG_MAX) + LONG_MIN / 2;
    486      1.1  mrg       inex = mpfr_set_si (x, z, MPFR_RNDZ);
    487      1.1  mrg       d = mpfr_get_si (x, MPFR_RNDZ);
    488      1.1  mrg       if (d != z)
    489      1.1  mrg         {
    490      1.1  mrg           printf ("Error in mpfr_set_si: expected %ld got %ld\n", z, d);
    491      1.1  mrg           exit (1);
    492      1.1  mrg         }
    493      1.1  mrg       if (inex)
    494      1.1  mrg         {
    495      1.1  mrg           printf ("Error in mpfr_set_si: inex value incorrect for %ld: %d\n",
    496      1.1  mrg                   z, inex);
    497      1.1  mrg           exit (1);
    498      1.1  mrg         }
    499      1.1  mrg     }
    500      1.1  mrg 
    501      1.1  mrg   for (k = 1; k <= N; k++)
    502      1.1  mrg     {
    503      1.1  mrg       zl = randlimb ();
    504      1.1  mrg       inex = mpfr_set_ui (x, zl, MPFR_RNDZ);
    505      1.1  mrg       dl = mpfr_get_ui (x, MPFR_RNDZ);
    506      1.1  mrg       if (dl != zl)
    507      1.1  mrg         {
    508      1.1  mrg           printf ("Error in mpfr_set_ui: expected %lu got %lu\n", zl, dl);
    509      1.1  mrg           exit (1);
    510      1.1  mrg         }
    511      1.1  mrg       if (inex)
    512      1.1  mrg         {
    513      1.1  mrg           printf ("Error in mpfr_set_ui: inex value incorrect for %lu: %d\n",
    514      1.1  mrg                   zl, inex);
    515      1.1  mrg           exit (1);
    516      1.1  mrg         }
    517      1.1  mrg     }
    518      1.1  mrg 
    519      1.1  mrg   mpfr_set_prec (x, 2);
    520      1.1  mrg   if (mpfr_set_si (x, 5, MPFR_RNDZ) >= 0)
    521      1.1  mrg     {
    522      1.1  mrg       printf ("Wrong inexact flag for x=5, rnd=MPFR_RNDZ\n");
    523      1.1  mrg       exit (1);
    524      1.1  mrg     }
    525      1.1  mrg 
    526      1.1  mrg   mpfr_set_prec (x, 2);
    527      1.1  mrg   if (mpfr_set_si (x, -5, MPFR_RNDZ) <= 0)
    528      1.1  mrg     {
    529      1.1  mrg       printf ("Wrong inexact flag for x=-5, rnd=MPFR_RNDZ\n");
    530      1.1  mrg       exit (1);
    531      1.1  mrg     }
    532      1.1  mrg 
    533      1.1  mrg   mpfr_set_prec (x, 3);
    534      1.1  mrg   inex = mpfr_set_si (x, 77617, MPFR_RNDD); /* should be 65536 */
    535  1.1.1.4  mrg   if (MPFR_MANT(x)[0] != MPFR_LIMB_HIGHBIT || inex >= 0)
    536      1.1  mrg     {
    537      1.1  mrg       printf ("Error in mpfr_set_si(x:3, 77617, MPFR_RNDD)\n");
    538  1.1.1.4  mrg       mpfr_dump (x);
    539      1.1  mrg       exit (1);
    540      1.1  mrg     }
    541      1.1  mrg   inex = mpfr_set_ui (x, 77617, MPFR_RNDD); /* should be 65536 */
    542  1.1.1.4  mrg   if (MPFR_MANT(x)[0] != MPFR_LIMB_HIGHBIT || inex >= 0)
    543      1.1  mrg     {
    544      1.1  mrg       printf ("Error in mpfr_set_ui(x:3, 77617, MPFR_RNDD)\n");
    545  1.1.1.4  mrg       mpfr_dump (x);
    546      1.1  mrg       exit (1);
    547      1.1  mrg     }
    548      1.1  mrg 
    549      1.1  mrg   mpfr_set_prec (x, 2);
    550      1.1  mrg   inex = mpfr_set_si (x, 33096, MPFR_RNDU);
    551      1.1  mrg   if (mpfr_get_si (x, MPFR_RNDZ) != 49152 || inex <= 0)
    552      1.1  mrg     {
    553      1.1  mrg       printf ("Error in mpfr_set_si, exp. 49152, got %ld, inex %d\n",
    554      1.1  mrg               mpfr_get_si (x, MPFR_RNDZ), inex);
    555      1.1  mrg       exit (1);
    556      1.1  mrg     }
    557      1.1  mrg   inex = mpfr_set_ui (x, 33096, MPFR_RNDU);
    558      1.1  mrg   if (mpfr_get_si (x, MPFR_RNDZ) != 49152)
    559      1.1  mrg     {
    560      1.1  mrg       printf ("Error in mpfr_set_ui, exp. 49152, got %ld, inex %d\n",
    561      1.1  mrg               mpfr_get_si (x, MPFR_RNDZ), inex);
    562      1.1  mrg       exit (1);
    563      1.1  mrg     }
    564  1.1.1.2  mrg   /* Also test the mpfr_set_ui function (instead of macro). */
    565  1.1.1.2  mrg   inex = (mpfr_set_ui) (x, 33096, MPFR_RNDU);
    566  1.1.1.2  mrg   if (mpfr_get_si (x, MPFR_RNDZ) != 49152)
    567  1.1.1.2  mrg     {
    568  1.1.1.2  mrg       printf ("Error in mpfr_set_ui function, exp. 49152, got %ld, inex %d\n",
    569  1.1.1.2  mrg               mpfr_get_si (x, MPFR_RNDZ), inex);
    570  1.1.1.2  mrg       exit (1);
    571  1.1.1.2  mrg     }
    572      1.1  mrg 
    573  1.1.1.6  mrg   RND_LOOP (r)
    574      1.1  mrg     {
    575      1.1  mrg       mpfr_set_si (x, -1, (mpfr_rnd_t) r);
    576      1.1  mrg       mpfr_set_ui (x, 0, (mpfr_rnd_t) r);
    577      1.1  mrg       if (MPFR_IS_NEG (x) || mpfr_get_ui (x, (mpfr_rnd_t) r) != 0)
    578      1.1  mrg         {
    579      1.1  mrg           printf ("mpfr_set_ui (x, 0) gives -0 for %s\n",
    580      1.1  mrg                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
    581      1.1  mrg           exit (1);
    582      1.1  mrg         }
    583      1.1  mrg 
    584      1.1  mrg       mpfr_set_si (x, -1, (mpfr_rnd_t) r);
    585      1.1  mrg       mpfr_set_si (x, 0, (mpfr_rnd_t) r);
    586      1.1  mrg       if (MPFR_IS_NEG (x) || mpfr_get_si (x, (mpfr_rnd_t) r) != 0)
    587      1.1  mrg         {
    588      1.1  mrg           printf ("mpfr_set_si (x, 0) gives -0 for %s\n",
    589      1.1  mrg                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
    590      1.1  mrg           exit (1);
    591      1.1  mrg         }
    592      1.1  mrg     }
    593      1.1  mrg 
    594      1.1  mrg   /* check potential bug in case mp_limb_t is unsigned */
    595      1.1  mrg   emax = mpfr_get_emax ();
    596      1.1  mrg   set_emax (0);
    597      1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
    598      1.1  mrg   if (mpfr_sgn (x) >= 0)
    599      1.1  mrg     {
    600      1.1  mrg       printf ("mpfr_set_si (x, -1) fails\n");
    601      1.1  mrg       exit (1);
    602      1.1  mrg     }
    603      1.1  mrg   set_emax (emax);
    604      1.1  mrg 
    605      1.1  mrg   emax = mpfr_get_emax ();
    606      1.1  mrg   set_emax (5);
    607      1.1  mrg   mpfr_set_prec (x, 2);
    608      1.1  mrg   mpfr_set_si (x, -31, MPFR_RNDN);
    609      1.1  mrg   if (mpfr_sgn (x) >= 0)
    610      1.1  mrg     {
    611      1.1  mrg       printf ("mpfr_set_si (x, -31) fails\n");
    612      1.1  mrg       exit (1);
    613      1.1  mrg     }
    614      1.1  mrg   set_emax (emax);
    615      1.1  mrg 
    616      1.1  mrg   /* test for get_ui */
    617      1.1  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
    618      1.1  mrg   MPFR_ASSERTN(mpfr_get_ui (x, MPFR_RNDN) == 0);
    619      1.1  mrg   mpfr_set_ui (x, ULONG_MAX, MPFR_RNDU);
    620      1.1  mrg   mpfr_nextabove (x);
    621      1.1  mrg   mpfr_get_ui (x, MPFR_RNDU);
    622      1.1  mrg 
    623      1.1  mrg   /* another test for get_ui */
    624      1.1  mrg   mpfr_set_prec (x, 10);
    625      1.1  mrg   mpfr_set_str_binary (x, "10.101");
    626      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    627      1.1  mrg   MPFR_ASSERTN (dl == 3);
    628      1.1  mrg 
    629      1.1  mrg   mpfr_set_str_binary (x, "-1.0");
    630      1.1  mrg   mpfr_get_ui (x, MPFR_RNDN);
    631      1.1  mrg 
    632      1.1  mrg   mpfr_set_str_binary (x, "0.1");
    633      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    634      1.1  mrg   MPFR_ASSERTN (dl == 0);
    635      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDZ);
    636      1.1  mrg   MPFR_ASSERTN (dl == 0);
    637      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDD);
    638      1.1  mrg   MPFR_ASSERTN (dl == 0);
    639      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDU);
    640      1.1  mrg   MPFR_ASSERTN (dl == 1);
    641      1.1  mrg 
    642      1.1  mrg   /* coverage tests */
    643      1.1  mrg   mpfr_set_prec (x, 2);
    644      1.1  mrg   mpfr_set_si (x, -7, MPFR_RNDD);
    645      1.1  mrg   MPFR_ASSERTN(mpfr_cmp_si (x, -8) == 0);
    646      1.1  mrg   mpfr_set_prec (x, 2);
    647      1.1  mrg   mpfr_set_ui (x, 7, MPFR_RNDU);
    648      1.1  mrg   MPFR_ASSERTN(mpfr_cmp_ui (x, 8) == 0);
    649      1.1  mrg   emax = mpfr_get_emax ();
    650      1.1  mrg   set_emax (3);
    651      1.1  mrg   mpfr_set_ui (x, 7, MPFR_RNDU);
    652      1.1  mrg   MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
    653      1.1  mrg   set_emax (1);
    654      1.1  mrg   MPFR_ASSERTN( mpfr_set_ui (x, 7, MPFR_RNDU) );
    655      1.1  mrg   MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
    656      1.1  mrg   set_emax (emax);
    657      1.1  mrg   mpfr_set_ui_2exp (x, 17, -50, MPFR_RNDN);
    658      1.1  mrg   MPFR_ASSERTN (mpfr_get_ui (x, MPFR_RNDD) == 0);
    659      1.1  mrg   MPFR_ASSERTN (mpfr_get_si (x, MPFR_RNDD) == 0);
    660      1.1  mrg 
    661  1.1.1.4  mrg   /* Test for ERANGE flag + correct behavior if overflow */
    662      1.1  mrg   mpfr_set_prec (x, 256);
    663      1.1  mrg   mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
    664      1.1  mrg   mpfr_clear_erangeflag ();
    665      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    666      1.1  mrg   if (dl != ULONG_MAX || mpfr_erangeflag_p ())
    667      1.1  mrg     {
    668      1.1  mrg       printf ("ERROR for get_ui + ERANGE + ULONG_MAX (1)\n");
    669      1.1  mrg       exit (1);
    670      1.1  mrg     }
    671      1.1  mrg   mpfr_add_ui (x, x, 1, MPFR_RNDN);
    672      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    673      1.1  mrg   if (dl != ULONG_MAX || !mpfr_erangeflag_p ())
    674      1.1  mrg     {
    675      1.1  mrg       printf ("ERROR for get_ui + ERANGE + ULONG_MAX (2)\n");
    676      1.1  mrg       exit (1);
    677      1.1  mrg     }
    678      1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
    679      1.1  mrg   mpfr_clear_erangeflag ();
    680      1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    681      1.1  mrg   if (dl != 0 || !mpfr_erangeflag_p ())
    682      1.1  mrg     {
    683      1.1  mrg       printf ("ERROR for get_ui + ERANGE + -1 \n");
    684      1.1  mrg       exit (1);
    685      1.1  mrg     }
    686      1.1  mrg   mpfr_set_si (x, LONG_MAX, MPFR_RNDN);
    687      1.1  mrg   mpfr_clear_erangeflag ();
    688      1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    689      1.1  mrg   if (d != LONG_MAX || mpfr_erangeflag_p ())
    690      1.1  mrg     {
    691      1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MAX (1): %ld\n", d);
    692      1.1  mrg       exit (1);
    693      1.1  mrg     }
    694      1.1  mrg   mpfr_add_ui (x, x, 1, MPFR_RNDN);
    695      1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    696      1.1  mrg   if (d != LONG_MAX || !mpfr_erangeflag_p ())
    697      1.1  mrg     {
    698      1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MAX (2)\n");
    699      1.1  mrg       exit (1);
    700      1.1  mrg     }
    701      1.1  mrg   mpfr_set_si (x, LONG_MIN, MPFR_RNDN);
    702      1.1  mrg   mpfr_clear_erangeflag ();
    703      1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    704      1.1  mrg   if (d != LONG_MIN || mpfr_erangeflag_p ())
    705      1.1  mrg     {
    706      1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MIN (1)\n");
    707      1.1  mrg       exit (1);
    708      1.1  mrg     }
    709      1.1  mrg   mpfr_sub_ui (x, x, 1, MPFR_RNDN);
    710      1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    711      1.1  mrg   if (d != LONG_MIN || !mpfr_erangeflag_p ())
    712      1.1  mrg     {
    713      1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MIN (2)\n");
    714      1.1  mrg       exit (1);
    715      1.1  mrg     }
    716      1.1  mrg 
    717      1.1  mrg   mpfr_set_nan (x);
    718  1.1.1.4  mrg   mpfr_clear_flags ();
    719      1.1  mrg   d = mpfr_get_ui (x, MPFR_RNDN);
    720  1.1.1.4  mrg   if (d != 0 || __gmpfr_flags != MPFR_FLAGS_ERANGE)
    721      1.1  mrg     {
    722      1.1  mrg       printf ("ERROR for get_ui + NaN\n");
    723      1.1  mrg       exit (1);
    724      1.1  mrg     }
    725      1.1  mrg   mpfr_clear_erangeflag ();
    726      1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    727  1.1.1.4  mrg   if (d != 0 || __gmpfr_flags != MPFR_FLAGS_ERANGE)
    728      1.1  mrg     {
    729      1.1  mrg       printf ("ERROR for get_si + NaN\n");
    730      1.1  mrg       exit (1);
    731      1.1  mrg     }
    732      1.1  mrg 
    733      1.1  mrg   emin = mpfr_get_emin ();
    734      1.1  mrg   mpfr_set_prec (x, 2);
    735      1.1  mrg 
    736  1.1.1.6  mrg   set_emin (4);
    737      1.1  mrg   mpfr_clear_flags ();
    738      1.1  mrg   mpfr_set_ui (x, 7, MPFR_RNDU);
    739      1.1  mrg   flag = mpfr_underflow_p ();
    740  1.1.1.6  mrg   set_emin (emin);
    741      1.1  mrg   if (mpfr_cmp_ui (x, 8) != 0)
    742      1.1  mrg     {
    743      1.1  mrg       printf ("Error for mpfr_set_ui (x, 7, MPFR_RNDU), prec = 2, emin = 4\n");
    744      1.1  mrg       exit (1);
    745      1.1  mrg     }
    746      1.1  mrg   if (flag)
    747      1.1  mrg     {
    748      1.1  mrg       printf ("mpfr_set_ui (x, 7, MPFR_RNDU) should not underflow "
    749      1.1  mrg               "with prec = 2, emin = 4\n");
    750      1.1  mrg       exit (1);
    751      1.1  mrg     }
    752      1.1  mrg 
    753  1.1.1.6  mrg   set_emin (4);
    754      1.1  mrg   mpfr_clear_flags ();
    755      1.1  mrg   mpfr_set_si (x, -7, MPFR_RNDD);
    756      1.1  mrg   flag = mpfr_underflow_p ();
    757  1.1.1.6  mrg   set_emin (emin);
    758      1.1  mrg   if (mpfr_cmp_si (x, -8) != 0)
    759      1.1  mrg     {
    760      1.1  mrg       printf ("Error for mpfr_set_si (x, -7, MPFR_RNDD), prec = 2, emin = 4\n");
    761      1.1  mrg       exit (1);
    762      1.1  mrg     }
    763      1.1  mrg   if (flag)
    764      1.1  mrg     {
    765      1.1  mrg       printf ("mpfr_set_si (x, -7, MPFR_RNDD) should not underflow "
    766      1.1  mrg               "with prec = 2, emin = 4\n");
    767      1.1  mrg       exit (1);
    768      1.1  mrg     }
    769      1.1  mrg 
    770      1.1  mrg   mpfr_clear (x);
    771      1.1  mrg 
    772      1.1  mrg   test_2exp ();
    773  1.1.1.5  mrg   test_2exp_extreme ();
    774      1.1  mrg   test_macros ();
    775  1.1.1.2  mrg   test_macros_keyword ();
    776  1.1.1.4  mrg   test_get_ui_smallneg ();
    777      1.1  mrg   tests_end_mpfr ();
    778      1.1  mrg   return 0;
    779      1.1  mrg }
    780