Home | History | Annotate | Line # | Download | only in tests
tset_si.c revision 1.1
      1  1.1  mrg /* Test file for mpfr_set_si and mpfr_set_ui.
      2  1.1  mrg 
      3  1.1  mrg Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
      4  1.1  mrg Contributed by the Arenaire and Cacao 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 ERROR(str) {printf("Error for "str"\n"); exit(1);}
     30  1.1  mrg 
     31  1.1  mrg static void
     32  1.1  mrg test_2exp (void)
     33  1.1  mrg {
     34  1.1  mrg   mpfr_t x;
     35  1.1  mrg   int res;
     36  1.1  mrg 
     37  1.1  mrg   mpfr_init2 (x, 32);
     38  1.1  mrg 
     39  1.1  mrg   mpfr_set_ui_2exp (x, 1, 0, MPFR_RNDN);
     40  1.1  mrg   if (mpfr_cmp_ui(x, 1))
     41  1.1  mrg     ERROR("(1U,0)");
     42  1.1  mrg 
     43  1.1  mrg   mpfr_set_ui_2exp (x, 1024, -10, MPFR_RNDN);
     44  1.1  mrg   if (mpfr_cmp_ui(x, 1))
     45  1.1  mrg     ERROR("(1024U,-10)");
     46  1.1  mrg 
     47  1.1  mrg   mpfr_set_ui_2exp (x, 1024, 10, MPFR_RNDN);
     48  1.1  mrg   if (mpfr_cmp_ui(x, 1024*1024))
     49  1.1  mrg     ERROR("(1024U,+10)");
     50  1.1  mrg 
     51  1.1  mrg   mpfr_set_si_2exp (x, -1024L * 1024L, -10, MPFR_RNDN);
     52  1.1  mrg   if (mpfr_cmp_si(x, -1024))
     53  1.1  mrg     ERROR("(1M,-10)");
     54  1.1  mrg 
     55  1.1  mrg   mpfr_set_ui_2exp (x, 0x92345678, 16, MPFR_RNDN);
     56  1.1  mrg   if (mpfr_cmp_str (x, "92345678@4", 16, MPFR_RNDN))
     57  1.1  mrg     ERROR("(x92345678U,+16)");
     58  1.1  mrg 
     59  1.1  mrg   mpfr_set_si_2exp (x, -0x1ABCDEF0, -256, MPFR_RNDN);
     60  1.1  mrg   if (mpfr_cmp_str (x, "-1ABCDEF0@-64", 16, MPFR_RNDN))
     61  1.1  mrg     ERROR("(-x1ABCDEF0,-256)");
     62  1.1  mrg 
     63  1.1  mrg   mpfr_set_prec (x, 2);
     64  1.1  mrg   res = mpfr_set_si_2exp (x, 7, 10, MPFR_RNDU);
     65  1.1  mrg   if (mpfr_cmp_ui (x, 1<<13) || res <= 0)
     66  1.1  mrg     ERROR ("Prec 2 + si_2exp");
     67  1.1  mrg 
     68  1.1  mrg   res = mpfr_set_ui_2exp (x, 7, 10, MPFR_RNDU);
     69  1.1  mrg   if (mpfr_cmp_ui (x, 1<<13) || res <= 0)
     70  1.1  mrg     ERROR ("Prec 2 + ui_2exp");
     71  1.1  mrg 
     72  1.1  mrg   mpfr_clear_flags ();
     73  1.1  mrg   mpfr_set_ui_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN);
     74  1.1  mrg   if (!mpfr_inf_p (x) || MPFR_IS_NEG (x))
     75  1.1  mrg     ERROR ("mpfr_set_ui_2exp and overflow (bad result)");
     76  1.1  mrg   if (!mpfr_overflow_p ())
     77  1.1  mrg     ERROR ("mpfr_set_ui_2exp and overflow (overflow flag not set)");
     78  1.1  mrg 
     79  1.1  mrg   mpfr_clear_flags ();
     80  1.1  mrg   mpfr_set_si_2exp (x, 17, MPFR_EMAX_MAX, MPFR_RNDN);
     81  1.1  mrg   if (!mpfr_inf_p (x) || MPFR_IS_NEG (x))
     82  1.1  mrg     ERROR ("mpfr_set_si_2exp (pos) and overflow (bad result)");
     83  1.1  mrg   if (!mpfr_overflow_p ())
     84  1.1  mrg     ERROR ("mpfr_set_si_2exp (pos) and overflow (overflow flag not set)");
     85  1.1  mrg 
     86  1.1  mrg   mpfr_clear_flags ();
     87  1.1  mrg   mpfr_set_si_2exp (x, -17, MPFR_EMAX_MAX, MPFR_RNDN);
     88  1.1  mrg   if (!mpfr_inf_p (x) || MPFR_IS_POS (x))
     89  1.1  mrg     ERROR ("mpfr_set_si_2exp (neg) and overflow (bad result)");
     90  1.1  mrg   if (!mpfr_overflow_p ())
     91  1.1  mrg     ERROR ("mpfr_set_si_2exp (neg) and overflow (overflow flag not set)");
     92  1.1  mrg 
     93  1.1  mrg   mpfr_clear (x);
     94  1.1  mrg }
     95  1.1  mrg 
     96  1.1  mrg static void
     97  1.1  mrg test_macros (void)
     98  1.1  mrg {
     99  1.1  mrg   mpfr_t x[3];
    100  1.1  mrg   mpfr_ptr p;
    101  1.1  mrg   int r;
    102  1.1  mrg 
    103  1.1  mrg   mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0);
    104  1.1  mrg   p = x[0];
    105  1.1  mrg   r = 0;
    106  1.1  mrg   mpfr_set_ui (p++, 0, (mpfr_rnd_t) r++);
    107  1.1  mrg   if (p != x[1] || r != 1)
    108  1.1  mrg     {
    109  1.1  mrg       printf ("Error in mpfr_set_ui macro: p - x[0] = %d (expecting 1), "
    110  1.1  mrg               "r = %d (expecting 1)\n", (int) (p - x[0]), r);
    111  1.1  mrg       exit (1);
    112  1.1  mrg     }
    113  1.1  mrg   p = x[0];
    114  1.1  mrg   r = 0;
    115  1.1  mrg   mpfr_set_si (p++, 0, (mpfr_rnd_t) r++);
    116  1.1  mrg   if (p != x[1] || r != 1)
    117  1.1  mrg     {
    118  1.1  mrg       printf ("Error in mpfr_set_si macro: p - x[0] = %d (expecting 1), "
    119  1.1  mrg               "r = %d (expecting 1)\n", (int) (p - x[0]), r);
    120  1.1  mrg       exit (1);
    121  1.1  mrg     }
    122  1.1  mrg   mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0);
    123  1.1  mrg }
    124  1.1  mrg 
    125  1.1  mrg /* FIXME: Comparing against mpfr_get_si/ui is not ideal, it'd be better to
    126  1.1  mrg    have all tests examine the bits in mpfr_t for what should come out.  */
    127  1.1  mrg 
    128  1.1  mrg int
    129  1.1  mrg main (int argc, char *argv[])
    130  1.1  mrg {
    131  1.1  mrg   mpfr_t x;
    132  1.1  mrg   long k, z, d, N;
    133  1.1  mrg   unsigned long zl, dl;
    134  1.1  mrg   int inex;
    135  1.1  mrg   int r;
    136  1.1  mrg   mpfr_exp_t emin, emax;
    137  1.1  mrg   int flag;
    138  1.1  mrg 
    139  1.1  mrg   tests_start_mpfr ();
    140  1.1  mrg 
    141  1.1  mrg   mpfr_init2 (x, 100);
    142  1.1  mrg 
    143  1.1  mrg   N = (argc==1) ? 100000 : atol (argv[1]);
    144  1.1  mrg 
    145  1.1  mrg   for (k = 1; k <= N; k++)
    146  1.1  mrg     {
    147  1.1  mrg       z = (long) (randlimb () & LONG_MAX) + LONG_MIN / 2;
    148  1.1  mrg       inex = mpfr_set_si (x, z, MPFR_RNDZ);
    149  1.1  mrg       d = mpfr_get_si (x, MPFR_RNDZ);
    150  1.1  mrg       if (d != z)
    151  1.1  mrg         {
    152  1.1  mrg           printf ("Error in mpfr_set_si: expected %ld got %ld\n", z, d);
    153  1.1  mrg           exit (1);
    154  1.1  mrg         }
    155  1.1  mrg       if (inex)
    156  1.1  mrg         {
    157  1.1  mrg           printf ("Error in mpfr_set_si: inex value incorrect for %ld: %d\n",
    158  1.1  mrg                   z, inex);
    159  1.1  mrg           exit (1);
    160  1.1  mrg         }
    161  1.1  mrg     }
    162  1.1  mrg 
    163  1.1  mrg   for (k = 1; k <= N; k++)
    164  1.1  mrg     {
    165  1.1  mrg       zl = randlimb ();
    166  1.1  mrg       inex = mpfr_set_ui (x, zl, MPFR_RNDZ);
    167  1.1  mrg       dl = mpfr_get_ui (x, MPFR_RNDZ);
    168  1.1  mrg       if (dl != zl)
    169  1.1  mrg         {
    170  1.1  mrg           printf ("Error in mpfr_set_ui: expected %lu got %lu\n", zl, dl);
    171  1.1  mrg           exit (1);
    172  1.1  mrg         }
    173  1.1  mrg       if (inex)
    174  1.1  mrg         {
    175  1.1  mrg           printf ("Error in mpfr_set_ui: inex value incorrect for %lu: %d\n",
    176  1.1  mrg                   zl, inex);
    177  1.1  mrg           exit (1);
    178  1.1  mrg         }
    179  1.1  mrg     }
    180  1.1  mrg 
    181  1.1  mrg   mpfr_set_prec (x, 2);
    182  1.1  mrg   if (mpfr_set_si (x, 5, MPFR_RNDZ) >= 0)
    183  1.1  mrg     {
    184  1.1  mrg       printf ("Wrong inexact flag for x=5, rnd=MPFR_RNDZ\n");
    185  1.1  mrg       exit (1);
    186  1.1  mrg     }
    187  1.1  mrg 
    188  1.1  mrg   mpfr_set_prec (x, 2);
    189  1.1  mrg   if (mpfr_set_si (x, -5, MPFR_RNDZ) <= 0)
    190  1.1  mrg     {
    191  1.1  mrg       printf ("Wrong inexact flag for x=-5, rnd=MPFR_RNDZ\n");
    192  1.1  mrg       exit (1);
    193  1.1  mrg     }
    194  1.1  mrg 
    195  1.1  mrg   mpfr_set_prec (x, 3);
    196  1.1  mrg   inex = mpfr_set_si (x, 77617, MPFR_RNDD); /* should be 65536 */
    197  1.1  mrg   if (MPFR_MANT(x)[0] != ((mp_limb_t)1 << (mp_bits_per_limb-1))
    198  1.1  mrg       || inex >= 0)
    199  1.1  mrg     {
    200  1.1  mrg       printf ("Error in mpfr_set_si(x:3, 77617, MPFR_RNDD)\n");
    201  1.1  mrg       mpfr_print_binary (x);
    202  1.1  mrg       puts ("");
    203  1.1  mrg       exit (1);
    204  1.1  mrg     }
    205  1.1  mrg   inex = mpfr_set_ui (x, 77617, MPFR_RNDD); /* should be 65536 */
    206  1.1  mrg   if (MPFR_MANT(x)[0] != ((mp_limb_t)1 << (mp_bits_per_limb-1))
    207  1.1  mrg       || inex >= 0)
    208  1.1  mrg     {
    209  1.1  mrg       printf ("Error in mpfr_set_ui(x:3, 77617, MPFR_RNDD)\n");
    210  1.1  mrg       mpfr_print_binary (x);
    211  1.1  mrg       puts ("");
    212  1.1  mrg       exit (1);
    213  1.1  mrg     }
    214  1.1  mrg 
    215  1.1  mrg   mpfr_set_prec (x, 2);
    216  1.1  mrg   inex = mpfr_set_si (x, 33096, MPFR_RNDU);
    217  1.1  mrg   if (mpfr_get_si (x, MPFR_RNDZ) != 49152 || inex <= 0)
    218  1.1  mrg     {
    219  1.1  mrg       printf ("Error in mpfr_set_si, exp. 49152, got %ld, inex %d\n",
    220  1.1  mrg               mpfr_get_si (x, MPFR_RNDZ), inex);
    221  1.1  mrg       exit (1);
    222  1.1  mrg     }
    223  1.1  mrg   inex = mpfr_set_ui (x, 33096, MPFR_RNDU);
    224  1.1  mrg   if (mpfr_get_si (x, MPFR_RNDZ) != 49152)
    225  1.1  mrg     {
    226  1.1  mrg       printf ("Error in mpfr_set_ui, exp. 49152, got %ld, inex %d\n",
    227  1.1  mrg               mpfr_get_si (x, MPFR_RNDZ), inex);
    228  1.1  mrg       exit (1);
    229  1.1  mrg     }
    230  1.1  mrg 
    231  1.1  mrg   for (r = 0 ; r < MPFR_RND_MAX ; r++)
    232  1.1  mrg     {
    233  1.1  mrg       mpfr_set_si (x, -1, (mpfr_rnd_t) r);
    234  1.1  mrg       mpfr_set_ui (x, 0, (mpfr_rnd_t) r);
    235  1.1  mrg       if (MPFR_IS_NEG (x) || mpfr_get_ui (x, (mpfr_rnd_t) r) != 0)
    236  1.1  mrg         {
    237  1.1  mrg           printf ("mpfr_set_ui (x, 0) gives -0 for %s\n",
    238  1.1  mrg                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
    239  1.1  mrg           exit (1);
    240  1.1  mrg         }
    241  1.1  mrg 
    242  1.1  mrg       mpfr_set_si (x, -1, (mpfr_rnd_t) r);
    243  1.1  mrg       mpfr_set_si (x, 0, (mpfr_rnd_t) r);
    244  1.1  mrg       if (MPFR_IS_NEG (x) || mpfr_get_si (x, (mpfr_rnd_t) r) != 0)
    245  1.1  mrg         {
    246  1.1  mrg           printf ("mpfr_set_si (x, 0) gives -0 for %s\n",
    247  1.1  mrg                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
    248  1.1  mrg           exit (1);
    249  1.1  mrg         }
    250  1.1  mrg     }
    251  1.1  mrg 
    252  1.1  mrg   /* check potential bug in case mp_limb_t is unsigned */
    253  1.1  mrg   emax = mpfr_get_emax ();
    254  1.1  mrg   set_emax (0);
    255  1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
    256  1.1  mrg   if (mpfr_sgn (x) >= 0)
    257  1.1  mrg     {
    258  1.1  mrg       printf ("mpfr_set_si (x, -1) fails\n");
    259  1.1  mrg       exit (1);
    260  1.1  mrg     }
    261  1.1  mrg   set_emax (emax);
    262  1.1  mrg 
    263  1.1  mrg   emax = mpfr_get_emax ();
    264  1.1  mrg   set_emax (5);
    265  1.1  mrg   mpfr_set_prec (x, 2);
    266  1.1  mrg   mpfr_set_si (x, -31, MPFR_RNDN);
    267  1.1  mrg   if (mpfr_sgn (x) >= 0)
    268  1.1  mrg     {
    269  1.1  mrg       printf ("mpfr_set_si (x, -31) fails\n");
    270  1.1  mrg       exit (1);
    271  1.1  mrg     }
    272  1.1  mrg   set_emax (emax);
    273  1.1  mrg 
    274  1.1  mrg   /* test for get_ui */
    275  1.1  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
    276  1.1  mrg   MPFR_ASSERTN(mpfr_get_ui (x, MPFR_RNDN) == 0);
    277  1.1  mrg   mpfr_set_ui (x, ULONG_MAX, MPFR_RNDU);
    278  1.1  mrg   mpfr_nextabove (x);
    279  1.1  mrg   mpfr_get_ui (x, MPFR_RNDU);
    280  1.1  mrg 
    281  1.1  mrg   /* another test for get_ui */
    282  1.1  mrg   mpfr_set_prec (x, 10);
    283  1.1  mrg   mpfr_set_str_binary (x, "10.101");
    284  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    285  1.1  mrg   MPFR_ASSERTN (dl == 3);
    286  1.1  mrg 
    287  1.1  mrg   mpfr_set_str_binary (x, "-1.0");
    288  1.1  mrg   mpfr_get_ui (x, MPFR_RNDN);
    289  1.1  mrg 
    290  1.1  mrg   mpfr_set_str_binary (x, "0.1");
    291  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    292  1.1  mrg   MPFR_ASSERTN (dl == 0);
    293  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDZ);
    294  1.1  mrg   MPFR_ASSERTN (dl == 0);
    295  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDD);
    296  1.1  mrg   MPFR_ASSERTN (dl == 0);
    297  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDU);
    298  1.1  mrg   MPFR_ASSERTN (dl == 1);
    299  1.1  mrg 
    300  1.1  mrg   /* coverage tests */
    301  1.1  mrg   mpfr_set_prec (x, 2);
    302  1.1  mrg   mpfr_set_si (x, -7, MPFR_RNDD);
    303  1.1  mrg   MPFR_ASSERTN(mpfr_cmp_si (x, -8) == 0);
    304  1.1  mrg   mpfr_set_prec (x, 2);
    305  1.1  mrg   mpfr_set_ui (x, 7, MPFR_RNDU);
    306  1.1  mrg   MPFR_ASSERTN(mpfr_cmp_ui (x, 8) == 0);
    307  1.1  mrg   emax = mpfr_get_emax ();
    308  1.1  mrg   set_emax (3);
    309  1.1  mrg   mpfr_set_ui (x, 7, MPFR_RNDU);
    310  1.1  mrg   MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
    311  1.1  mrg   set_emax (1);
    312  1.1  mrg   MPFR_ASSERTN( mpfr_set_ui (x, 7, MPFR_RNDU) );
    313  1.1  mrg   MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0);
    314  1.1  mrg   set_emax (emax);
    315  1.1  mrg   mpfr_set_ui_2exp (x, 17, -50, MPFR_RNDN);
    316  1.1  mrg   MPFR_ASSERTN (mpfr_get_ui (x, MPFR_RNDD) == 0);
    317  1.1  mrg   MPFR_ASSERTN (mpfr_get_si (x, MPFR_RNDD) == 0);
    318  1.1  mrg 
    319  1.1  mrg   /* Test for ERANGE flag + correct behaviour if overflow */
    320  1.1  mrg   mpfr_set_prec (x, 256);
    321  1.1  mrg   mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
    322  1.1  mrg   mpfr_clear_erangeflag ();
    323  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    324  1.1  mrg   if (dl != ULONG_MAX || mpfr_erangeflag_p ())
    325  1.1  mrg     {
    326  1.1  mrg       printf ("ERROR for get_ui + ERANGE + ULONG_MAX (1)\n");
    327  1.1  mrg       exit (1);
    328  1.1  mrg     }
    329  1.1  mrg   mpfr_add_ui (x, x, 1, MPFR_RNDN);
    330  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    331  1.1  mrg   if (dl != ULONG_MAX || !mpfr_erangeflag_p ())
    332  1.1  mrg     {
    333  1.1  mrg       printf ("ERROR for get_ui + ERANGE + ULONG_MAX (2)\n");
    334  1.1  mrg       exit (1);
    335  1.1  mrg     }
    336  1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
    337  1.1  mrg   mpfr_clear_erangeflag ();
    338  1.1  mrg   dl = mpfr_get_ui (x, MPFR_RNDN);
    339  1.1  mrg   if (dl != 0 || !mpfr_erangeflag_p ())
    340  1.1  mrg     {
    341  1.1  mrg       printf ("ERROR for get_ui + ERANGE + -1 \n");
    342  1.1  mrg       exit (1);
    343  1.1  mrg     }
    344  1.1  mrg   mpfr_set_si (x, LONG_MAX, MPFR_RNDN);
    345  1.1  mrg   mpfr_clear_erangeflag ();
    346  1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    347  1.1  mrg   if (d != LONG_MAX || mpfr_erangeflag_p ())
    348  1.1  mrg     {
    349  1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MAX (1): %ld\n", d);
    350  1.1  mrg       exit (1);
    351  1.1  mrg     }
    352  1.1  mrg   mpfr_add_ui (x, x, 1, MPFR_RNDN);
    353  1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    354  1.1  mrg   if (d != LONG_MAX || !mpfr_erangeflag_p ())
    355  1.1  mrg     {
    356  1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MAX (2)\n");
    357  1.1  mrg       exit (1);
    358  1.1  mrg     }
    359  1.1  mrg   mpfr_set_si (x, LONG_MIN, MPFR_RNDN);
    360  1.1  mrg   mpfr_clear_erangeflag ();
    361  1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    362  1.1  mrg   if (d != LONG_MIN || mpfr_erangeflag_p ())
    363  1.1  mrg     {
    364  1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MIN (1)\n");
    365  1.1  mrg       exit (1);
    366  1.1  mrg     }
    367  1.1  mrg   mpfr_sub_ui (x, x, 1, MPFR_RNDN);
    368  1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    369  1.1  mrg   if (d != LONG_MIN || !mpfr_erangeflag_p ())
    370  1.1  mrg     {
    371  1.1  mrg       printf ("ERROR for get_si + ERANGE + LONG_MIN (2)\n");
    372  1.1  mrg       exit (1);
    373  1.1  mrg     }
    374  1.1  mrg 
    375  1.1  mrg   mpfr_set_nan (x);
    376  1.1  mrg   mpfr_clear_erangeflag ();
    377  1.1  mrg   d = mpfr_get_ui (x, MPFR_RNDN);
    378  1.1  mrg   if (d != 0 || !mpfr_erangeflag_p ())
    379  1.1  mrg     {
    380  1.1  mrg       printf ("ERROR for get_ui + NaN\n");
    381  1.1  mrg       exit (1);
    382  1.1  mrg     }
    383  1.1  mrg   mpfr_clear_erangeflag ();
    384  1.1  mrg   d = mpfr_get_si (x, MPFR_RNDN);
    385  1.1  mrg   if (d != 0 || !mpfr_erangeflag_p ())
    386  1.1  mrg     {
    387  1.1  mrg       printf ("ERROR for get_si + NaN\n");
    388  1.1  mrg       exit (1);
    389  1.1  mrg     }
    390  1.1  mrg 
    391  1.1  mrg   emin = mpfr_get_emin ();
    392  1.1  mrg   mpfr_set_prec (x, 2);
    393  1.1  mrg 
    394  1.1  mrg   mpfr_set_emin (4);
    395  1.1  mrg   mpfr_clear_flags ();
    396  1.1  mrg   mpfr_set_ui (x, 7, MPFR_RNDU);
    397  1.1  mrg   flag = mpfr_underflow_p ();
    398  1.1  mrg   mpfr_set_emin (emin);
    399  1.1  mrg   if (mpfr_cmp_ui (x, 8) != 0)
    400  1.1  mrg     {
    401  1.1  mrg       printf ("Error for mpfr_set_ui (x, 7, MPFR_RNDU), prec = 2, emin = 4\n");
    402  1.1  mrg       exit (1);
    403  1.1  mrg     }
    404  1.1  mrg   if (flag)
    405  1.1  mrg     {
    406  1.1  mrg       printf ("mpfr_set_ui (x, 7, MPFR_RNDU) should not underflow "
    407  1.1  mrg               "with prec = 2, emin = 4\n");
    408  1.1  mrg       exit (1);
    409  1.1  mrg     }
    410  1.1  mrg 
    411  1.1  mrg   mpfr_set_emin (4);
    412  1.1  mrg   mpfr_clear_flags ();
    413  1.1  mrg   mpfr_set_si (x, -7, MPFR_RNDD);
    414  1.1  mrg   flag = mpfr_underflow_p ();
    415  1.1  mrg   mpfr_set_emin (emin);
    416  1.1  mrg   if (mpfr_cmp_si (x, -8) != 0)
    417  1.1  mrg     {
    418  1.1  mrg       printf ("Error for mpfr_set_si (x, -7, MPFR_RNDD), prec = 2, emin = 4\n");
    419  1.1  mrg       exit (1);
    420  1.1  mrg     }
    421  1.1  mrg   if (flag)
    422  1.1  mrg     {
    423  1.1  mrg       printf ("mpfr_set_si (x, -7, MPFR_RNDD) should not underflow "
    424  1.1  mrg               "with prec = 2, emin = 4\n");
    425  1.1  mrg       exit (1);
    426  1.1  mrg     }
    427  1.1  mrg 
    428  1.1  mrg   mpfr_clear (x);
    429  1.1  mrg 
    430  1.1  mrg   test_2exp ();
    431  1.1  mrg   test_macros ();
    432  1.1  mrg   tests_end_mpfr ();
    433  1.1  mrg   return 0;
    434  1.1  mrg }
    435