Home | History | Annotate | Line # | Download | only in tests
texceptions.c revision 1.1.1.2
      1      1.1  mrg /* Test file for exceptions.
      2      1.1  mrg 
      3  1.1.1.2  mrg Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
      4  1.1.1.2  mrg Contributed by the AriC and Caramel 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 
     26      1.1  mrg #include "mpfr-test.h"
     27      1.1  mrg 
     28      1.1  mrg #define ERROR(s) do { printf(s"\n"); exit(1); } while(0)
     29      1.1  mrg 
     30      1.1  mrg /* Test powerof2 */
     31      1.1  mrg static void
     32      1.1  mrg check_powerof2 (void)
     33      1.1  mrg {
     34      1.1  mrg   mpfr_t x;
     35      1.1  mrg 
     36      1.1  mrg   mpfr_init (x);
     37      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
     38      1.1  mrg   MPFR_ASSERTN (mpfr_powerof2_raw (x));
     39      1.1  mrg   mpfr_set_ui (x, 3, MPFR_RNDN);
     40      1.1  mrg   MPFR_ASSERTN (!mpfr_powerof2_raw (x));
     41      1.1  mrg   mpfr_clear (x);
     42      1.1  mrg }
     43      1.1  mrg 
     44      1.1  mrg /* Test default rounding mode */
     45      1.1  mrg static void
     46      1.1  mrg check_default_rnd (void)
     47      1.1  mrg {
     48      1.1  mrg   int r;
     49      1.1  mrg   mpfr_rnd_t t;
     50      1.1  mrg   for(r = 0 ; r < MPFR_RND_MAX ; r++)
     51      1.1  mrg     {
     52      1.1  mrg       mpfr_set_default_rounding_mode ((mpfr_rnd_t) r);
     53      1.1  mrg       t = (mpfr_get_default_rounding_mode) ();
     54      1.1  mrg       if ((mpfr_rnd_t) r != t)
     55      1.1  mrg         {
     56      1.1  mrg           printf ("%s %s\n", mpfr_print_rnd_mode ((mpfr_rnd_t) r),
     57      1.1  mrg                   mpfr_print_rnd_mode (t));
     58      1.1  mrg           ERROR("ERROR in setting / getting default rounding mode (1)");
     59      1.1  mrg         }
     60      1.1  mrg     }
     61      1.1  mrg   mpfr_set_default_rounding_mode ((mpfr_rnd_t) MPFR_RND_MAX);
     62      1.1  mrg   if (mpfr_get_default_rounding_mode() != MPFR_RNDA)
     63      1.1  mrg     ERROR("ERROR in setting / getting default rounding mode (2)");
     64      1.1  mrg   mpfr_set_default_rounding_mode((mpfr_rnd_t) -1);
     65      1.1  mrg   if (mpfr_get_default_rounding_mode() != MPFR_RNDA)
     66      1.1  mrg     ERROR("ERROR in setting / getting default rounding mode (3)");
     67      1.1  mrg }
     68      1.1  mrg 
     69      1.1  mrg static void
     70      1.1  mrg check_emin_emax (void)
     71      1.1  mrg {
     72      1.1  mrg   mpfr_exp_t old_emin, old_emax;
     73      1.1  mrg 
     74      1.1  mrg   old_emin = mpfr_get_emin ();
     75      1.1  mrg   old_emax = mpfr_get_emax ();
     76      1.1  mrg 
     77      1.1  mrg   /* Check the functions not the macros ! */
     78      1.1  mrg   if ((mpfr_set_emin)(MPFR_EMIN_MIN) != 0)
     79      1.1  mrg     ERROR("set_emin failed!");
     80      1.1  mrg   if ((mpfr_get_emin)() != MPFR_EMIN_MIN)
     81      1.1  mrg     ERROR("get_emin FAILED!");
     82      1.1  mrg   if ((mpfr_set_emin)(MPFR_EMIN_MIN-1) == 0)
     83      1.1  mrg     ERROR("set_emin failed! (2)");
     84      1.1  mrg 
     85      1.1  mrg   if ((mpfr_set_emax)(MPFR_EMAX_MAX) != 0)
     86      1.1  mrg     ERROR("set_emax failed!");
     87      1.1  mrg   if ((mpfr_get_emax)() != MPFR_EMAX_MAX)
     88      1.1  mrg     ERROR("get_emax FAILED!");
     89      1.1  mrg   if ((mpfr_set_emax)(MPFR_EMAX_MAX+1) == 0)
     90      1.1  mrg     ERROR("set_emax failed! (2)");
     91      1.1  mrg 
     92      1.1  mrg   if ((mpfr_get_emin_min) () != MPFR_EMIN_MIN)
     93      1.1  mrg     ERROR ("get_emin_min");
     94      1.1  mrg   if ((mpfr_get_emin_max) () != MPFR_EMIN_MAX)
     95      1.1  mrg     ERROR ("get_emin_max");
     96      1.1  mrg   if ((mpfr_get_emax_min) () != MPFR_EMAX_MIN)
     97      1.1  mrg     ERROR ("get_emax_min");
     98      1.1  mrg   if ((mpfr_get_emax_max) () != MPFR_EMAX_MAX)
     99      1.1  mrg     ERROR ("get_emax_max");
    100      1.1  mrg 
    101      1.1  mrg   set_emin (old_emin);
    102      1.1  mrg   set_emax (old_emax);
    103      1.1  mrg }
    104      1.1  mrg 
    105      1.1  mrg static void
    106      1.1  mrg check_set_get_prec (void)
    107      1.1  mrg {
    108      1.1  mrg   mpfr_t x;
    109      1.1  mrg 
    110      1.1  mrg   mpfr_init2 (x, 17);
    111      1.1  mrg   if (mpfr_get_prec (x) != 17 || (mpfr_get_prec)(x) != 17)
    112      1.1  mrg     ERROR ("mpfr_get_prec");
    113      1.1  mrg   mpfr_clear (x);
    114      1.1  mrg }
    115      1.1  mrg 
    116      1.1  mrg static void
    117      1.1  mrg mpfr_set_double_range (void)
    118      1.1  mrg {
    119      1.1  mrg   mpfr_set_default_prec (54);
    120      1.1  mrg   if (mpfr_get_default_prec () != 54)
    121      1.1  mrg     ERROR ("get_default_prec failed (1)");
    122      1.1  mrg   mpfr_set_default_prec (53);
    123      1.1  mrg   if ((mpfr_get_default_prec) () != 53)
    124      1.1  mrg     ERROR ("get_default_prec failed (2)");
    125      1.1  mrg 
    126      1.1  mrg   /* in double precision format, the unbiased exponent is between 0 and
    127      1.1  mrg      2047, where 0 is used for subnormal numbers, and 2047 for special
    128      1.1  mrg      numbers (infinities, NaN), and the bias is 1023, thus "normal" numbers
    129      1.1  mrg      have an exponent between -1022 and 1023, corresponding to numbers
    130      1.1  mrg      between 2^(-1022) and previous(2^(1024)).
    131      1.1  mrg      (The smallest subnormal number is 0.(0^51)1*2^(-1022)= 2^(-1074).)
    132      1.1  mrg 
    133      1.1  mrg      The smallest normal power of two is 1.0*2^(-1022).
    134      1.1  mrg      The largest normal power of two is 2^1023.
    135      1.1  mrg      (We have to add one for mpfr since mantissa are between 1/2 and 1.)
    136      1.1  mrg   */
    137      1.1  mrg 
    138      1.1  mrg   set_emin (-1021);
    139      1.1  mrg   set_emax (1024);
    140      1.1  mrg }
    141      1.1  mrg 
    142      1.1  mrg static void
    143      1.1  mrg check_flags (void)
    144      1.1  mrg {
    145      1.1  mrg   mpfr_t x;
    146      1.1  mrg   mpfr_exp_t old_emin, old_emax;
    147      1.1  mrg 
    148      1.1  mrg   old_emin = mpfr_get_emin ();
    149      1.1  mrg   old_emax = mpfr_get_emax ();
    150      1.1  mrg   mpfr_init (x);
    151      1.1  mrg 
    152      1.1  mrg   /* Check the functions not the macros ! */
    153      1.1  mrg   (mpfr_clear_flags)();
    154      1.1  mrg   mpfr_set_double_range ();
    155      1.1  mrg 
    156      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    157      1.1  mrg   (mpfr_clear_overflow)();
    158      1.1  mrg   mpfr_mul_2exp (x, x, 1024, MPFR_RNDN);
    159      1.1  mrg   if (!(mpfr_overflow_p)())
    160      1.1  mrg     ERROR("ERROR: No overflow detected!\n");
    161      1.1  mrg 
    162      1.1  mrg   (mpfr_clear_underflow)();
    163      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    164      1.1  mrg   mpfr_div_2exp (x, x, 1025, MPFR_RNDN);
    165      1.1  mrg   if (!(mpfr_underflow_p)())
    166      1.1  mrg     ERROR("ERROR: No underflow detected!\n");
    167      1.1  mrg 
    168      1.1  mrg   (mpfr_clear_nanflag)();
    169      1.1  mrg   MPFR_SET_NAN(x);
    170      1.1  mrg   mpfr_add (x, x, x, MPFR_RNDN);
    171      1.1  mrg   if (!(mpfr_nanflag_p)())
    172      1.1  mrg     ERROR("ERROR: No NaN flag!\n");
    173      1.1  mrg 
    174      1.1  mrg   (mpfr_clear_inexflag)();
    175      1.1  mrg   mpfr_set_ui(x, 2, MPFR_RNDN);
    176      1.1  mrg   mpfr_cos(x, x, MPFR_RNDN);
    177      1.1  mrg   if (!(mpfr_inexflag_p)())
    178      1.1  mrg     ERROR("ERROR: No inexact flag!\n");
    179      1.1  mrg 
    180      1.1  mrg   (mpfr_clear_erangeflag) ();
    181      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    182      1.1  mrg   mpfr_mul_2exp (x, x, 1024, MPFR_RNDN);
    183      1.1  mrg   mpfr_get_ui (x, MPFR_RNDN);
    184      1.1  mrg   if (!(mpfr_erangeflag_p)())
    185      1.1  mrg     ERROR ("ERROR: No erange flag!\n");
    186      1.1  mrg 
    187      1.1  mrg   mpfr_clear (x);
    188      1.1  mrg   set_emin (old_emin);
    189      1.1  mrg   set_emax (old_emax);
    190      1.1  mrg }
    191      1.1  mrg 
    192      1.1  mrg static void
    193      1.1  mrg test_set_underflow (void)
    194      1.1  mrg {
    195      1.1  mrg   mpfr_t x, zero, min;
    196      1.1  mrg   mpfr_ptr r[MPFR_RND_MAX];
    197      1.1  mrg   int t[MPFR_RND_MAX] = { 1, -1, 1, -1, 1 }; /* RNDN, RNDZ, RNDU, RNDD, RNDA */
    198      1.1  mrg   int i;
    199      1.1  mrg   int s;
    200      1.1  mrg 
    201      1.1  mrg   mpfr_inits (x, zero, min, (mpfr_ptr) 0);
    202      1.1  mrg   mpfr_set_ui (zero, 0, MPFR_RNDN);
    203      1.1  mrg   mpfr_set_ui (min, 0, MPFR_RNDN);
    204      1.1  mrg   mpfr_nextabove (min);
    205      1.1  mrg   r[0] = r[2] = r[4] = min; /* RNDN, RNDU, RNDA */
    206      1.1  mrg   r[1] = r[3] = zero;       /* RNDZ, RNDD */
    207      1.1  mrg   for (s = 1; s > 0; s = -1)
    208      1.1  mrg     {
    209      1.1  mrg       for (i = 0; i < MPFR_RND_MAX ; i++)
    210      1.1  mrg         {
    211      1.1  mrg           int j;
    212      1.1  mrg           int inex;
    213      1.1  mrg 
    214      1.1  mrg           j = s < 0 && i > 1 ? 5 - i : i;
    215      1.1  mrg           inex = mpfr_underflow (x, (mpfr_rnd_t) i, s);
    216      1.1  mrg           if (mpfr_cmp (x, r[j]) || inex * t[j] <= 0)
    217      1.1  mrg             {
    218      1.1  mrg               printf ("Error in test_set_underflow, sign = %d,"
    219      1.1  mrg                       " rnd_mode = %s\n", s, mpfr_print_rnd_mode ((mpfr_rnd_t) i));
    220      1.1  mrg               printf ("Got\n");
    221      1.1  mrg               mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
    222      1.1  mrg               printf (", inex = %d\ninstead of\n", inex);
    223      1.1  mrg               mpfr_out_str (stdout, 2, 0, r[j], MPFR_RNDN);
    224      1.1  mrg               printf (", inex = %d\n", t[j]);
    225      1.1  mrg               exit (1);
    226      1.1  mrg             }
    227      1.1  mrg         }
    228      1.1  mrg       mpfr_neg (zero, zero, MPFR_RNDN);
    229      1.1  mrg       mpfr_neg (min, min, MPFR_RNDN);
    230      1.1  mrg     }
    231      1.1  mrg   mpfr_clears (x, zero, min, (mpfr_ptr) 0);
    232      1.1  mrg }
    233      1.1  mrg 
    234      1.1  mrg static void
    235      1.1  mrg test_set_overflow (void)
    236      1.1  mrg {
    237      1.1  mrg   mpfr_t x, inf, max;
    238      1.1  mrg   mpfr_ptr r[MPFR_RND_MAX];
    239      1.1  mrg   int t[MPFR_RND_MAX] = { 1, -1, 1, -1, 1 }; /* RNDN, RNDZ, RNDU, RNDD, RNDA */
    240      1.1  mrg   int i;
    241      1.1  mrg   int s;
    242      1.1  mrg 
    243      1.1  mrg   mpfr_inits2 (32, x, inf, max, (mpfr_ptr) 0);
    244      1.1  mrg   mpfr_set_inf (inf, 1);
    245      1.1  mrg   mpfr_set_inf (max, 1);
    246      1.1  mrg   mpfr_nextbelow (max);
    247      1.1  mrg   r[0] = r[2] = r[4] = inf; /* RNDN, RNDU, RNDA */
    248      1.1  mrg   r[1] = r[3] = max;        /* RNDZ, RNDD */
    249      1.1  mrg   for (s = 1; s > 0; s = -1)
    250      1.1  mrg     {
    251      1.1  mrg       for (i = 0; i < MPFR_RND_MAX ; i++)
    252      1.1  mrg         {
    253      1.1  mrg           int j;
    254      1.1  mrg           int inex;
    255      1.1  mrg 
    256      1.1  mrg           j = s < 0 && i > 1 ? 5 - i : i;
    257      1.1  mrg           inex = mpfr_overflow (x, (mpfr_rnd_t) i, s);
    258      1.1  mrg           if (mpfr_cmp (x, r[j]) || inex * t[j] <= 0)
    259      1.1  mrg             {
    260      1.1  mrg               printf ("Error in test_set_overflow, sign = %d,"
    261      1.1  mrg                       " rnd_mode = %s\n", s, mpfr_print_rnd_mode ((mpfr_rnd_t) i));
    262      1.1  mrg               printf ("Got\n");
    263      1.1  mrg               mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
    264      1.1  mrg               printf (", inex = %d\ninstead of\n", inex);
    265      1.1  mrg               mpfr_out_str (stdout, 2, 0, r[j], MPFR_RNDN);
    266      1.1  mrg               printf (", inex = %d\n", t[j]);
    267      1.1  mrg               exit (1);
    268      1.1  mrg             }
    269      1.1  mrg         }
    270      1.1  mrg       mpfr_neg (inf, inf, MPFR_RNDN);
    271      1.1  mrg       mpfr_neg (max, max, MPFR_RNDN);
    272      1.1  mrg     }
    273      1.1  mrg   mpfr_clears (x, inf, max, (mpfr_ptr) 0);
    274      1.1  mrg }
    275      1.1  mrg 
    276      1.1  mrg static void
    277      1.1  mrg check_set (void)
    278      1.1  mrg {
    279      1.1  mrg   mpfr_clear_flags ();
    280      1.1  mrg 
    281      1.1  mrg   mpfr_set_overflow ();
    282      1.1  mrg   MPFR_ASSERTN ((mpfr_overflow_p) ());
    283      1.1  mrg   mpfr_set_underflow ();
    284      1.1  mrg   MPFR_ASSERTN ((mpfr_underflow_p) ());
    285  1.1.1.2  mrg   mpfr_set_divby0 ();
    286  1.1.1.2  mrg   MPFR_ASSERTN ((mpfr_divby0_p) ());
    287      1.1  mrg   mpfr_set_nanflag ();
    288      1.1  mrg   MPFR_ASSERTN ((mpfr_nanflag_p) ());
    289      1.1  mrg   mpfr_set_inexflag ();
    290      1.1  mrg   MPFR_ASSERTN ((mpfr_inexflag_p) ());
    291      1.1  mrg   mpfr_set_erangeflag ();
    292      1.1  mrg   MPFR_ASSERTN ((mpfr_erangeflag_p) ());
    293      1.1  mrg 
    294  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_ALL);
    295  1.1.1.2  mrg 
    296  1.1.1.2  mrg   mpfr_clear_overflow ();
    297  1.1.1.2  mrg   MPFR_ASSERTN (! (mpfr_overflow_p) ());
    298  1.1.1.2  mrg   mpfr_clear_underflow ();
    299  1.1.1.2  mrg   MPFR_ASSERTN (! (mpfr_underflow_p) ());
    300  1.1.1.2  mrg   mpfr_clear_divby0 ();
    301  1.1.1.2  mrg   MPFR_ASSERTN (! (mpfr_divby0_p) ());
    302  1.1.1.2  mrg   mpfr_clear_nanflag ();
    303  1.1.1.2  mrg   MPFR_ASSERTN (! (mpfr_nanflag_p) ());
    304  1.1.1.2  mrg   mpfr_clear_inexflag ();
    305  1.1.1.2  mrg   MPFR_ASSERTN (! (mpfr_inexflag_p) ());
    306  1.1.1.2  mrg   mpfr_clear_erangeflag ();
    307  1.1.1.2  mrg   MPFR_ASSERTN (! (mpfr_erangeflag_p) ());
    308  1.1.1.2  mrg 
    309  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    310  1.1.1.2  mrg 
    311  1.1.1.2  mrg   (mpfr_set_overflow) ();
    312  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_overflow_p ());
    313  1.1.1.2  mrg   (mpfr_set_underflow) ();
    314  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_underflow_p ());
    315  1.1.1.2  mrg   (mpfr_set_divby0) ();
    316  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_divby0_p ());
    317  1.1.1.2  mrg   (mpfr_set_nanflag) ();
    318  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_nanflag_p ());
    319  1.1.1.2  mrg   (mpfr_set_inexflag) ();
    320  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inexflag_p ());
    321  1.1.1.2  mrg   (mpfr_set_erangeflag) ();
    322  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_erangeflag_p ());
    323  1.1.1.2  mrg 
    324  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_ALL);
    325  1.1.1.2  mrg 
    326  1.1.1.2  mrg   (mpfr_clear_overflow) ();
    327  1.1.1.2  mrg   MPFR_ASSERTN (! mpfr_overflow_p ());
    328  1.1.1.2  mrg   (mpfr_clear_underflow) ();
    329  1.1.1.2  mrg   MPFR_ASSERTN (! mpfr_underflow_p ());
    330  1.1.1.2  mrg   (mpfr_clear_divby0) ();
    331  1.1.1.2  mrg   MPFR_ASSERTN (! mpfr_divby0_p ());
    332  1.1.1.2  mrg   (mpfr_clear_nanflag) ();
    333  1.1.1.2  mrg   MPFR_ASSERTN (! mpfr_nanflag_p ());
    334  1.1.1.2  mrg   (mpfr_clear_inexflag) ();
    335  1.1.1.2  mrg   MPFR_ASSERTN (! mpfr_inexflag_p ());
    336  1.1.1.2  mrg   (mpfr_clear_erangeflag) ();
    337  1.1.1.2  mrg   MPFR_ASSERTN (! mpfr_erangeflag_p ());
    338  1.1.1.2  mrg 
    339  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    340      1.1  mrg }
    341      1.1  mrg 
    342      1.1  mrg int
    343      1.1  mrg main (int argc, char *argv[])
    344      1.1  mrg {
    345      1.1  mrg   mpfr_t x, y;
    346      1.1  mrg   mpfr_exp_t emin, emax;
    347      1.1  mrg 
    348      1.1  mrg   tests_start_mpfr ();
    349      1.1  mrg 
    350      1.1  mrg   test_set_underflow ();
    351      1.1  mrg   test_set_overflow ();
    352      1.1  mrg   check_default_rnd();
    353      1.1  mrg 
    354      1.1  mrg   mpfr_init (x);
    355      1.1  mrg   mpfr_init (y);
    356      1.1  mrg 
    357      1.1  mrg   emin = mpfr_get_emin ();
    358      1.1  mrg   emax = mpfr_get_emax ();
    359      1.1  mrg   if (emin >= emax)
    360      1.1  mrg     {
    361      1.1  mrg       printf ("Error: emin >= emax\n");
    362      1.1  mrg       exit (1);
    363      1.1  mrg     }
    364      1.1  mrg 
    365      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    366      1.1  mrg   mpfr_mul_2exp (x, x, 1024, MPFR_RNDN);
    367      1.1  mrg   mpfr_set_double_range ();
    368      1.1  mrg   mpfr_check_range (x, 0, MPFR_RNDN);
    369      1.1  mrg   if (!mpfr_inf_p (x) || (mpfr_sgn(x) <= 0))
    370      1.1  mrg     {
    371      1.1  mrg       printf ("Error: 2^1024 rounded to nearest should give +Inf\n");
    372      1.1  mrg       exit (1);
    373      1.1  mrg     }
    374      1.1  mrg 
    375      1.1  mrg   set_emax (1025);
    376      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    377      1.1  mrg   mpfr_mul_2exp (x, x, 1024, MPFR_RNDN);
    378      1.1  mrg   mpfr_set_double_range ();
    379      1.1  mrg   mpfr_check_range (x, 0, MPFR_RNDD);
    380      1.1  mrg   if (!mpfr_number_p (x))
    381      1.1  mrg     {
    382      1.1  mrg       printf ("Error: 2^1024 rounded down should give a normal number\n");
    383      1.1  mrg       exit (1);
    384      1.1  mrg     }
    385      1.1  mrg 
    386      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    387      1.1  mrg   mpfr_mul_2exp (x, x, 1023, MPFR_RNDN);
    388      1.1  mrg   mpfr_add (x, x, x, MPFR_RNDN);
    389      1.1  mrg   if (!mpfr_inf_p (x) || (mpfr_sgn(x) <= 0))
    390      1.1  mrg     {
    391      1.1  mrg       printf ("Error: x+x rounded to nearest for x=2^1023 should give +Inf\n");
    392  1.1.1.2  mrg       printf ("emax = %ld\n", (long) mpfr_get_emax ());
    393      1.1  mrg       printf ("got "); mpfr_print_binary (x); puts ("");
    394      1.1  mrg       exit (1);
    395      1.1  mrg     }
    396      1.1  mrg 
    397      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    398      1.1  mrg   mpfr_mul_2exp (x, x, 1023, MPFR_RNDN);
    399      1.1  mrg   mpfr_add (x, x, x, MPFR_RNDD);
    400      1.1  mrg   if (!mpfr_number_p (x))
    401      1.1  mrg     {
    402      1.1  mrg       printf ("Error: x+x rounded down for x=2^1023 should give"
    403      1.1  mrg               " a normal number\n");
    404      1.1  mrg       exit (1);
    405      1.1  mrg     }
    406      1.1  mrg 
    407      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    408      1.1  mrg   mpfr_div_2exp (x, x, 1022, MPFR_RNDN);
    409      1.1  mrg   mpfr_set_str_binary (y, "1.1e-1022"); /* y = 3/2*x */
    410      1.1  mrg   mpfr_sub (y, y, x, MPFR_RNDZ);
    411      1.1  mrg   if (mpfr_cmp_ui (y, 0))
    412      1.1  mrg     {
    413      1.1  mrg       printf ("Error: y-x rounded to zero should give 0"
    414      1.1  mrg               " for y=3/2*2^(-1022), x=2^(-1022)\n");
    415      1.1  mrg       printf ("y="); mpfr_print_binary (y); puts ("");
    416      1.1  mrg       exit (1);
    417      1.1  mrg     }
    418      1.1  mrg 
    419      1.1  mrg   set_emin (-1026);
    420      1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    421      1.1  mrg   mpfr_div_2exp (x, x, 1025, MPFR_RNDN);
    422      1.1  mrg   mpfr_set_double_range ();
    423      1.1  mrg   mpfr_check_range (x, 0, MPFR_RNDN);
    424      1.1  mrg   if (!MPFR_IS_ZERO (x) )
    425      1.1  mrg     {
    426      1.1  mrg       printf ("Error: x rounded to nearest for x=2^-1024 should give Zero\n");
    427  1.1.1.2  mrg       printf ("emin = %ld\n", (long) mpfr_get_emin ());
    428      1.1  mrg       printf ("got "); mpfr_dump (x);
    429      1.1  mrg       exit (1);
    430      1.1  mrg     }
    431      1.1  mrg 
    432      1.1  mrg   mpfr_clear (x);
    433      1.1  mrg   mpfr_clear (y);
    434      1.1  mrg 
    435      1.1  mrg   set_emin (emin);
    436      1.1  mrg   set_emax (emax);
    437      1.1  mrg 
    438      1.1  mrg   check_emin_emax();
    439      1.1  mrg   check_flags();
    440      1.1  mrg   check_set_get_prec ();
    441      1.1  mrg   check_powerof2 ();
    442      1.1  mrg   check_set ();
    443      1.1  mrg 
    444      1.1  mrg   tests_end_mpfr ();
    445      1.1  mrg   return 0;
    446      1.1  mrg }
    447