Home | History | Annotate | Line # | Download | only in tests
      1      1.1  mrg /* Generic test file for functions with one or two arguments (the second being
      2  1.1.1.3  mrg    either mpfr_t or double or unsigned long).
      3      1.1  mrg 
      4  1.1.1.6  mrg Copyright 2001-2023 Free Software Foundation, Inc.
      5  1.1.1.3  mrg Contributed by the AriC and Caramba projects, INRIA.
      6      1.1  mrg 
      7      1.1  mrg This file is part of the GNU MPFR Library.
      8      1.1  mrg 
      9      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
     10      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     11      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     12      1.1  mrg option) any later version.
     13      1.1  mrg 
     14      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     15      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     17      1.1  mrg License for more details.
     18      1.1  mrg 
     19      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     20      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     21  1.1.1.5  mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     22      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     23      1.1  mrg 
     24  1.1.1.3  mrg /* Define TWO_ARGS for two-argument functions like mpfr_pow.
     25  1.1.1.3  mrg    Define DOUBLE_ARG1 or DOUBLE_ARG2 for function with a double operand in
     26  1.1.1.3  mrg    first or second place like sub_d or d_sub.
     27  1.1.1.3  mrg    Define ULONG_ARG1 or ULONG_ARG2 for function with an unsigned long
     28  1.1.1.6  mrg    operand in first or second place like sub_ui or ui_sub.
     29  1.1.1.6  mrg    Define THREE_ARGS for three-argument functions like mpfr_atan2u. */
     30  1.1.1.3  mrg 
     31  1.1.1.4  mrg /* TODO: Add support for type long and extreme integer values, as done
     32  1.1.1.4  mrg    in tgeneric_ui.c; then tgeneric_ui.c could probably disappear. */
     33  1.1.1.4  mrg 
     34  1.1.1.6  mrg #ifdef THREE_ARGS
     35  1.1.1.6  mrg /* This is like TWO_ARGS, but with an additional argument. */
     36  1.1.1.6  mrg #define TWO_ARGS
     37  1.1.1.3  mrg #endif
     38  1.1.1.6  mrg 
     39  1.1.1.6  mrg #if defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
     40  1.1.1.6  mrg #define DOUBLE_ARG
     41  1.1.1.6  mrg #else
     42  1.1.1.6  mrg #undef DOUBLE_ARG
     43  1.1.1.4  mrg #endif
     44  1.1.1.4  mrg 
     45  1.1.1.6  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG)
     46  1.1.1.6  mrg #define TWO_ARGS_ALL
     47  1.1.1.6  mrg #define NSPEC 9
     48  1.1.1.6  mrg #else
     49  1.1.1.6  mrg #undef TWO_ARGS_ALL
     50  1.1.1.6  mrg #define NSPEC 5
     51  1.1.1.6  mrg #endif
     52  1.1.1.6  mrg 
     53  1.1.1.6  mrg #if defined(ULONG_ARG1) || defined(ULONG_ARG2) || defined(THREE_ARGS)
     54  1.1.1.6  mrg #define ULONG_ARG
     55  1.1.1.6  mrg #else
     56  1.1.1.6  mrg #undef ULONG_ARG
     57  1.1.1.4  mrg #endif
     58      1.1  mrg 
     59      1.1  mrg #ifndef TEST_RANDOM_POS
     60      1.1  mrg /* For the random function: one number on two is negative. */
     61      1.1  mrg #define TEST_RANDOM_POS 256
     62      1.1  mrg #endif
     63      1.1  mrg 
     64      1.1  mrg #ifndef TEST_RANDOM_POS2
     65      1.1  mrg /* For the random function: one number on two is negative. */
     66      1.1  mrg #define TEST_RANDOM_POS2 256
     67      1.1  mrg #endif
     68      1.1  mrg 
     69      1.1  mrg #ifndef TEST_RANDOM_EMIN
     70      1.1  mrg #define TEST_RANDOM_EMIN -256
     71      1.1  mrg #endif
     72      1.1  mrg 
     73      1.1  mrg #ifndef TEST_RANDOM_EMAX
     74      1.1  mrg #define TEST_RANDOM_EMAX 255
     75      1.1  mrg #endif
     76      1.1  mrg 
     77  1.1.1.3  mrg #ifndef TEST_RANDOM_ALWAYS_SCALE
     78  1.1.1.3  mrg #define TEST_RANDOM_ALWAYS_SCALE 0
     79  1.1.1.3  mrg #endif
     80  1.1.1.3  mrg 
     81  1.1.1.2  mrg /* If the MPFR_SUSPICIOUS_OVERFLOW test fails but this is not a bug,
     82  1.1.1.2  mrg    then define TGENERIC_SO_TEST with an adequate test (possibly 0) to
     83  1.1.1.2  mrg    omit this particular case. */
     84  1.1.1.2  mrg #ifndef TGENERIC_SO_TEST
     85  1.1.1.2  mrg #define TGENERIC_SO_TEST 1
     86  1.1.1.2  mrg #endif
     87  1.1.1.2  mrg 
     88  1.1.1.6  mrg #define TGENERIC_DUMPARGS(X1,X2,U)                                      \
     89      1.1  mrg   do                                                                    \
     90      1.1  mrg     {                                                                   \
     91  1.1.1.6  mrg       printf ("x1 = ");                                                 \
     92  1.1.1.6  mrg       mpfr_dump (X1);                                                   \
     93  1.1.1.6  mrg       if ((X2) != 0)                                                    \
     94      1.1  mrg         {                                                               \
     95  1.1.1.6  mrg           printf ("x2 = ");                                             \
     96  1.1.1.6  mrg           mpfr_dump (X2);                                               \
     97      1.1  mrg         }                                                               \
     98  1.1.1.6  mrg       if ((U) >= 0)                                                     \
     99  1.1.1.6  mrg         printf ("u = %lu\n", (unsigned long) U);                        \
    100  1.1.1.6  mrg     }                                                                   \
    101  1.1.1.6  mrg   while (0)
    102  1.1.1.6  mrg 
    103  1.1.1.6  mrg #define TGENERIC_FAIL(S,X1,X2,U)                                        \
    104  1.1.1.6  mrg   do                                                                    \
    105  1.1.1.6  mrg     {                                                                   \
    106  1.1.1.6  mrg       printf ("tgeneric: %s\n", (S));                                   \
    107  1.1.1.6  mrg       TGENERIC_DUMPARGS (X1, X2, U);                                    \
    108  1.1.1.3  mrg       printf ("yprec = %u, rnd_mode = %s, inexact = %d\nflags =",       \
    109  1.1.1.3  mrg               (unsigned int) yprec, mpfr_print_rnd_mode (rnd),          \
    110  1.1.1.3  mrg               compare);                                                 \
    111  1.1.1.3  mrg       flags_out (flags);                                                \
    112      1.1  mrg       exit (1);                                                         \
    113      1.1  mrg     }                                                                   \
    114      1.1  mrg   while (0)
    115      1.1  mrg 
    116  1.1.1.6  mrg #define TGENERIC_CHECK_AUX(S,EXPR,X2,U)                                 \
    117  1.1.1.6  mrg   do                                                                    \
    118  1.1.1.6  mrg     if (!(EXPR))                                                        \
    119  1.1.1.6  mrg       TGENERIC_FAIL (S " for " MAKE_STR(TEST_FUNCTION), x, X2, U);      \
    120  1.1.1.2  mrg   while (0)
    121  1.1.1.2  mrg 
    122      1.1  mrg #undef TGENERIC_CHECK
    123  1.1.1.6  mrg #if defined(THREE_ARGS)
    124  1.1.1.6  mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, x2, u)
    125  1.1.1.6  mrg #elif defined(TWO_ARGS_ALL)
    126  1.1.1.6  mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, x2, -1)
    127  1.1.1.6  mrg #elif defined(ULONG_ARG)
    128  1.1.1.6  mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, 0, u)
    129      1.1  mrg #else
    130  1.1.1.6  mrg #define TGENERIC_CHECK(S,EXPR) TGENERIC_CHECK_AUX (S, EXPR, 0, -1)
    131      1.1  mrg #endif
    132      1.1  mrg 
    133  1.1.1.4  mrg #ifdef MPFR_DEBUG_TGENERIC
    134  1.1.1.6  mrg #define TGENERIC_IAUX(P,X1,X2,U)                                        \
    135      1.1  mrg   do                                                                    \
    136      1.1  mrg     {                                                                   \
    137  1.1.1.6  mrg       printf ("tgeneric: testing function " MAKE_STR(TEST_FUNCTION)     \
    138  1.1.1.6  mrg               ", %s, target prec = %u\n",                               \
    139  1.1.1.6  mrg               mpfr_print_rnd_mode (rnd), (unsigned int) (P));           \
    140  1.1.1.6  mrg       TGENERIC_DUMPARGS (X1, X2, U);                                    \
    141      1.1  mrg     }                                                                   \
    142      1.1  mrg   while (0)
    143      1.1  mrg #undef TGENERIC_INFO
    144  1.1.1.6  mrg #if defined(THREE_ARGS)
    145  1.1.1.6  mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, x2, u)
    146  1.1.1.6  mrg #elif defined(TWO_ARGS_ALL)
    147  1.1.1.6  mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, x2, -1)
    148  1.1.1.6  mrg #elif defined(ULONG_ARG)
    149  1.1.1.6  mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, 0, u)
    150      1.1  mrg #else
    151  1.1.1.6  mrg #define TGENERIC_INFO(P) TGENERIC_IAUX (P, x, 0, -1)
    152      1.1  mrg #endif
    153  1.1.1.4  mrg #endif  /* MPFR_DEBUG_TGENERIC */
    154      1.1  mrg 
    155      1.1  mrg /* For some functions (for example cos), the argument reduction is too
    156      1.1  mrg    expensive when using mpfr_get_emax(). Then simply define REDUCE_EMAX
    157      1.1  mrg    to some reasonable value before including tgeneric.c. */
    158      1.1  mrg #ifndef REDUCE_EMAX
    159      1.1  mrg #define REDUCE_EMAX mpfr_get_emax ()
    160      1.1  mrg #endif
    161      1.1  mrg 
    162  1.1.1.4  mrg /* same for mpfr_get_emin() */
    163  1.1.1.4  mrg #ifndef REDUCE_EMIN
    164  1.1.1.4  mrg #define REDUCE_EMIN mpfr_get_emin ()
    165  1.1.1.4  mrg #endif
    166  1.1.1.4  mrg 
    167      1.1  mrg static void
    168  1.1.1.2  mrg test_generic (mpfr_prec_t p0, mpfr_prec_t p1, unsigned int nmax)
    169      1.1  mrg {
    170      1.1  mrg   mpfr_prec_t prec, xprec, yprec;
    171  1.1.1.4  mrg   mpfr_t x, y, z, t, w, yd, yu;
    172  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    173  1.1.1.6  mrg   mpfr_t x2;
    174  1.1.1.3  mrg #endif
    175  1.1.1.3  mrg #if defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    176      1.1  mrg   double d;
    177      1.1  mrg #endif
    178  1.1.1.6  mrg #ifdef ULONG_ARG
    179  1.1.1.6  mrg   unsigned long u;
    180  1.1.1.3  mrg #endif
    181      1.1  mrg   mpfr_rnd_t rnd;
    182      1.1  mrg   int inexact, compare, compare2;
    183      1.1  mrg   unsigned int n;
    184      1.1  mrg   unsigned long ctrt = 0, ctrn = 0;
    185      1.1  mrg   mpfr_exp_t old_emin, old_emax;
    186      1.1  mrg 
    187      1.1  mrg   old_emin = mpfr_get_emin ();
    188      1.1  mrg   old_emax = mpfr_get_emax ();
    189      1.1  mrg 
    190  1.1.1.4  mrg   mpfr_inits2 (MPFR_PREC_MIN, x, y, yd, yu, z, t, w, (mpfr_ptr) 0);
    191  1.1.1.6  mrg #if defined(TWO_ARGS_ALL)
    192  1.1.1.6  mrg   mpfr_init2 (x2, MPFR_PREC_MIN);
    193      1.1  mrg #endif
    194      1.1  mrg 
    195  1.1.1.6  mrg   /* generic tests */
    196      1.1  mrg   for (prec = p0; prec <= p1; prec++)
    197      1.1  mrg     {
    198  1.1.1.4  mrg       /* Number of overflow/underflow tests for each precision.
    199  1.1.1.4  mrg          Since MPFR uses several algorithms and there may also be
    200  1.1.1.4  mrg          early overflow/underflow detection, several tests may be
    201  1.1.1.4  mrg          needed to detect a bug. */
    202  1.1.1.4  mrg       int test_of = 3, test_uf = 3;
    203  1.1.1.4  mrg 
    204      1.1  mrg       mpfr_set_prec (z, prec);
    205      1.1  mrg       mpfr_set_prec (t, prec);
    206  1.1.1.6  mrg       yprec = prec + 20;
    207      1.1  mrg       mpfr_set_prec (y, yprec);
    208  1.1.1.4  mrg       mpfr_set_prec (yd, yprec);
    209  1.1.1.4  mrg       mpfr_set_prec (yu, yprec);
    210      1.1  mrg       mpfr_set_prec (w, yprec);
    211      1.1  mrg 
    212  1.1.1.4  mrg       /* Note: in precision p1, we test NSPEC special cases. */
    213  1.1.1.4  mrg       for (n = 0; n < (prec == p1 ? nmax + NSPEC : nmax); n++)
    214      1.1  mrg         {
    215  1.1.1.2  mrg           int infinite_input = 0;
    216  1.1.1.4  mrg           mpfr_flags_t flags;
    217  1.1.1.3  mrg           mpfr_exp_t oemin, oemax;
    218  1.1.1.2  mrg 
    219      1.1  mrg           xprec = prec;
    220  1.1.1.6  mrg           if (RAND_BOOL ())
    221      1.1  mrg             {
    222  1.1.1.3  mrg               /* In half cases, modify the precision of the inputs:
    223  1.1.1.3  mrg                  If the base precision (for the result) is small,
    224  1.1.1.3  mrg                  take a larger input precision in general, else
    225  1.1.1.3  mrg                  take a smaller precision. */
    226  1.1.1.3  mrg               xprec *= (prec < 16 ? 256.0 : 1.0) *
    227  1.1.1.6  mrg                 (double) randlimb () / (double) MPFR_LIMB_MAX;
    228      1.1  mrg               if (xprec < MPFR_PREC_MIN)
    229      1.1  mrg                 xprec = MPFR_PREC_MIN;
    230      1.1  mrg             }
    231      1.1  mrg           mpfr_set_prec (x, xprec);
    232  1.1.1.3  mrg #if defined(TWO_ARGS)
    233  1.1.1.6  mrg           mpfr_set_prec (x2, xprec);
    234  1.1.1.6  mrg #elif defined(DOUBLE_ARG)
    235  1.1.1.6  mrg           mpfr_set_prec (x2, IEEE_DBL_MANT_DIG);
    236      1.1  mrg #endif
    237      1.1  mrg 
    238  1.1.1.6  mrg #ifdef MPFR_DEBUG_TGENERIC
    239  1.1.1.6  mrg           printf ("prec = %u, n = %u, xprec = %u\n",
    240  1.1.1.6  mrg                   (unsigned int) prec, n, (unsigned int) xprec);
    241  1.1.1.6  mrg #endif
    242  1.1.1.6  mrg 
    243  1.1.1.6  mrg           /* Generate random arguments, even in the special cases
    244  1.1.1.6  mrg              (this may not be needed, but this is simpler).
    245  1.1.1.6  mrg              Note that if RAND_FUNCTION is defined, this specific
    246  1.1.1.6  mrg              random function is used for all arguments; this is
    247  1.1.1.6  mrg              typically mpfr_random2, which generates a positive
    248  1.1.1.6  mrg              random mpfr_t with long runs of consecutive ones and
    249  1.1.1.6  mrg              zeros in the binary representation. */
    250  1.1.1.6  mrg 
    251      1.1  mrg #if defined(RAND_FUNCTION)
    252  1.1.1.6  mrg           RAND_FUNCTION (x);
    253  1.1.1.6  mrg #if defined(TWO_ARGS_ALL)
    254  1.1.1.6  mrg           RAND_FUNCTION (x2);
    255      1.1  mrg #endif
    256  1.1.1.3  mrg #else  /* ! defined(RAND_FUNCTION) */
    257  1.1.1.6  mrg           tests_default_random (x, TEST_RANDOM_POS,
    258  1.1.1.6  mrg                                 TEST_RANDOM_EMIN, TEST_RANDOM_EMAX,
    259  1.1.1.6  mrg                                 TEST_RANDOM_ALWAYS_SCALE);
    260  1.1.1.6  mrg #if defined(TWO_ARGS_ALL)
    261  1.1.1.6  mrg           tests_default_random (x2, TEST_RANDOM_POS2,
    262  1.1.1.6  mrg                                 TEST_RANDOM_EMIN, TEST_RANDOM_EMAX,
    263  1.1.1.6  mrg                                 TEST_RANDOM_ALWAYS_SCALE);
    264      1.1  mrg #endif
    265  1.1.1.3  mrg #endif  /* ! defined(RAND_FUNCTION) */
    266  1.1.1.6  mrg 
    267  1.1.1.6  mrg #if defined(ULONG_ARG)
    268  1.1.1.6  mrg           /* FIXME: If MPFR_LIMB_MAX < ULONG_MAX, large values will
    269  1.1.1.6  mrg              never be tested. */
    270  1.1.1.6  mrg           u = randlimb ();
    271  1.1.1.6  mrg #endif
    272  1.1.1.6  mrg 
    273  1.1.1.6  mrg           if (n < NSPEC && prec == p1)
    274      1.1  mrg             {
    275  1.1.1.4  mrg               /* Special cases tested in precision p1 if n < NSPEC. They are
    276      1.1  mrg                  useful really in the extended exponent range. */
    277  1.1.1.6  mrg               /* TODO: x2 is set even when it is associated with a double;
    278  1.1.1.6  mrg                  check whether this really makes sense. */
    279  1.1.1.6  mrg #if defined(DOUBLE_ARG) && defined(MPFR_ERRDIVZERO)
    280  1.1.1.2  mrg               goto next_n;
    281  1.1.1.2  mrg #endif
    282      1.1  mrg               set_emin (MPFR_EMIN_MIN);
    283      1.1  mrg               set_emax (MPFR_EMAX_MAX);
    284  1.1.1.4  mrg               if (n == 0)
    285      1.1  mrg                 {
    286  1.1.1.4  mrg                   mpfr_set_nan (x);
    287  1.1.1.4  mrg                 }
    288  1.1.1.4  mrg               else if (n <= 2)
    289  1.1.1.4  mrg                 {
    290  1.1.1.4  mrg                   MPFR_ASSERTN (n == 1 || n == 2);
    291  1.1.1.4  mrg                   mpfr_set_si (x, n == 1 ? 1 : -1, MPFR_RNDN);
    292  1.1.1.4  mrg                   mpfr_set_exp (x, REDUCE_EMIN);
    293  1.1.1.6  mrg #if defined(TWO_ARGS_ALL)
    294  1.1.1.6  mrg                   mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
    295  1.1.1.6  mrg                   mpfr_set_exp (x2, REDUCE_EMIN);
    296      1.1  mrg #endif
    297      1.1  mrg                 }
    298  1.1.1.4  mrg               else if (n <= 4)
    299      1.1  mrg                 {
    300  1.1.1.4  mrg                   MPFR_ASSERTN (n == 3 || n == 4);
    301  1.1.1.4  mrg                   mpfr_set_si (x, n == 3 ? 1 : -1, MPFR_RNDN);
    302      1.1  mrg                   mpfr_setmax (x, REDUCE_EMAX);
    303  1.1.1.6  mrg #if defined(TWO_ARGS_ALL)
    304  1.1.1.6  mrg                   mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
    305  1.1.1.6  mrg                   mpfr_setmax (x2, REDUCE_EMAX);
    306  1.1.1.4  mrg #endif
    307  1.1.1.4  mrg                 }
    308  1.1.1.6  mrg #if defined(TWO_ARGS_ALL)
    309  1.1.1.4  mrg               else if (n <= 6)
    310  1.1.1.4  mrg                 {
    311  1.1.1.4  mrg                   MPFR_ASSERTN (n == 5 || n == 6);
    312  1.1.1.4  mrg                   mpfr_set_si (x, n == 5 ? 1 : -1, MPFR_RNDN);
    313  1.1.1.4  mrg                   mpfr_set_exp (x, REDUCE_EMIN);
    314  1.1.1.6  mrg                   mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
    315  1.1.1.6  mrg                   mpfr_setmax (x2, REDUCE_EMAX);
    316      1.1  mrg                 }
    317  1.1.1.4  mrg               else
    318  1.1.1.4  mrg                 {
    319  1.1.1.4  mrg                   MPFR_ASSERTN (n == 7 || n == 8);
    320  1.1.1.4  mrg                   mpfr_set_si (x, n == 7 ? 1 : -1, MPFR_RNDN);
    321  1.1.1.4  mrg                   mpfr_setmax (x, REDUCE_EMAX);
    322  1.1.1.6  mrg                   mpfr_set_si (x2, RAND_BOOL () ? -1 : 1, MPFR_RNDN);
    323  1.1.1.6  mrg                   mpfr_set_exp (x2, REDUCE_EMIN);
    324  1.1.1.4  mrg                 }
    325  1.1.1.4  mrg #endif  /* two arguments */
    326      1.1  mrg             }
    327      1.1  mrg 
    328  1.1.1.3  mrg           /* Exponent range for the test. */
    329  1.1.1.3  mrg           oemin = mpfr_get_emin ();
    330  1.1.1.3  mrg           oemax = mpfr_get_emax ();
    331  1.1.1.3  mrg 
    332      1.1  mrg           rnd = RND_RAND ();
    333      1.1  mrg           mpfr_clear_flags ();
    334  1.1.1.4  mrg #ifdef MPFR_DEBUG_TGENERIC
    335  1.1.1.6  mrg           TGENERIC_INFO (MPFR_PREC (y));
    336      1.1  mrg #endif
    337  1.1.1.6  mrg #if defined(THREE_ARGS)
    338  1.1.1.6  mrg           compare = TEST_FUNCTION (y, x, x2, u, rnd);
    339  1.1.1.6  mrg #elif defined(TWO_ARGS)
    340  1.1.1.6  mrg           compare = TEST_FUNCTION (y, x, x2, rnd);
    341  1.1.1.6  mrg #elif defined(DOUBLE_ARG)
    342  1.1.1.6  mrg           d = mpfr_get_d (x2, rnd);
    343  1.1.1.6  mrg # if defined(DOUBLE_ARG1)
    344      1.1  mrg           compare = TEST_FUNCTION (y, d, x, rnd);
    345  1.1.1.6  mrg # elif defined(DOUBLE_ARG2)
    346      1.1  mrg           compare = TEST_FUNCTION (y, x, d, rnd);
    347  1.1.1.6  mrg # else
    348  1.1.1.6  mrg #  error "cannot occur"
    349  1.1.1.6  mrg # endif
    350  1.1.1.2  mrg           /* d can be infinite due to overflow in mpfr_get_d */
    351  1.1.1.2  mrg           infinite_input |= DOUBLE_ISINF (d);
    352  1.1.1.4  mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
    353  1.1.1.6  mrg           compare = TEST_FUNCTION (y, u, rnd);
    354  1.1.1.3  mrg #elif defined(ULONG_ARG1)
    355  1.1.1.6  mrg           compare = TEST_FUNCTION (y, u, x, rnd);
    356  1.1.1.3  mrg #elif defined(ULONG_ARG2)
    357  1.1.1.6  mrg           compare = TEST_FUNCTION (y, x, u, rnd);
    358      1.1  mrg #else
    359      1.1  mrg           compare = TEST_FUNCTION (y, x, rnd);
    360      1.1  mrg #endif
    361  1.1.1.3  mrg           flags = __gmpfr_flags;
    362  1.1.1.3  mrg           if (mpfr_get_emin () != oemin ||
    363  1.1.1.3  mrg               mpfr_get_emax () != oemax)
    364  1.1.1.3  mrg             {
    365  1.1.1.3  mrg               printf ("tgeneric: the exponent range has been modified"
    366  1.1.1.3  mrg                       " by the tested function!\n");
    367  1.1.1.3  mrg               exit (1);
    368  1.1.1.3  mrg             }
    369  1.1.1.4  mrg           if (rnd != MPFR_RNDF)
    370  1.1.1.4  mrg             TGENERIC_CHECK ("bad inexact flag",
    371  1.1.1.4  mrg                             (compare != 0) ^ (mpfr_inexflag_p () == 0));
    372      1.1  mrg           ctrt++;
    373      1.1  mrg 
    374  1.1.1.4  mrg           /* If rnd = RNDF, check that we obtain the same result as
    375  1.1.1.4  mrg              RNDD or RNDU. */
    376  1.1.1.4  mrg           if (rnd == MPFR_RNDF)
    377  1.1.1.4  mrg             {
    378  1.1.1.6  mrg #if defined(THREE_ARGS)
    379  1.1.1.6  mrg               TEST_FUNCTION (yd, x, x2, u, MPFR_RNDD);
    380  1.1.1.6  mrg               TEST_FUNCTION (yu, x, x2, u, MPFR_RNDU);
    381  1.1.1.6  mrg #elif defined(TWO_ARGS)
    382  1.1.1.6  mrg               TEST_FUNCTION (yd, x, x2, MPFR_RNDD);
    383  1.1.1.6  mrg               TEST_FUNCTION (yu, x, x2, MPFR_RNDU);
    384  1.1.1.4  mrg #elif defined(DOUBLE_ARG1)
    385  1.1.1.6  mrg               d = mpfr_get_d (x2, MPFR_RNDD);
    386  1.1.1.4  mrg               TEST_FUNCTION (yd, d, x, MPFR_RNDD);
    387  1.1.1.6  mrg               d = mpfr_get_d (x2, MPFR_RNDU);
    388  1.1.1.4  mrg               TEST_FUNCTION (yu, d, x, MPFR_RNDU);
    389  1.1.1.4  mrg #elif defined(DOUBLE_ARG2)
    390  1.1.1.6  mrg               d = mpfr_get_d (x2, MPFR_RNDD);
    391  1.1.1.4  mrg               TEST_FUNCTION (yd, x, d, MPFR_RNDD);
    392  1.1.1.6  mrg               d = mpfr_get_d (x2, MPFR_RNDU);
    393  1.1.1.4  mrg               TEST_FUNCTION (yu, x, d, MPFR_RNDU);
    394  1.1.1.4  mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
    395  1.1.1.6  mrg               TEST_FUNCTION (yd, u, MPFR_RNDD);
    396  1.1.1.6  mrg               TEST_FUNCTION (yu, u, MPFR_RNDU);
    397  1.1.1.4  mrg #elif defined(ULONG_ARG1)
    398  1.1.1.6  mrg               TEST_FUNCTION (yd, u, x, MPFR_RNDD);
    399  1.1.1.6  mrg               TEST_FUNCTION (yu, u, x, MPFR_RNDU);
    400  1.1.1.4  mrg #elif defined(ULONG_ARG2)
    401  1.1.1.6  mrg               TEST_FUNCTION (yd, x, u, MPFR_RNDD);
    402  1.1.1.6  mrg               TEST_FUNCTION (yu, x, u, MPFR_RNDU);
    403  1.1.1.4  mrg #else
    404  1.1.1.4  mrg               TEST_FUNCTION (yd, x, MPFR_RNDD);
    405  1.1.1.4  mrg               TEST_FUNCTION (yu, x, MPFR_RNDU);
    406  1.1.1.4  mrg #endif
    407  1.1.1.4  mrg               if (! (SAME_VAL (y, yd) || SAME_VAL (y, yu)))
    408  1.1.1.4  mrg                 {
    409  1.1.1.6  mrg                   printf ("tgeneric: error for" MAKE_STR(TEST_FUNCTION)
    410  1.1.1.6  mrg                           ", RNDF; result matches neither RNDD nor RNDU\n");
    411  1.1.1.6  mrg                   printf ("x1 = "); mpfr_dump (x);
    412  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    413  1.1.1.6  mrg                   printf ("x2 = "); mpfr_dump (x2);
    414  1.1.1.6  mrg #endif
    415  1.1.1.6  mrg #ifdef ULONG_ARG
    416  1.1.1.6  mrg                   printf ("u = %lu\n", u);
    417  1.1.1.6  mrg #endif
    418  1.1.1.6  mrg                   printf ("yd (RNDD) = "); mpfr_dump (yd);
    419  1.1.1.6  mrg                   printf ("yu (RNDU) = "); mpfr_dump (yu);
    420  1.1.1.6  mrg                   printf ("y  (RNDF) = "); mpfr_dump (y);
    421  1.1.1.6  mrg                   exit (1);
    422  1.1.1.4  mrg                 }
    423  1.1.1.4  mrg             }
    424  1.1.1.4  mrg 
    425  1.1.1.3  mrg           /* Tests in a reduced exponent range. */
    426  1.1.1.3  mrg           {
    427  1.1.1.4  mrg             mpfr_flags_t oldflags = flags;
    428  1.1.1.3  mrg             mpfr_exp_t e, emin, emax;
    429  1.1.1.3  mrg 
    430  1.1.1.3  mrg             /* Determine the smallest exponent range containing the
    431  1.1.1.3  mrg                exponents of the mpfr_t inputs (x, and u if TWO_ARGS)
    432  1.1.1.3  mrg                and output (y). */
    433  1.1.1.3  mrg             emin = MPFR_EMAX_MAX;
    434  1.1.1.3  mrg             emax = MPFR_EMIN_MIN;
    435  1.1.1.3  mrg             if (MPFR_IS_PURE_FP (x))
    436  1.1.1.3  mrg               {
    437  1.1.1.3  mrg                 e = MPFR_GET_EXP (x);
    438  1.1.1.3  mrg                 if (e < emin)
    439  1.1.1.3  mrg                   emin = e;
    440  1.1.1.3  mrg                 if (e > emax)
    441  1.1.1.3  mrg                   emax = e;
    442  1.1.1.3  mrg               }
    443      1.1  mrg #if defined(TWO_ARGS)
    444  1.1.1.6  mrg             if (MPFR_IS_PURE_FP (x2))
    445  1.1.1.3  mrg               {
    446  1.1.1.6  mrg                 e = MPFR_GET_EXP (x2);
    447  1.1.1.3  mrg                 if (e < emin)
    448  1.1.1.3  mrg                   emin = e;
    449  1.1.1.3  mrg                 if (e > emax)
    450  1.1.1.3  mrg                   emax = e;
    451  1.1.1.3  mrg               }
    452  1.1.1.3  mrg #endif
    453  1.1.1.3  mrg             if (MPFR_IS_PURE_FP (y))
    454  1.1.1.3  mrg               {
    455  1.1.1.4  mrg                 e = MPFR_GET_EXP (y);  /* exponent of the result */
    456  1.1.1.4  mrg 
    457  1.1.1.4  mrg                 if (test_of > 0 && e - 1 >= emax)  /* overflow test */
    458  1.1.1.3  mrg                   {
    459  1.1.1.4  mrg                     mpfr_flags_t ex_flags;
    460  1.1.1.3  mrg 
    461  1.1.1.4  mrg                     /* Exponent e of the result > exponents of the inputs;
    462  1.1.1.4  mrg                        let's set emax to e - 1, so that one should get an
    463  1.1.1.4  mrg                        overflow. */
    464  1.1.1.6  mrg                     set_emax (e - 1);
    465  1.1.1.4  mrg #ifdef MPFR_DEBUG_TGENERIC
    466  1.1.1.4  mrg                     printf ("tgeneric: overflow test (emax = %"
    467  1.1.1.4  mrg                             MPFR_EXP_FSPEC "d)\n",
    468  1.1.1.4  mrg                             (mpfr_eexp_t) __gmpfr_emax);
    469  1.1.1.4  mrg #endif
    470  1.1.1.3  mrg                     mpfr_clear_flags ();
    471  1.1.1.6  mrg #if defined(THREE_ARGS)
    472  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, x, x2, u, rnd);
    473  1.1.1.6  mrg #elif defined(TWO_ARGS)
    474  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, x, x2, rnd);
    475  1.1.1.3  mrg #elif defined(DOUBLE_ARG1)
    476  1.1.1.3  mrg                     inexact = TEST_FUNCTION (w, d, x, rnd);
    477  1.1.1.3  mrg #elif defined(DOUBLE_ARG2)
    478  1.1.1.3  mrg                     inexact = TEST_FUNCTION (w, x, d, rnd);
    479  1.1.1.4  mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
    480  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, u, rnd);
    481  1.1.1.3  mrg #elif defined(ULONG_ARG1)
    482  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, u, x, rnd);
    483  1.1.1.3  mrg #elif defined(ULONG_ARG2)
    484  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, x, u, rnd);
    485  1.1.1.3  mrg #else
    486  1.1.1.3  mrg                     inexact = TEST_FUNCTION (w, x, rnd);
    487  1.1.1.3  mrg #endif
    488  1.1.1.3  mrg                     flags = __gmpfr_flags;
    489  1.1.1.6  mrg                     set_emax (oemax);
    490  1.1.1.3  mrg                     ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT;
    491  1.1.1.4  mrg                     /* For RNDF, this test makes no sense, since RNDF
    492  1.1.1.4  mrg                        might return either the maximal floating-point
    493  1.1.1.4  mrg                        value or infinity, and the flags might differ in
    494  1.1.1.4  mrg                        those two cases. */
    495  1.1.1.4  mrg                     if (flags != ex_flags && rnd != MPFR_RNDF)
    496  1.1.1.3  mrg                       {
    497  1.1.1.3  mrg                         printf ("tgeneric: error for " MAKE_STR(TEST_FUNCTION)
    498  1.1.1.3  mrg                                 ", reduced exponent range [%"
    499  1.1.1.3  mrg                                 MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC
    500  1.1.1.3  mrg                                 "d] (overflow test) on:\n",
    501  1.1.1.3  mrg                                 (mpfr_eexp_t) oemin, (mpfr_eexp_t) e - 1);
    502  1.1.1.6  mrg                         printf ("x1 = "); mpfr_dump (x);
    503  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    504  1.1.1.6  mrg                         printf ("x2 = "); mpfr_dump (x2);
    505  1.1.1.6  mrg #endif
    506  1.1.1.6  mrg #ifdef ULONG_ARG
    507  1.1.1.6  mrg                         printf ("u = %lu\n", u);
    508  1.1.1.3  mrg #endif
    509  1.1.1.3  mrg                         printf ("yprec = %u, rnd_mode = %s\n",
    510  1.1.1.3  mrg                                 (unsigned int) yprec,
    511  1.1.1.3  mrg                                 mpfr_print_rnd_mode (rnd));
    512  1.1.1.3  mrg                         printf ("Expected flags =");
    513  1.1.1.3  mrg                         flags_out (ex_flags);
    514  1.1.1.3  mrg                         printf ("     got flags =");
    515  1.1.1.3  mrg                         flags_out (flags);
    516  1.1.1.3  mrg                         printf ("inex = %d, w = ", inexact);
    517  1.1.1.3  mrg                         mpfr_dump (w);
    518  1.1.1.3  mrg                         exit (1);
    519  1.1.1.3  mrg                       }
    520  1.1.1.4  mrg                     test_of--;
    521  1.1.1.3  mrg                   }
    522  1.1.1.4  mrg 
    523  1.1.1.4  mrg                 if (test_uf > 0 && e + 1 <= emin)  /* underflow test */
    524  1.1.1.3  mrg                   {
    525  1.1.1.4  mrg                     mpfr_flags_t ex_flags;
    526  1.1.1.3  mrg 
    527  1.1.1.4  mrg                     /* Exponent e of the result < exponents of the inputs;
    528  1.1.1.4  mrg                        let's set emin to e + 1, so that one should get an
    529  1.1.1.4  mrg                        underflow. */
    530  1.1.1.6  mrg                     set_emin (e + 1);
    531  1.1.1.4  mrg #ifdef MPFR_DEBUG_TGENERIC
    532  1.1.1.4  mrg                     printf ("tgeneric: underflow test (emin = %"
    533  1.1.1.4  mrg                             MPFR_EXP_FSPEC "d)\n",
    534  1.1.1.4  mrg                             (mpfr_eexp_t) __gmpfr_emin);
    535  1.1.1.4  mrg #endif
    536  1.1.1.3  mrg                     mpfr_clear_flags ();
    537  1.1.1.6  mrg #if defined(THREE_ARGS)
    538  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, x, x2, u, rnd);
    539  1.1.1.6  mrg #elif defined(TWO_ARGS)
    540  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, x, x2, rnd);
    541  1.1.1.3  mrg #elif defined(DOUBLE_ARG1)
    542  1.1.1.3  mrg                     inexact = TEST_FUNCTION (w, d, x, rnd);
    543  1.1.1.3  mrg #elif defined(DOUBLE_ARG2)
    544  1.1.1.3  mrg                     inexact = TEST_FUNCTION (w, x, d, rnd);
    545  1.1.1.4  mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
    546  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, u, rnd);
    547  1.1.1.3  mrg #elif defined(ULONG_ARG1)
    548  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, u, x, rnd);
    549  1.1.1.3  mrg #elif defined(ULONG_ARG2)
    550  1.1.1.6  mrg                     inexact = TEST_FUNCTION (w, x, u, rnd);
    551  1.1.1.3  mrg #else
    552  1.1.1.3  mrg                     inexact = TEST_FUNCTION (w, x, rnd);
    553      1.1  mrg #endif
    554  1.1.1.3  mrg                     flags = __gmpfr_flags;
    555  1.1.1.6  mrg                     set_emin (oemin);
    556  1.1.1.3  mrg                     ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT;
    557  1.1.1.4  mrg                     /* For RNDF, this test makes no sense, since RNDF
    558  1.1.1.4  mrg                        might return either the maximal floating-point
    559  1.1.1.4  mrg                        value or infinity, and the flags might differ in
    560  1.1.1.4  mrg                        those two cases. */
    561  1.1.1.4  mrg                     if (flags != ex_flags && rnd != MPFR_RNDF)
    562  1.1.1.3  mrg                       {
    563  1.1.1.3  mrg                         printf ("tgeneric: error for " MAKE_STR(TEST_FUNCTION)
    564  1.1.1.3  mrg                                 ", reduced exponent range [%"
    565  1.1.1.3  mrg                                 MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC
    566  1.1.1.3  mrg                                 "d] (underflow test) on:\n",
    567  1.1.1.3  mrg                                 (mpfr_eexp_t) e + 1, (mpfr_eexp_t) oemax);
    568  1.1.1.6  mrg                         printf ("x1 = "); mpfr_dump (x);
    569  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    570  1.1.1.6  mrg                         printf ("x2 = "); mpfr_dump (x2);
    571  1.1.1.6  mrg #endif
    572  1.1.1.6  mrg #ifdef ULONG_ARG
    573  1.1.1.6  mrg                         printf ("u = %lu\n", u);
    574  1.1.1.3  mrg #endif
    575  1.1.1.3  mrg                         printf ("yprec = %u, rnd_mode = %s\n",
    576  1.1.1.3  mrg                                 (unsigned int) yprec,
    577  1.1.1.3  mrg                                 mpfr_print_rnd_mode (rnd));
    578  1.1.1.3  mrg                         printf ("Expected flags =");
    579  1.1.1.3  mrg                         flags_out (ex_flags);
    580  1.1.1.3  mrg                         printf ("     got flags =");
    581  1.1.1.3  mrg                         flags_out (flags);
    582  1.1.1.3  mrg                         printf ("inex = %d, w = ", inexact);
    583  1.1.1.3  mrg                         mpfr_dump (w);
    584  1.1.1.3  mrg                         exit (1);
    585  1.1.1.3  mrg                       }
    586  1.1.1.4  mrg                     test_uf--;
    587  1.1.1.3  mrg                   }
    588  1.1.1.4  mrg 
    589  1.1.1.3  mrg                 if (e < emin)
    590  1.1.1.3  mrg                   emin = e;
    591  1.1.1.3  mrg                 if (e > emax)
    592  1.1.1.3  mrg                   emax = e;
    593  1.1.1.4  mrg               }  /* MPFR_IS_PURE_FP (y) */
    594  1.1.1.4  mrg 
    595  1.1.1.3  mrg             if (emin > emax)
    596  1.1.1.3  mrg               emin = emax;  /* case where all values are singular */
    597  1.1.1.4  mrg 
    598  1.1.1.3  mrg             /* Consistency test in a reduced exponent range. Doing it
    599  1.1.1.3  mrg                for the first 10 samples and for prec == p1 (which has
    600  1.1.1.3  mrg                some special cases) should be sufficient. */
    601  1.1.1.3  mrg             if (ctrt <= 10 || prec == p1)
    602  1.1.1.3  mrg               {
    603  1.1.1.6  mrg                 set_emin (emin);
    604  1.1.1.6  mrg                 set_emax (emax);
    605  1.1.1.4  mrg #ifdef MPFR_DEBUG_TGENERIC
    606  1.1.1.3  mrg                 /* Useful information in case of assertion failure. */
    607  1.1.1.3  mrg                 printf ("tgeneric: reduced exponent range [%"
    608  1.1.1.3  mrg                         MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC "d]\n",
    609  1.1.1.3  mrg                         (mpfr_eexp_t) emin, (mpfr_eexp_t) emax);
    610  1.1.1.2  mrg #endif
    611  1.1.1.3  mrg                 mpfr_clear_flags ();
    612  1.1.1.6  mrg #if defined(THREE_ARGS)
    613  1.1.1.6  mrg                 inexact = TEST_FUNCTION (w, x, x2, u, rnd);
    614  1.1.1.6  mrg #elif defined(TWO_ARGS)
    615  1.1.1.6  mrg                 inexact = TEST_FUNCTION (w, x, x2, rnd);
    616      1.1  mrg #elif defined(DOUBLE_ARG1)
    617  1.1.1.3  mrg                 inexact = TEST_FUNCTION (w, d, x, rnd);
    618      1.1  mrg #elif defined(DOUBLE_ARG2)
    619  1.1.1.3  mrg                 inexact = TEST_FUNCTION (w, x, d, rnd);
    620  1.1.1.4  mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
    621  1.1.1.6  mrg                 inexact = TEST_FUNCTION (w, u, rnd);
    622  1.1.1.3  mrg #elif defined(ULONG_ARG1)
    623  1.1.1.6  mrg                 inexact = TEST_FUNCTION (w, u, x, rnd);
    624  1.1.1.3  mrg #elif defined(ULONG_ARG2)
    625  1.1.1.6  mrg                 inexact = TEST_FUNCTION (w, x, u, rnd);
    626      1.1  mrg #else
    627  1.1.1.3  mrg                 inexact = TEST_FUNCTION (w, x, rnd);
    628      1.1  mrg #endif
    629  1.1.1.3  mrg                 flags = __gmpfr_flags;
    630  1.1.1.6  mrg                 set_emin (oemin);
    631  1.1.1.6  mrg                 set_emax (oemax);
    632  1.1.1.4  mrg                 /* That test makes no sense for RNDF. */
    633  1.1.1.4  mrg                 if (rnd != MPFR_RNDF && ! (SAME_VAL (w, y) &&
    634  1.1.1.3  mrg                        SAME_SIGN (inexact, compare) &&
    635  1.1.1.3  mrg                        flags == oldflags))
    636  1.1.1.3  mrg                   {
    637  1.1.1.3  mrg                     printf ("tgeneric: error for " MAKE_STR(TEST_FUNCTION)
    638  1.1.1.3  mrg                             ", reduced exponent range [%"
    639  1.1.1.3  mrg                             MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC "d] on:\n",
    640  1.1.1.3  mrg                             (mpfr_eexp_t) emin, (mpfr_eexp_t) emax);
    641  1.1.1.6  mrg                     printf ("x1 = "); mpfr_dump (x);
    642  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    643  1.1.1.6  mrg                     printf ("x2 = "); mpfr_dump (x2);
    644  1.1.1.6  mrg #endif
    645  1.1.1.6  mrg #ifdef ULONG_ARG
    646  1.1.1.6  mrg                     printf ("u = %lu\n", u);
    647  1.1.1.3  mrg #endif
    648  1.1.1.3  mrg                     printf ("yprec = %u, rnd_mode = %s\n",
    649  1.1.1.3  mrg                             (unsigned int) yprec, mpfr_print_rnd_mode (rnd));
    650  1.1.1.3  mrg                     printf ("Expected:\n  y = ");
    651  1.1.1.3  mrg                     mpfr_dump (y);
    652  1.1.1.3  mrg                     printf ("  inex = %d, flags =", compare);
    653  1.1.1.3  mrg                     flags_out (oldflags);
    654  1.1.1.3  mrg                     printf ("Got:\n  w = ");
    655  1.1.1.3  mrg                     mpfr_dump (w);
    656  1.1.1.3  mrg                     printf ("  inex = %d, flags =", inexact);
    657  1.1.1.3  mrg                     flags_out (flags);
    658  1.1.1.3  mrg                     exit (1);
    659  1.1.1.3  mrg                   }
    660  1.1.1.3  mrg               }
    661  1.1.1.4  mrg 
    662  1.1.1.3  mrg             __gmpfr_flags = oldflags;  /* restore the flags */
    663  1.1.1.4  mrg           }  /* tests in a reduced exponent range */
    664  1.1.1.3  mrg 
    665      1.1  mrg           if (MPFR_IS_SINGULAR (y))
    666      1.1  mrg             {
    667      1.1  mrg               if (MPFR_IS_NAN (y) || mpfr_nanflag_p ())
    668  1.1.1.3  mrg                 TGENERIC_CHECK ("bad NaN flag",
    669      1.1  mrg                                 MPFR_IS_NAN (y) && mpfr_nanflag_p ());
    670      1.1  mrg               else if (MPFR_IS_INF (y))
    671  1.1.1.2  mrg                 {
    672  1.1.1.3  mrg                   TGENERIC_CHECK ("bad overflow flag",
    673  1.1.1.2  mrg                                   (compare != 0) ^ (mpfr_overflow_p () == 0));
    674  1.1.1.3  mrg                   TGENERIC_CHECK ("bad divide-by-zero flag",
    675  1.1.1.2  mrg                                   (compare == 0 && !infinite_input) ^
    676  1.1.1.2  mrg                                   (mpfr_divby0_p () == 0));
    677  1.1.1.2  mrg                 }
    678      1.1  mrg               else if (MPFR_IS_ZERO (y))
    679  1.1.1.3  mrg                 TGENERIC_CHECK ("bad underflow flag",
    680      1.1  mrg                                 (compare != 0) ^ (mpfr_underflow_p () == 0));
    681      1.1  mrg             }
    682  1.1.1.2  mrg           else if (mpfr_divby0_p ())
    683  1.1.1.2  mrg             {
    684  1.1.1.3  mrg               TGENERIC_CHECK ("both overflow and divide-by-zero",
    685  1.1.1.2  mrg                               ! mpfr_overflow_p ());
    686  1.1.1.3  mrg               TGENERIC_CHECK ("both underflow and divide-by-zero",
    687  1.1.1.2  mrg                               ! mpfr_underflow_p ());
    688  1.1.1.3  mrg               TGENERIC_CHECK ("bad compare value (divide-by-zero)",
    689  1.1.1.2  mrg                               compare == 0);
    690  1.1.1.2  mrg             }
    691      1.1  mrg           else if (mpfr_overflow_p ())
    692      1.1  mrg             {
    693  1.1.1.3  mrg               TGENERIC_CHECK ("both underflow and overflow",
    694  1.1.1.2  mrg                               ! mpfr_underflow_p ());
    695  1.1.1.3  mrg               TGENERIC_CHECK ("bad compare value (overflow)", compare != 0);
    696      1.1  mrg               mpfr_nexttoinf (y);
    697  1.1.1.3  mrg               TGENERIC_CHECK ("should have been max MPFR number (overflow)",
    698      1.1  mrg                               MPFR_IS_INF (y));
    699      1.1  mrg             }
    700      1.1  mrg           else if (mpfr_underflow_p ())
    701      1.1  mrg             {
    702  1.1.1.3  mrg               TGENERIC_CHECK ("bad compare value (underflow)", compare != 0);
    703      1.1  mrg               mpfr_nexttozero (y);
    704  1.1.1.3  mrg               TGENERIC_CHECK ("should have been min MPFR number (underflow)",
    705      1.1  mrg                               MPFR_IS_ZERO (y));
    706      1.1  mrg             }
    707  1.1.1.4  mrg           else if (compare == 0 || rnd == MPFR_RNDF ||
    708  1.1.1.4  mrg                    mpfr_can_round (y, yprec, rnd, rnd, prec))
    709      1.1  mrg             {
    710      1.1  mrg               ctrn++;
    711      1.1  mrg               mpfr_set (t, y, rnd);
    712      1.1  mrg               /* Risk of failures are known when some flags are already set
    713      1.1  mrg                  before the function call. Do not set the erange flag, as
    714      1.1  mrg                  it will remain set after the function call and no checks
    715      1.1  mrg                  are performed in such a case (see the mpfr_erangeflag_p
    716      1.1  mrg                  test below). */
    717  1.1.1.6  mrg               if (RAND_BOOL ())
    718      1.1  mrg                 __gmpfr_flags = MPFR_FLAGS_ALL ^ MPFR_FLAGS_ERANGE;
    719  1.1.1.4  mrg #ifdef MPFR_DEBUG_TGENERIC
    720  1.1.1.6  mrg               TGENERIC_INFO (MPFR_PREC (z));
    721      1.1  mrg #endif
    722      1.1  mrg               /* Let's increase the precision of the inputs in a random way.
    723      1.1  mrg                  In most cases, this doesn't make any difference, but for
    724      1.1  mrg                  the mpfr_fmod bug fixed in r6230, this triggers the bug. */
    725      1.1  mrg               mpfr_prec_round (x, mpfr_get_prec (x) + (randlimb () & 15),
    726      1.1  mrg                                MPFR_RNDN);
    727      1.1  mrg #if defined(TWO_ARGS)
    728  1.1.1.6  mrg               mpfr_prec_round (x2, mpfr_get_prec (x2) + (randlimb () & 15),
    729      1.1  mrg                                MPFR_RNDN);
    730  1.1.1.6  mrg #if defined(THREE_ARGS)
    731  1.1.1.6  mrg               inexact = TEST_FUNCTION (z, x, x2, u, rnd);
    732  1.1.1.6  mrg #else
    733  1.1.1.6  mrg               inexact = TEST_FUNCTION (z, x, x2, rnd);
    734  1.1.1.6  mrg #endif
    735      1.1  mrg #elif defined(DOUBLE_ARG1)
    736      1.1  mrg               inexact = TEST_FUNCTION (z, d, x, rnd);
    737      1.1  mrg #elif defined(DOUBLE_ARG2)
    738      1.1  mrg               inexact = TEST_FUNCTION (z, x, d, rnd);
    739  1.1.1.4  mrg #elif defined(ULONG_ARG1) && defined(ONE_ARG)
    740  1.1.1.6  mrg               inexact = TEST_FUNCTION (z, u, rnd);
    741  1.1.1.3  mrg #elif defined(ULONG_ARG1)
    742  1.1.1.6  mrg               inexact = TEST_FUNCTION (z, u, x, rnd);
    743  1.1.1.3  mrg #elif defined(ULONG_ARG2)
    744  1.1.1.6  mrg               inexact = TEST_FUNCTION (z, x, u, rnd);
    745      1.1  mrg #else
    746      1.1  mrg               inexact = TEST_FUNCTION (z, x, rnd);
    747      1.1  mrg #endif
    748      1.1  mrg               if (mpfr_erangeflag_p ())
    749      1.1  mrg                 goto next_n;
    750  1.1.1.4  mrg               if (! mpfr_equal_p (t, z) && rnd != MPFR_RNDF)
    751      1.1  mrg                 {
    752  1.1.1.3  mrg                   printf ("tgeneric: results differ for "
    753  1.1.1.6  mrg                           MAKE_STR(TEST_FUNCTION) " on\n");
    754  1.1.1.6  mrg                   printf ("x1[%u] = ", (unsigned int) mpfr_get_prec (x));
    755  1.1.1.3  mrg                   mpfr_dump (x);
    756  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    757  1.1.1.6  mrg                   printf ("x2[%u] = ", (unsigned int) mpfr_get_prec (x2));
    758  1.1.1.6  mrg                   mpfr_dump (x2);
    759  1.1.1.6  mrg #endif
    760  1.1.1.6  mrg #ifdef ULONG_ARG
    761  1.1.1.6  mrg                   printf ("u = %lu\n", u);
    762      1.1  mrg #endif
    763  1.1.1.6  mrg                   printf ("prec = %u, rnd_mode = %s\n",
    764  1.1.1.3  mrg                           (unsigned int) prec, mpfr_print_rnd_mode (rnd));
    765  1.1.1.3  mrg                   printf ("Got      ");
    766  1.1.1.3  mrg                   mpfr_dump (z);
    767  1.1.1.3  mrg                   printf ("Expected ");
    768  1.1.1.3  mrg                   mpfr_dump (t);
    769  1.1.1.3  mrg                   printf ("Approx   ");
    770  1.1.1.3  mrg                   mpfr_dump (y);
    771      1.1  mrg                   exit (1);
    772      1.1  mrg                 }
    773      1.1  mrg               compare2 = mpfr_cmp (t, y);
    774      1.1  mrg               /* if rounding to nearest, cannot know the sign of t - f(x)
    775      1.1  mrg                  because of composed rounding: y = o(f(x)) and t = o(y) */
    776      1.1  mrg               if (compare * compare2 >= 0)
    777      1.1  mrg                 compare = compare + compare2;
    778      1.1  mrg               else
    779      1.1  mrg                 compare = inexact; /* cannot determine sign(t-f(x)) */
    780  1.1.1.4  mrg               if (! SAME_SIGN (inexact, compare) && rnd != MPFR_RNDF)
    781      1.1  mrg                 {
    782      1.1  mrg                   printf ("Wrong inexact flag for rnd=%s: expected %d, got %d"
    783      1.1  mrg                           "\n", mpfr_print_rnd_mode (rnd), compare, inexact);
    784  1.1.1.6  mrg                   printf ("x1[%u] = ", (unsigned int) mpfr_get_prec (x));
    785  1.1.1.3  mrg                   mpfr_dump (x);
    786  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    787  1.1.1.6  mrg                   printf ("x2[%u] = ", (unsigned int) mpfr_get_prec (x2));
    788  1.1.1.6  mrg                   mpfr_dump (x2);
    789  1.1.1.6  mrg #endif
    790  1.1.1.6  mrg #ifdef ULONG_ARG
    791  1.1.1.6  mrg                   printf ("u = %lu\n", u);
    792      1.1  mrg #endif
    793  1.1.1.3  mrg                   printf ("y = ");
    794  1.1.1.3  mrg                   mpfr_dump (y);
    795  1.1.1.3  mrg                   printf ("t = ");
    796  1.1.1.3  mrg                   mpfr_dump (t);
    797      1.1  mrg                   exit (1);
    798      1.1  mrg                 }
    799      1.1  mrg             }
    800      1.1  mrg           else if (getenv ("MPFR_SUSPICIOUS_OVERFLOW") != NULL)
    801      1.1  mrg             {
    802      1.1  mrg               /* For developers only! */
    803      1.1  mrg               MPFR_ASSERTN (MPFR_IS_PURE_FP (y));
    804      1.1  mrg               mpfr_nexttoinf (y);
    805      1.1  mrg               if (MPFR_IS_INF (y) && MPFR_IS_LIKE_RNDZ (rnd, MPFR_IS_NEG (y))
    806  1.1.1.2  mrg                   && !mpfr_overflow_p () && TGENERIC_SO_TEST)
    807      1.1  mrg                 {
    808      1.1  mrg                   printf ("Possible bug! |y| is the maximum finite number "
    809  1.1.1.5  mrg                           "(with yprec = %u) and has\nbeen obtained when "
    810  1.1.1.5  mrg                           "rounding toward zero (%s). Thus there is a very\n"
    811  1.1.1.5  mrg                           "probable overflow, but the overflow flag is not "
    812  1.1.1.5  mrg                           "set!\n",
    813  1.1.1.5  mrg                           (unsigned int) yprec, mpfr_print_rnd_mode (rnd));
    814  1.1.1.6  mrg                   printf ("x1[%u] = ", (unsigned int) mpfr_get_prec (x));
    815  1.1.1.3  mrg                   mpfr_dump (x);
    816  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    817  1.1.1.6  mrg                   printf ("x2[%u] = ", (unsigned int) mpfr_get_prec (x2));
    818  1.1.1.6  mrg                   mpfr_dump (x2);
    819  1.1.1.6  mrg #endif
    820  1.1.1.6  mrg #ifdef ULONG_ARG
    821  1.1.1.6  mrg                   printf ("u = %lu\n", u);
    822      1.1  mrg #endif
    823      1.1  mrg                   exit (1);
    824      1.1  mrg                 }
    825      1.1  mrg             }
    826      1.1  mrg 
    827      1.1  mrg         next_n:
    828      1.1  mrg           /* In case the exponent range has been changed by
    829      1.1  mrg              tests_default_random() or for special values... */
    830  1.1.1.6  mrg           set_emin (old_emin);
    831  1.1.1.6  mrg           set_emax (old_emax);
    832      1.1  mrg         }
    833      1.1  mrg     }
    834      1.1  mrg 
    835  1.1.1.6  mrg if (getenv ("MPFR_TGENERIC_STAT") != NULL)
    836  1.1.1.6  mrg   printf ("tgeneric: normal cases / total = %lu / %lu\n", ctrn, ctrt);
    837  1.1.1.6  mrg 
    838      1.1  mrg #ifndef TGENERIC_NOWARNING
    839      1.1  mrg   if (3 * ctrn < 2 * ctrt)
    840      1.1  mrg     printf ("Warning! Too few normal cases in generic tests (%lu / %lu)\n",
    841      1.1  mrg             ctrn, ctrt);
    842      1.1  mrg #endif
    843      1.1  mrg 
    844  1.1.1.4  mrg   mpfr_clears (x, y, yd, yu, z, t, w, (mpfr_ptr) 0);
    845  1.1.1.6  mrg #ifdef TWO_ARGS_ALL
    846  1.1.1.6  mrg   mpfr_clear (x2);
    847      1.1  mrg #endif
    848      1.1  mrg }
    849      1.1  mrg 
    850      1.1  mrg #undef TEST_RANDOM_POS
    851      1.1  mrg #undef TEST_RANDOM_POS2
    852      1.1  mrg #undef TEST_RANDOM_EMIN
    853      1.1  mrg #undef TEST_RANDOM_EMAX
    854  1.1.1.3  mrg #undef TEST_RANDOM_ALWAYS_SCALE
    855      1.1  mrg #undef RAND_FUNCTION
    856  1.1.1.6  mrg #undef THREE_ARGS
    857      1.1  mrg #undef TWO_ARGS
    858  1.1.1.3  mrg #undef TWO_ARGS_ALL
    859  1.1.1.6  mrg #undef ULONG_ARG
    860  1.1.1.6  mrg #undef DOUBLE_ARG
    861  1.1.1.3  mrg #undef DOUBLE_ARG1
    862  1.1.1.3  mrg #undef DOUBLE_ARG2
    863  1.1.1.3  mrg #undef ULONG_ARG1
    864  1.1.1.3  mrg #undef ULONG_ARG2
    865      1.1  mrg #undef TEST_FUNCTION
    866      1.1  mrg #undef test_generic
    867  1.1.1.4  mrg #undef NSPEC
    868