(root)/
mpfr-4.2.1/
tests/
texceptions.c
       1  /* Test file for features related to exceptions.
       2  
       3  Copyright 2001-2023 Free Software Foundation, Inc.
       4  Contributed by the AriC and Caramba projects, INRIA.
       5  
       6  This file is part of the GNU MPFR Library.
       7  
       8  The GNU MPFR Library is free software; you can redistribute it and/or modify
       9  it under the terms of the GNU Lesser General Public License as published by
      10  the Free Software Foundation; either version 3 of the License, or (at your
      11  option) any later version.
      12  
      13  The GNU MPFR Library is distributed in the hope that it will be useful, but
      14  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      15  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
      16  License for more details.
      17  
      18  You should have received a copy of the GNU Lesser General Public License
      19  along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
      20  https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
      21  51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
      22  
      23  #include "mpfr-test.h"
      24  
      25  #define PRINT_ERROR(s) do { printf ("%s\n", s); exit (1); } while (0)
      26  
      27  /* Test powerof2 */
      28  static void
      29  check_powerof2 (void)
      30  {
      31    mpfr_t x;
      32  
      33    mpfr_init (x);
      34    mpfr_set_ui (x, 1, MPFR_RNDN);
      35    MPFR_ASSERTN (mpfr_powerof2_raw (x));
      36    mpfr_set_ui (x, 3, MPFR_RNDN);
      37    MPFR_ASSERTN (!mpfr_powerof2_raw (x));
      38    mpfr_clear (x);
      39  }
      40  
      41  /* Test default rounding mode */
      42  static void
      43  check_default_rnd (void)
      44  {
      45    int r;
      46    mpfr_rnd_t t;
      47    RND_LOOP (r)
      48      {
      49        mpfr_set_default_rounding_mode ((mpfr_rnd_t) r);
      50        t = (mpfr_get_default_rounding_mode) ();
      51        if ((mpfr_rnd_t) r != t)
      52          {
      53            printf ("%s %s\n", mpfr_print_rnd_mode ((mpfr_rnd_t) r),
      54                    mpfr_print_rnd_mode (t));
      55            PRINT_ERROR ("ERROR in setting / getting default rounding mode (1)");
      56          }
      57      }
      58    mpfr_set_default_rounding_mode ((mpfr_rnd_t) MPFR_RND_MAX);
      59    if (mpfr_get_default_rounding_mode() != MPFR_RNDF)
      60      PRINT_ERROR ("ERROR in setting / getting default rounding mode (2)");
      61    mpfr_set_default_rounding_mode((mpfr_rnd_t) -1);
      62    if (mpfr_get_default_rounding_mode() != MPFR_RNDF)
      63      PRINT_ERROR ("ERROR in setting / getting default rounding mode (3)");
      64  }
      65  
      66  static void
      67  check_emin_emax (void)
      68  {
      69    mpfr_exp_t old_emin, old_emax;
      70  
      71    old_emin = mpfr_get_emin ();
      72    old_emax = mpfr_get_emax ();
      73  
      74    /* Check the functions not the macros ! */
      75    if ((mpfr_set_emin)(MPFR_EMIN_MIN) != 0)
      76      PRINT_ERROR ("set_emin failed!");
      77    if ((mpfr_get_emin)() != MPFR_EMIN_MIN)
      78      PRINT_ERROR ("get_emin FAILED!");
      79    if ((mpfr_set_emin)(MPFR_EMIN_MIN-1) == 0)
      80      PRINT_ERROR ("set_emin failed! (2)");
      81  
      82    if ((mpfr_set_emax)(MPFR_EMAX_MAX) != 0)
      83      PRINT_ERROR ("set_emax failed!");
      84    if ((mpfr_get_emax)() != MPFR_EMAX_MAX)
      85      PRINT_ERROR ("get_emax FAILED!");
      86    if ((mpfr_set_emax)(MPFR_EMAX_MAX+1) == 0)
      87      PRINT_ERROR ("set_emax failed! (2)");
      88  
      89    if ((mpfr_get_emin_min) () != MPFR_EMIN_MIN)
      90      PRINT_ERROR ("get_emin_min");
      91    if ((mpfr_get_emin_max) () != MPFR_EMIN_MAX)
      92      PRINT_ERROR ("get_emin_max");
      93    if ((mpfr_get_emax_min) () != MPFR_EMAX_MIN)
      94      PRINT_ERROR ("get_emax_min");
      95    if ((mpfr_get_emax_max) () != MPFR_EMAX_MAX)
      96      PRINT_ERROR ("get_emax_max");
      97  
      98    set_emin (old_emin);
      99    set_emax (old_emax);
     100  }
     101  
     102  static void
     103  check_get_prec (void)
     104  {
     105    mpfr_t x;
     106    int i = 0;
     107  
     108    mpfr_init2 (x, 17);
     109  
     110    if (mpfr_get_prec (x) != 17 || (mpfr_get_prec) (x) != 17)
     111      PRINT_ERROR ("mpfr_get_prec");
     112  
     113  #ifdef IGNORE_CPP_COMPAT
     114  #pragma GCC diagnostic push
     115  #pragma GCC diagnostic ignored "-Wc++-compat"
     116  #endif
     117  
     118    if (mpfr_get_prec ((i++, VOIDP_CAST(x))) != 17)
     119      PRINT_ERROR ("mpfr_get_prec (2)");
     120  
     121  #ifdef IGNORE_CPP_COMPAT
     122  #pragma GCC diagnostic pop
     123  #endif
     124  
     125    MPFR_ASSERTN (i == 1);
     126    mpfr_clear (x);
     127  }
     128  
     129  static void
     130  mpfr_set_double_range (void)
     131  {
     132    mpfr_set_default_prec (54);
     133    if (mpfr_get_default_prec () != 54)
     134      PRINT_ERROR ("get_default_prec failed (1)");
     135    mpfr_set_default_prec (53);
     136    if ((mpfr_get_default_prec) () != 53)
     137      PRINT_ERROR ("get_default_prec failed (2)");
     138  
     139    /* in double precision format, the unbiased exponent is between 0 and
     140       2047, where 0 is used for subnormal numbers, and 2047 for special
     141       numbers (infinities, NaN), and the bias is 1023, thus "normal" numbers
     142       have an exponent between -1022 and 1023, corresponding to numbers
     143       between 2^(-1022) and previous(2^(1024)).
     144       (The smallest subnormal number is 0.(0^51)1*2^(-1022)= 2^(-1074).)
     145  
     146       The smallest normal power of two is 1.0*2^(-1022).
     147       The largest normal power of two is 2^1023.
     148       (We have to add one for mpfr since mantissa are between 1/2 and 1.)
     149    */
     150  
     151    set_emin (-1021);
     152    set_emax (1024);
     153  }
     154  
     155  static void
     156  check_flags (void)
     157  {
     158    mpfr_t x;
     159    mpfr_exp_t old_emin, old_emax;
     160  
     161    old_emin = mpfr_get_emin ();
     162    old_emax = mpfr_get_emax ();
     163    mpfr_init (x);
     164  
     165    /* Check the functions not the macros ! */
     166    (mpfr_clear_flags)();
     167    mpfr_set_double_range ();
     168  
     169    mpfr_set_ui (x, 1, MPFR_RNDN);
     170    (mpfr_clear_overflow)();
     171    mpfr_mul_2ui (x, x, 1024, MPFR_RNDN);
     172    if (!(mpfr_overflow_p)())
     173      PRINT_ERROR ("ERROR: No overflow detected!\n");
     174  
     175    (mpfr_clear_underflow)();
     176    mpfr_set_ui (x, 1, MPFR_RNDN);
     177    mpfr_div_2ui (x, x, 1025, MPFR_RNDN);
     178    if (!(mpfr_underflow_p)())
     179      PRINT_ERROR ("ERROR: No underflow detected!\n");
     180  
     181    (mpfr_clear_nanflag)();
     182    MPFR_SET_NAN(x);
     183    mpfr_add (x, x, x, MPFR_RNDN);
     184    if (!(mpfr_nanflag_p)())
     185      PRINT_ERROR ("ERROR: No NaN flag!\n");
     186  
     187    (mpfr_clear_inexflag)();
     188    mpfr_set_ui(x, 2, MPFR_RNDN);
     189    mpfr_cos(x, x, MPFR_RNDN);
     190    if (!(mpfr_inexflag_p)())
     191      PRINT_ERROR ("ERROR: No inexact flag!\n");
     192  
     193    (mpfr_clear_erangeflag) ();
     194    mpfr_set_ui (x, 1, MPFR_RNDN);
     195    mpfr_mul_2ui (x, x, 1024, MPFR_RNDN);
     196    mpfr_get_ui (x, MPFR_RNDN);
     197    if (!(mpfr_erangeflag_p)())
     198      PRINT_ERROR ("ERROR: No erange flag!\n");
     199  
     200    mpfr_clear (x);
     201    set_emin (old_emin);
     202    set_emax (old_emax);
     203  }
     204  
     205  static void
     206  test_set_underflow (void)
     207  {
     208    mpfr_t x, zero, min;
     209    mpfr_ptr r[MPFR_RND_MAX];
     210    int t[MPFR_RND_MAX] = { 1, -1, 1, -1, 1 }; /* RNDN, RNDZ, RNDU, RNDD, RNDA */
     211    int i;
     212    int s;
     213  
     214    mpfr_inits (x, zero, min, (mpfr_ptr) 0);
     215    mpfr_set_ui (zero, 0, MPFR_RNDN);
     216    mpfr_set_ui (min, 0, MPFR_RNDN);
     217    mpfr_nextabove (min);
     218    r[0] = r[2] = r[4] = min; /* RNDN, RNDU, RNDA */
     219    r[1] = r[3] = zero;       /* RNDZ, RNDD */
     220    for (s = 1; s > 0; s = -1)
     221      {
     222        RND_LOOP (i)
     223          {
     224            int j;
     225            int inex;
     226  
     227            j = s < 0 && i > 1 ? 5 - i : i;
     228            inex = mpfr_underflow (x, (mpfr_rnd_t) i, s);
     229            /* for RNDF, inex has no meaning, just check that x is either
     230               min or zero */
     231            if (i == MPFR_RNDF)
     232              {
     233                if (mpfr_cmp (x, min) && mpfr_cmp (x, zero))
     234                  {
     235                    printf ("Error in test_set_underflow, sign = %d,"
     236                            " rnd_mode = %s\n", s, mpfr_print_rnd_mode ((mpfr_rnd_t) i));
     237                    printf ("Got\n");
     238                    mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
     239                    printf ("\ninstead of\n");
     240                    mpfr_out_str (stdout, 2, 0, zero, MPFR_RNDN);
     241                    printf ("\nor\n");
     242                    mpfr_out_str (stdout, 2, 0, min, MPFR_RNDN);
     243                    printf ("\n");
     244                    exit (1);
     245                  }
     246              }
     247            else if (mpfr_cmp (x, r[j]) || inex * t[j] <= 0)
     248              {
     249                printf ("Error in test_set_underflow, sign = %d,"
     250                        " rnd_mode = %s\n", s, mpfr_print_rnd_mode ((mpfr_rnd_t) i));
     251                printf ("Got\n");
     252                mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
     253                printf (", inex = %d\ninstead of\n", inex);
     254                mpfr_out_str (stdout, 2, 0, r[j], MPFR_RNDN);
     255                printf (", inex = %d\n", t[j]);
     256                exit (1);
     257              }
     258          }
     259        mpfr_neg (zero, zero, MPFR_RNDN);
     260        mpfr_neg (min, min, MPFR_RNDN);
     261      }
     262    mpfr_clears (x, zero, min, (mpfr_ptr) 0);
     263  }
     264  
     265  static void
     266  test_set_overflow (void)
     267  {
     268    mpfr_t x, inf, max;
     269    mpfr_ptr r[MPFR_RND_MAX];
     270    int t[MPFR_RND_MAX] = { 1, -1, 1, -1, 1 }; /* RNDN, RNDZ, RNDU, RNDD, RNDA */
     271    int i;
     272    int s;
     273  
     274    mpfr_inits2 (32, x, inf, max, (mpfr_ptr) 0);
     275    mpfr_set_inf (inf, 1);
     276    mpfr_set_inf (max, 1);
     277    mpfr_nextbelow (max);
     278    r[0] = r[2] = r[4] = inf; /* RNDN, RNDU, RNDA */
     279    r[1] = r[3] = max;        /* RNDZ, RNDD */
     280    for (s = 1; s > 0; s = -1)
     281      {
     282        RND_LOOP (i)
     283          {
     284            int j;
     285            int inex;
     286  
     287            j = s < 0 && i > 1 ? 5 - i : i;
     288            inex = mpfr_overflow (x, (mpfr_rnd_t) i, s);
     289            /* for RNDF, inex has no meaning, just check that x is either
     290               max or inf */
     291            if (i == MPFR_RNDF)
     292              {
     293                if (mpfr_cmp (x, max) && mpfr_cmp (x, inf))
     294                  {
     295                    printf ("Error in test_set_overflow, sign = %d,"
     296                            " rnd_mode = %s\n", s, mpfr_print_rnd_mode ((mpfr_rnd_t) i));
     297                    printf ("Got\n");
     298                    mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
     299                    printf ("\ninstead of\n");
     300                    mpfr_out_str (stdout, 2, 0, max, MPFR_RNDN);
     301                    printf ("\nor\n");
     302                    mpfr_out_str (stdout, 2, 0, inf, MPFR_RNDN);
     303                    printf ("\n");
     304                    exit (1);
     305                  }
     306              }
     307            else if (mpfr_cmp (x, r[j]) || inex * t[j] <= 0)
     308              {
     309                printf ("Error in test_set_overflow, sign = %d,"
     310                        " rnd_mode = %s\n", s, mpfr_print_rnd_mode ((mpfr_rnd_t) i));
     311                printf ("Got\n");
     312                mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
     313                printf (", inex = %d\ninstead of\n", inex);
     314                mpfr_out_str (stdout, 2, 0, r[j], MPFR_RNDN);
     315                printf (", inex = %d\n", t[j]);
     316                exit (1);
     317              }
     318          }
     319        mpfr_neg (inf, inf, MPFR_RNDN);
     320        mpfr_neg (max, max, MPFR_RNDN);
     321      }
     322    mpfr_clears (x, inf, max, (mpfr_ptr) 0);
     323  }
     324  
     325  static void
     326  check_set (void)
     327  {
     328    mpfr_clear_flags ();
     329  
     330    mpfr_set_overflow ();
     331    MPFR_ASSERTN ((mpfr_overflow_p) ());
     332    mpfr_set_underflow ();
     333    MPFR_ASSERTN ((mpfr_underflow_p) ());
     334    mpfr_set_divby0 ();
     335    MPFR_ASSERTN ((mpfr_divby0_p) ());
     336    mpfr_set_nanflag ();
     337    MPFR_ASSERTN ((mpfr_nanflag_p) ());
     338    mpfr_set_inexflag ();
     339    MPFR_ASSERTN ((mpfr_inexflag_p) ());
     340    mpfr_set_erangeflag ();
     341    MPFR_ASSERTN ((mpfr_erangeflag_p) ());
     342  
     343    MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_ALL);
     344  
     345    mpfr_clear_overflow ();
     346    MPFR_ASSERTN (! (mpfr_overflow_p) ());
     347    mpfr_clear_underflow ();
     348    MPFR_ASSERTN (! (mpfr_underflow_p) ());
     349    mpfr_clear_divby0 ();
     350    MPFR_ASSERTN (! (mpfr_divby0_p) ());
     351    mpfr_clear_nanflag ();
     352    MPFR_ASSERTN (! (mpfr_nanflag_p) ());
     353    mpfr_clear_inexflag ();
     354    MPFR_ASSERTN (! (mpfr_inexflag_p) ());
     355    mpfr_clear_erangeflag ();
     356    MPFR_ASSERTN (! (mpfr_erangeflag_p) ());
     357  
     358    MPFR_ASSERTN (__gmpfr_flags == 0);
     359  
     360    (mpfr_set_overflow) ();
     361    MPFR_ASSERTN (mpfr_overflow_p ());
     362    (mpfr_set_underflow) ();
     363    MPFR_ASSERTN (mpfr_underflow_p ());
     364    (mpfr_set_divby0) ();
     365    MPFR_ASSERTN (mpfr_divby0_p ());
     366    (mpfr_set_nanflag) ();
     367    MPFR_ASSERTN (mpfr_nanflag_p ());
     368    (mpfr_set_inexflag) ();
     369    MPFR_ASSERTN (mpfr_inexflag_p ());
     370    (mpfr_set_erangeflag) ();
     371    MPFR_ASSERTN (mpfr_erangeflag_p ());
     372  
     373    MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_ALL);
     374  
     375    (mpfr_clear_overflow) ();
     376    MPFR_ASSERTN (! mpfr_overflow_p ());
     377    (mpfr_clear_underflow) ();
     378    MPFR_ASSERTN (! mpfr_underflow_p ());
     379    (mpfr_clear_divby0) ();
     380    MPFR_ASSERTN (! mpfr_divby0_p ());
     381    (mpfr_clear_nanflag) ();
     382    MPFR_ASSERTN (! mpfr_nanflag_p ());
     383    (mpfr_clear_inexflag) ();
     384    MPFR_ASSERTN (! mpfr_inexflag_p ());
     385    (mpfr_clear_erangeflag) ();
     386    MPFR_ASSERTN (! mpfr_erangeflag_p ());
     387  
     388    MPFR_ASSERTN (__gmpfr_flags == 0);
     389  }
     390  
     391  /* Note: this test assumes that mpfr_flags_* can be implemented as both
     392     a function and a macro. Thus in such a case, both implementations are
     393     tested. */
     394  static void
     395  check_groups (void)
     396  {
     397    int i, j;
     398    for (i = 0; i < 200; i++)
     399      {
     400        mpfr_flags_t f1, f2, mask;
     401  
     402        f1 = __gmpfr_flags;
     403        MPFR_ASSERTN (mpfr_flags_save () == f1);
     404        MPFR_ASSERTN ((mpfr_flags_save) () == f1);
     405        MPFR_ASSERTN (__gmpfr_flags == f1);
     406        mask = randlimb () & MPFR_FLAGS_ALL;
     407        if (RAND_BOOL ())
     408          mpfr_flags_set (mask);
     409        else
     410          (mpfr_flags_set) (mask);
     411        for (j = 1; j <= MPFR_FLAGS_ALL; j <<= 1)
     412          if ((__gmpfr_flags & j) != ((mask & j) != 0 ? j : (f1 & j)))
     413            {
     414              printf ("mpfr_flags_set error: old = 0x%lx, group = 0x%lx, "
     415                      "new = 0x%lx, j = 0x%lx\n",
     416                      (unsigned long) f1, (unsigned long) mask,
     417                      (unsigned long) __gmpfr_flags, (unsigned long) j);
     418              exit (1);
     419            }
     420  
     421        f2 = __gmpfr_flags;
     422        mask = randlimb () & MPFR_FLAGS_ALL;
     423        if (RAND_BOOL ())
     424          mpfr_flags_clear (mask);
     425        else
     426          (mpfr_flags_clear) (mask);
     427        for (j = 1; j <= MPFR_FLAGS_ALL; j <<= 1)
     428          if ((__gmpfr_flags & j) != ((mask & j) != 0 ? 0 : (f2 & j)))
     429            {
     430              printf ("mpfr_flags_clear error: old = 0x%lx, group = 0x%lx, "
     431                      "new = 0x%lx, j = 0x%lx\n",
     432                      (unsigned long) f2, (unsigned long) mask,
     433                      (unsigned long) __gmpfr_flags, (unsigned long) j);
     434              exit (1);
     435            }
     436  
     437        mask = randlimb () & MPFR_FLAGS_ALL;
     438        f2 = RAND_BOOL () ? mpfr_flags_test (mask) : (mpfr_flags_test) (mask);
     439        for (j = 1; j <= MPFR_FLAGS_ALL; j <<= 1)
     440          if ((f2 & j) != ((mask & j) != 0 ? (__gmpfr_flags & j) : 0))
     441            {
     442              printf ("mpfr_flags_test error: current = 0x%lx, mask = 0x%lx, "
     443                      "res = 0x%lx, j = 0x%lx\n",
     444                      (unsigned long) __gmpfr_flags, (unsigned long) mask,
     445                      (unsigned long) f2, (unsigned long) j);
     446              exit (1);
     447            }
     448  
     449        f2 = __gmpfr_flags;
     450        if (RAND_BOOL ())
     451          mpfr_flags_restore (f1, mask);
     452        else
     453          (mpfr_flags_restore) (f1, mask);
     454        for (j = 1; j <= MPFR_FLAGS_ALL; j <<= 1)
     455          if ((__gmpfr_flags & j) != (((mask & j) != 0 ? f1 : f2) & j))
     456            {
     457              printf ("mpfr_flags_restore error: old = 0x%lx, flags = 0x%lx, "
     458                      "mask = 0x%lx, new = 0x%lx, j = 0x%lx\n",
     459                      (unsigned long) f2, (unsigned long) f1,
     460                      (unsigned long) mask, (unsigned long) __gmpfr_flags,
     461                      (unsigned long) j);
     462              exit (1);
     463            }
     464      }
     465  }
     466  
     467  int
     468  main (int argc, char *argv[])
     469  {
     470    mpfr_t x, y;
     471    mpfr_exp_t emin, emax;
     472  
     473    tests_start_mpfr ();
     474  
     475    test_set_underflow ();
     476    test_set_overflow ();
     477    check_default_rnd();
     478  
     479    mpfr_init (x);
     480    mpfr_init (y);
     481  
     482    emin = mpfr_get_emin ();
     483    emax = mpfr_get_emax ();
     484    if (emin >= emax)
     485      {
     486        printf ("Error: emin >= emax\n");
     487        exit (1);
     488      }
     489  
     490    mpfr_set_ui (x, 1, MPFR_RNDN);
     491    mpfr_mul_2ui (x, x, 1024, MPFR_RNDN);
     492    mpfr_set_double_range ();
     493    mpfr_check_range (x, 0, MPFR_RNDN);
     494    if (!mpfr_inf_p (x) || (mpfr_sgn(x) <= 0))
     495      {
     496        printf ("Error: 2^1024 rounded to nearest should give +Inf\n");
     497        exit (1);
     498      }
     499  
     500    set_emax (1025);
     501    mpfr_set_ui (x, 1, MPFR_RNDN);
     502    mpfr_mul_2ui (x, x, 1024, MPFR_RNDN);
     503    mpfr_set_double_range ();
     504    mpfr_check_range (x, 0, MPFR_RNDD);
     505    if (!mpfr_number_p (x))
     506      {
     507        printf ("Error: 2^1024 rounded down should give a normal number\n");
     508        exit (1);
     509      }
     510  
     511    mpfr_set_ui (x, 1, MPFR_RNDN);
     512    mpfr_mul_2ui (x, x, 1023, MPFR_RNDN);
     513    mpfr_add (x, x, x, MPFR_RNDN);
     514    if (!mpfr_inf_p (x) || (mpfr_sgn(x) <= 0))
     515      {
     516        printf ("Error: x+x rounded to nearest for x=2^1023 should give +Inf\n");
     517        printf ("emax = %ld\n", (long) mpfr_get_emax ());
     518        printf ("got "); mpfr_dump (x);
     519        exit (1);
     520      }
     521  
     522    mpfr_set_ui (x, 1, MPFR_RNDN);
     523    mpfr_mul_2ui (x, x, 1023, MPFR_RNDN);
     524    mpfr_add (x, x, x, MPFR_RNDD);
     525    if (!mpfr_number_p (x))
     526      {
     527        printf ("Error: x+x rounded down for x=2^1023 should give"
     528                " a normal number\n");
     529        exit (1);
     530      }
     531  
     532    mpfr_set_ui (x, 1, MPFR_RNDN);
     533    mpfr_div_2ui (x, x, 1022, MPFR_RNDN);
     534    mpfr_set_str_binary (y, "1.1e-1022"); /* y = 3/2*x */
     535    mpfr_sub (y, y, x, MPFR_RNDZ);
     536    if (mpfr_cmp_ui (y, 0))
     537      {
     538        printf ("Error: y-x rounded to zero should give 0"
     539                " for y=3/2*2^(-1022), x=2^(-1022)\n");
     540        printf ("Got "); mpfr_dump (y);
     541        exit (1);
     542      }
     543  
     544    set_emin (-1026);
     545    mpfr_set_ui (x, 1, MPFR_RNDN);
     546    mpfr_div_2ui (x, x, 1025, MPFR_RNDN);
     547    mpfr_set_double_range ();
     548    mpfr_check_range (x, 0, MPFR_RNDN);
     549    if (!MPFR_IS_ZERO (x) )
     550      {
     551        printf ("Error: x rounded to nearest for x=2^-1024 should give Zero\n");
     552        printf ("emin = %ld\n", (long) mpfr_get_emin ());
     553        printf ("got "); mpfr_dump (x);
     554        exit (1);
     555      }
     556  
     557    mpfr_clear (x);
     558    mpfr_clear (y);
     559  
     560    set_emin (emin);
     561    set_emax (emax);
     562  
     563    check_emin_emax();
     564    check_flags();
     565    check_get_prec ();
     566    check_powerof2 ();
     567    check_set ();
     568    check_groups ();
     569  
     570    tests_end_mpfr ();
     571    return 0;
     572  }