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