Home | History | Annotate | Line # | Download | only in tests
tgeneric.c revision 1.1
      1  1.1  mrg /* Generic test file for functions with one or two arguments (the second being
      2  1.1  mrg    either mpfr_t or double).
      3  1.1  mrg 
      4  1.1  mrg Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
      5  1.1  mrg Contributed by the Arenaire and Cacao 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  mrg http://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  mrg /* define TWO_ARGS for two-argument functions like mpfr_pow
     25  1.1  mrg    define DOUBLE_ARG1 or DOUBLE_ARG2 for function with a double operand in
     26  1.1  mrg    first or second place like sub_d or d_sub */
     27  1.1  mrg 
     28  1.1  mrg #ifndef TEST_RANDOM_POS
     29  1.1  mrg /* For the random function: one number on two is negative. */
     30  1.1  mrg #define TEST_RANDOM_POS 256
     31  1.1  mrg #endif
     32  1.1  mrg 
     33  1.1  mrg #ifndef TEST_RANDOM_POS2
     34  1.1  mrg /* For the random function: one number on two is negative. */
     35  1.1  mrg #define TEST_RANDOM_POS2 256
     36  1.1  mrg #endif
     37  1.1  mrg 
     38  1.1  mrg #ifndef TEST_RANDOM_EMIN
     39  1.1  mrg #define TEST_RANDOM_EMIN -256
     40  1.1  mrg #endif
     41  1.1  mrg 
     42  1.1  mrg #ifndef TEST_RANDOM_EMAX
     43  1.1  mrg #define TEST_RANDOM_EMAX 255
     44  1.1  mrg #endif
     45  1.1  mrg 
     46  1.1  mrg /* The (void *) below is needed to avoid a warning with gcc 4.2+ and functions
     47  1.1  mrg  * with 2 arguments. See <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36299>.
     48  1.1  mrg  */
     49  1.1  mrg #define TGENERIC_FAIL(S, X, U)                                          \
     50  1.1  mrg   do                                                                    \
     51  1.1  mrg     {                                                                   \
     52  1.1  mrg       printf ("%s\nx = ", (S));                                         \
     53  1.1  mrg       mpfr_out_str (stdout, 2, 0, (X), MPFR_RNDN);                       \
     54  1.1  mrg       printf ("\n");                                                    \
     55  1.1  mrg       if ((void *) U != 0)                                              \
     56  1.1  mrg         {                                                               \
     57  1.1  mrg           printf ("u = ");                                              \
     58  1.1  mrg           mpfr_out_str (stdout, 2, 0, (U), MPFR_RNDN);                   \
     59  1.1  mrg           printf ("\n");                                                \
     60  1.1  mrg         }                                                               \
     61  1.1  mrg       printf ("yprec = %u, rnd_mode = %s, inexact = %d, flags = %u\n",  \
     62  1.1  mrg               (unsigned int) yprec, mpfr_print_rnd_mode (rnd), compare, \
     63  1.1  mrg               (unsigned int) __gmpfr_flags);                            \
     64  1.1  mrg       exit (1);                                                         \
     65  1.1  mrg     }                                                                   \
     66  1.1  mrg   while (0)
     67  1.1  mrg 
     68  1.1  mrg #undef TGENERIC_CHECK
     69  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
     70  1.1  mrg #define TGENERIC_CHECK(S, EXPR) \
     71  1.1  mrg   do if (!(EXPR)) TGENERIC_FAIL (S, x, u); while (0)
     72  1.1  mrg #else
     73  1.1  mrg #define TGENERIC_CHECK(S, EXPR) \
     74  1.1  mrg   do if (!(EXPR)) TGENERIC_FAIL (S, x, 0); while (0)
     75  1.1  mrg #endif
     76  1.1  mrg 
     77  1.1  mrg #ifdef DEBUG_TGENERIC
     78  1.1  mrg #define STR(F) #F
     79  1.1  mrg #define TGENERIC_IAUX(F,P,X,U)                                          \
     80  1.1  mrg   do                                                                    \
     81  1.1  mrg     {                                                                   \
     82  1.1  mrg       printf ("tgeneric: testing function " STR(F)                      \
     83  1.1  mrg               ", %s, target prec = %lu\nx = ",                          \
     84  1.1  mrg               mpfr_print_rnd_mode (rnd), (unsigned long) (P));          \
     85  1.1  mrg       mpfr_out_str (stdout, 2, 0, (X), MPFR_RNDN);                       \
     86  1.1  mrg       printf ("\n");                                                    \
     87  1.1  mrg       if (U)                                                            \
     88  1.1  mrg         {                                                               \
     89  1.1  mrg           printf ("u = ");                                              \
     90  1.1  mrg           mpfr_out_str (stdout, 2, 0, (U), MPFR_RNDN);                   \
     91  1.1  mrg           printf ("\n");                                                \
     92  1.1  mrg         }                                                               \
     93  1.1  mrg     }                                                                   \
     94  1.1  mrg   while (0)
     95  1.1  mrg #undef TGENERIC_INFO
     96  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
     97  1.1  mrg #define TGENERIC_INFO(F,P) TGENERIC_IAUX(F,P,x,u)
     98  1.1  mrg #else
     99  1.1  mrg #define TGENERIC_INFO(F,P) TGENERIC_IAUX(F,P,x,0)
    100  1.1  mrg #endif
    101  1.1  mrg #endif
    102  1.1  mrg 
    103  1.1  mrg /* For some functions (for example cos), the argument reduction is too
    104  1.1  mrg    expensive when using mpfr_get_emax(). Then simply define REDUCE_EMAX
    105  1.1  mrg    to some reasonable value before including tgeneric.c. */
    106  1.1  mrg #ifndef REDUCE_EMAX
    107  1.1  mrg #define REDUCE_EMAX mpfr_get_emax ()
    108  1.1  mrg #endif
    109  1.1  mrg 
    110  1.1  mrg static void
    111  1.1  mrg test_generic (mpfr_prec_t p0, mpfr_prec_t p1, unsigned int N)
    112  1.1  mrg {
    113  1.1  mrg   mpfr_prec_t prec, xprec, yprec;
    114  1.1  mrg   mpfr_t x, y, z, t, w;
    115  1.1  mrg #ifdef TWO_ARGS
    116  1.1  mrg   mpfr_t u;
    117  1.1  mrg #elif defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    118  1.1  mrg   mpfr_t u;
    119  1.1  mrg   double d;
    120  1.1  mrg #endif
    121  1.1  mrg   mpfr_rnd_t rnd;
    122  1.1  mrg   int inexact, compare, compare2;
    123  1.1  mrg   unsigned int n;
    124  1.1  mrg   unsigned long ctrt = 0, ctrn = 0;
    125  1.1  mrg   mpfr_exp_t old_emin, old_emax;
    126  1.1  mrg 
    127  1.1  mrg   old_emin = mpfr_get_emin ();
    128  1.1  mrg   old_emax = mpfr_get_emax ();
    129  1.1  mrg 
    130  1.1  mrg   mpfr_inits2 (MPFR_PREC_MIN, x, y, z, t, w, (mpfr_ptr) 0);
    131  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    132  1.1  mrg   mpfr_init2 (u, MPFR_PREC_MIN);
    133  1.1  mrg #endif
    134  1.1  mrg 
    135  1.1  mrg   /* generic test */
    136  1.1  mrg   for (prec = p0; prec <= p1; prec++)
    137  1.1  mrg     {
    138  1.1  mrg       mpfr_set_prec (z, prec);
    139  1.1  mrg       mpfr_set_prec (t, prec);
    140  1.1  mrg       yprec = prec + 10;
    141  1.1  mrg       mpfr_set_prec (y, yprec);
    142  1.1  mrg       mpfr_set_prec (w, yprec);
    143  1.1  mrg 
    144  1.1  mrg       /* Note: in precision p1, we test 4 special cases. */
    145  1.1  mrg       for (n = 0; n < (prec == p1 ? N + 4 : N); n++)
    146  1.1  mrg         {
    147  1.1  mrg           xprec = prec;
    148  1.1  mrg           if (randlimb () & 1)
    149  1.1  mrg             {
    150  1.1  mrg               xprec *= (double) randlimb () / MP_LIMB_T_MAX;
    151  1.1  mrg               if (xprec < MPFR_PREC_MIN)
    152  1.1  mrg                 xprec = MPFR_PREC_MIN;
    153  1.1  mrg             }
    154  1.1  mrg           mpfr_set_prec (x, xprec);
    155  1.1  mrg #ifdef TWO_ARGS
    156  1.1  mrg           mpfr_set_prec (u, xprec);
    157  1.1  mrg #elif defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    158  1.1  mrg           mpfr_set_prec (u, IEEE_DBL_MANT_DIG);
    159  1.1  mrg #endif
    160  1.1  mrg 
    161  1.1  mrg           if (n > 3 || prec < p1)
    162  1.1  mrg             {
    163  1.1  mrg #if defined(RAND_FUNCTION)
    164  1.1  mrg               RAND_FUNCTION (x);
    165  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    166  1.1  mrg               RAND_FUNCTION (u);
    167  1.1  mrg #endif
    168  1.1  mrg #else
    169  1.1  mrg               tests_default_random (x, TEST_RANDOM_POS,
    170  1.1  mrg                                     TEST_RANDOM_EMIN, TEST_RANDOM_EMAX);
    171  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    172  1.1  mrg               tests_default_random (u, TEST_RANDOM_POS2,
    173  1.1  mrg                                     TEST_RANDOM_EMIN, TEST_RANDOM_EMAX);
    174  1.1  mrg #endif
    175  1.1  mrg #endif
    176  1.1  mrg             }
    177  1.1  mrg           else
    178  1.1  mrg             {
    179  1.1  mrg               /* Special cases tested in precision p1 if n <= 3. They are
    180  1.1  mrg                  useful really in the extended exponent range. */
    181  1.1  mrg               set_emin (MPFR_EMIN_MIN);
    182  1.1  mrg               set_emax (MPFR_EMAX_MAX);
    183  1.1  mrg               if (n <= 1)
    184  1.1  mrg                 {
    185  1.1  mrg                   mpfr_set_si (x, n == 0 ? 1 : -1, MPFR_RNDN);
    186  1.1  mrg                   mpfr_set_exp (x, mpfr_get_emin ());
    187  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    188  1.1  mrg                   mpfr_set_si (u, randlimb () % 2 == 0 ? 1 : -1, MPFR_RNDN);
    189  1.1  mrg                   mpfr_set_exp (u, mpfr_get_emin ());
    190  1.1  mrg #endif
    191  1.1  mrg                 }
    192  1.1  mrg               else  /* 2 <= n <= 3 */
    193  1.1  mrg                 {
    194  1.1  mrg                   if (getenv ("MPFR_CHECK_MAX") == NULL)
    195  1.1  mrg                     goto next_n;
    196  1.1  mrg                   mpfr_set_si (x, n == 0 ? 1 : -1, MPFR_RNDN);
    197  1.1  mrg                   mpfr_setmax (x, REDUCE_EMAX);
    198  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    199  1.1  mrg                   mpfr_set_si (u, randlimb () % 2 == 0 ? 1 : -1, MPFR_RNDN);
    200  1.1  mrg                   mpfr_setmax (u, mpfr_get_emax ());
    201  1.1  mrg #endif
    202  1.1  mrg                 }
    203  1.1  mrg             }
    204  1.1  mrg 
    205  1.1  mrg           rnd = RND_RAND ();
    206  1.1  mrg           mpfr_clear_flags ();
    207  1.1  mrg #ifdef DEBUG_TGENERIC
    208  1.1  mrg           TGENERIC_INFO (TEST_FUNCTION, MPFR_PREC (y));
    209  1.1  mrg #endif
    210  1.1  mrg #if defined(TWO_ARGS)
    211  1.1  mrg           compare = TEST_FUNCTION (y, x, u, rnd);
    212  1.1  mrg #elif defined(DOUBLE_ARG1)
    213  1.1  mrg           d = mpfr_get_d (u, rnd);
    214  1.1  mrg           compare = TEST_FUNCTION (y, d, x, rnd);
    215  1.1  mrg #elif defined(DOUBLE_ARG2)
    216  1.1  mrg           d = mpfr_get_d (u, rnd);
    217  1.1  mrg           compare = TEST_FUNCTION (y, x, d, rnd);
    218  1.1  mrg #else
    219  1.1  mrg           compare = TEST_FUNCTION (y, x, rnd);
    220  1.1  mrg #endif
    221  1.1  mrg           TGENERIC_CHECK ("Bad inexact flag",
    222  1.1  mrg                           (compare != 0) ^ (mpfr_inexflag_p () == 0));
    223  1.1  mrg           ctrt++;
    224  1.1  mrg           /* Consistency test in a reduced exponent range. Doing it
    225  1.1  mrg              for the first 10 samples and for prec == p1 (which has
    226  1.1  mrg              some special cases) should be sufficient. */
    227  1.1  mrg           if (ctrt <= 10 || prec == p1)
    228  1.1  mrg             {
    229  1.1  mrg               unsigned int flags, oldflags = __gmpfr_flags;
    230  1.1  mrg               mpfr_exp_t e, emin, emax, oemin, oemax;
    231  1.1  mrg 
    232  1.1  mrg               /* Determine the smallest exponent range containing the
    233  1.1  mrg                  exponents of the mpfr_t inputs (x, and u if TWO_ARGS)
    234  1.1  mrg                  and output (y). */
    235  1.1  mrg               emin = MPFR_EMAX_MAX;
    236  1.1  mrg               emax = MPFR_EMIN_MIN;
    237  1.1  mrg               if (MPFR_IS_PURE_FP (x))
    238  1.1  mrg                 {
    239  1.1  mrg                   e = MPFR_GET_EXP (x);
    240  1.1  mrg                   if (e < emin)
    241  1.1  mrg                     emin = e;
    242  1.1  mrg                   if (e > emax)
    243  1.1  mrg                     emax = e;
    244  1.1  mrg                 }
    245  1.1  mrg               if (MPFR_IS_PURE_FP (y))
    246  1.1  mrg                 {
    247  1.1  mrg                   e = MPFR_GET_EXP (y);
    248  1.1  mrg                   if (e < emin)
    249  1.1  mrg                     emin = e;
    250  1.1  mrg                   if (e > emax)
    251  1.1  mrg                     emax = e;
    252  1.1  mrg                 }
    253  1.1  mrg #if defined(TWO_ARGS)
    254  1.1  mrg               if (MPFR_IS_PURE_FP (u))
    255  1.1  mrg                 {
    256  1.1  mrg                   e = MPFR_GET_EXP (u);
    257  1.1  mrg                   if (e < emin)
    258  1.1  mrg                     emin = e;
    259  1.1  mrg                   if (e > emax)
    260  1.1  mrg                     emax = e;
    261  1.1  mrg                 }
    262  1.1  mrg #endif
    263  1.1  mrg               if (emin > emax)
    264  1.1  mrg                 emin = emax;  /* case where all values are singular */
    265  1.1  mrg               oemin = mpfr_get_emin ();
    266  1.1  mrg               oemax = mpfr_get_emax ();
    267  1.1  mrg               mpfr_set_emin (emin);
    268  1.1  mrg               mpfr_set_emax (emax);
    269  1.1  mrg               mpfr_clear_flags ();
    270  1.1  mrg #if defined(TWO_ARGS)
    271  1.1  mrg               inexact = TEST_FUNCTION (w, x, u, rnd);
    272  1.1  mrg #elif defined(DOUBLE_ARG1)
    273  1.1  mrg               inexact = TEST_FUNCTION (w, d, x, rnd);
    274  1.1  mrg #elif defined(DOUBLE_ARG2)
    275  1.1  mrg               inexact = TEST_FUNCTION (w, x, d, rnd);
    276  1.1  mrg #else
    277  1.1  mrg               inexact = TEST_FUNCTION (w, x, rnd);
    278  1.1  mrg #endif
    279  1.1  mrg               flags = __gmpfr_flags;
    280  1.1  mrg               mpfr_set_emin (oemin);
    281  1.1  mrg               mpfr_set_emax (oemax);
    282  1.1  mrg               if (! (SAME_VAL (w, y) &&
    283  1.1  mrg                      SAME_SIGN (inexact, compare) &&
    284  1.1  mrg                      flags == oldflags))
    285  1.1  mrg                 {
    286  1.1  mrg                   printf ("Error in reduced exponent range [%"
    287  1.1  mrg                           MPFR_EXP_FSPEC "d,%" MPFR_EXP_FSPEC "d] on:\n",
    288  1.1  mrg                           (mpfr_eexp_t) emin, (mpfr_eexp_t) emax);
    289  1.1  mrg                   printf ("x = ");
    290  1.1  mrg                   mpfr_dump (x);
    291  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    292  1.1  mrg                   printf ("u = ");
    293  1.1  mrg                   mpfr_dump (u);
    294  1.1  mrg #endif
    295  1.1  mrg                   printf ("yprec = %u, rnd_mode = %s\n",
    296  1.1  mrg                           (unsigned int) yprec, mpfr_print_rnd_mode (rnd));
    297  1.1  mrg                   printf ("Expected:\n  y = ");
    298  1.1  mrg                   mpfr_dump (y);
    299  1.1  mrg                   printf ("  inex = %d, flags = %u\n",
    300  1.1  mrg                           SIGN (compare), oldflags);
    301  1.1  mrg                   printf ("Got:\n  w = ");
    302  1.1  mrg                   mpfr_dump (w);
    303  1.1  mrg                   printf ("  inex = %d, flags = %u\n",
    304  1.1  mrg                           SIGN (inexact), flags);
    305  1.1  mrg                   exit (1);
    306  1.1  mrg                 }
    307  1.1  mrg             }
    308  1.1  mrg           if (MPFR_IS_SINGULAR (y))
    309  1.1  mrg             {
    310  1.1  mrg               if (MPFR_IS_NAN (y) || mpfr_nanflag_p ())
    311  1.1  mrg                 TGENERIC_CHECK ("Bad NaN flag",
    312  1.1  mrg                                 MPFR_IS_NAN (y) && mpfr_nanflag_p ());
    313  1.1  mrg               else if (MPFR_IS_INF (y))
    314  1.1  mrg                 TGENERIC_CHECK ("Bad overflow flag",
    315  1.1  mrg                                 (compare != 0) ^ (mpfr_overflow_p () == 0));
    316  1.1  mrg               else if (MPFR_IS_ZERO (y))
    317  1.1  mrg                 TGENERIC_CHECK ("Bad underflow flag",
    318  1.1  mrg                                 (compare != 0) ^ (mpfr_underflow_p () == 0));
    319  1.1  mrg             }
    320  1.1  mrg           else if (mpfr_overflow_p ())
    321  1.1  mrg             {
    322  1.1  mrg               TGENERIC_CHECK ("Bad compare value (overflow)", compare != 0);
    323  1.1  mrg               mpfr_nexttoinf (y);
    324  1.1  mrg               TGENERIC_CHECK ("Should have been max MPFR number",
    325  1.1  mrg                               MPFR_IS_INF (y));
    326  1.1  mrg             }
    327  1.1  mrg           else if (mpfr_underflow_p ())
    328  1.1  mrg             {
    329  1.1  mrg               TGENERIC_CHECK ("Bad compare value (underflow)", compare != 0);
    330  1.1  mrg               mpfr_nexttozero (y);
    331  1.1  mrg               TGENERIC_CHECK ("Should have been min MPFR number",
    332  1.1  mrg                               MPFR_IS_ZERO (y));
    333  1.1  mrg             }
    334  1.1  mrg           else if (mpfr_can_round (y, yprec, rnd, rnd, prec))
    335  1.1  mrg             {
    336  1.1  mrg               ctrn++;
    337  1.1  mrg               mpfr_set (t, y, rnd);
    338  1.1  mrg               /* Risk of failures are known when some flags are already set
    339  1.1  mrg                  before the function call. Do not set the erange flag, as
    340  1.1  mrg                  it will remain set after the function call and no checks
    341  1.1  mrg                  are performed in such a case (see the mpfr_erangeflag_p
    342  1.1  mrg                  test below). */
    343  1.1  mrg               if (randlimb () & 1)
    344  1.1  mrg                 __gmpfr_flags = MPFR_FLAGS_ALL ^ MPFR_FLAGS_ERANGE;
    345  1.1  mrg #ifdef DEBUG_TGENERIC
    346  1.1  mrg               TGENERIC_INFO (TEST_FUNCTION, MPFR_PREC (z));
    347  1.1  mrg #endif
    348  1.1  mrg               /* Let's increase the precision of the inputs in a random way.
    349  1.1  mrg                  In most cases, this doesn't make any difference, but for
    350  1.1  mrg                  the mpfr_fmod bug fixed in r6230, this triggers the bug. */
    351  1.1  mrg               mpfr_prec_round (x, mpfr_get_prec (x) + (randlimb () & 15),
    352  1.1  mrg                                MPFR_RNDN);
    353  1.1  mrg #if defined(TWO_ARGS)
    354  1.1  mrg               mpfr_prec_round (u, mpfr_get_prec (u) + (randlimb () & 15),
    355  1.1  mrg                                MPFR_RNDN);
    356  1.1  mrg               inexact = TEST_FUNCTION (z, x, u, rnd);
    357  1.1  mrg #elif defined(DOUBLE_ARG1)
    358  1.1  mrg               inexact = TEST_FUNCTION (z, d, x, rnd);
    359  1.1  mrg #elif defined(DOUBLE_ARG2)
    360  1.1  mrg               inexact = TEST_FUNCTION (z, x, d, rnd);
    361  1.1  mrg #else
    362  1.1  mrg               inexact = TEST_FUNCTION (z, x, rnd);
    363  1.1  mrg #endif
    364  1.1  mrg               if (mpfr_erangeflag_p ())
    365  1.1  mrg                 goto next_n;
    366  1.1  mrg               if (mpfr_nan_p (z) || mpfr_cmp (t, z) != 0)
    367  1.1  mrg                 {
    368  1.1  mrg                   printf ("results differ for x=");
    369  1.1  mrg                   mpfr_out_str (stdout, 2, xprec, x, MPFR_RNDN);
    370  1.1  mrg #ifdef TWO_ARGS
    371  1.1  mrg                   printf ("\nu=");
    372  1.1  mrg                   mpfr_out_str (stdout, 2, xprec, u, MPFR_RNDN);
    373  1.1  mrg #elif defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    374  1.1  mrg                   printf ("\nu=");
    375  1.1  mrg                   mpfr_out_str (stdout, 2, IEEE_DBL_MANT_DIG, u, MPFR_RNDN);
    376  1.1  mrg #endif
    377  1.1  mrg                   printf (" prec=%u rnd_mode=%s\n", (unsigned) prec,
    378  1.1  mrg                           mpfr_print_rnd_mode (rnd));
    379  1.1  mrg                   printf ("got      ");
    380  1.1  mrg                   mpfr_out_str (stdout, 2, prec, z, MPFR_RNDN);
    381  1.1  mrg                   puts ("");
    382  1.1  mrg                   printf ("expected ");
    383  1.1  mrg                   mpfr_out_str (stdout, 2, prec, t, MPFR_RNDN);
    384  1.1  mrg                   puts ("");
    385  1.1  mrg                   printf ("approx   ");
    386  1.1  mrg                   mpfr_print_binary (y);
    387  1.1  mrg                   puts ("");
    388  1.1  mrg                   exit (1);
    389  1.1  mrg                 }
    390  1.1  mrg               compare2 = mpfr_cmp (t, y);
    391  1.1  mrg               /* if rounding to nearest, cannot know the sign of t - f(x)
    392  1.1  mrg                  because of composed rounding: y = o(f(x)) and t = o(y) */
    393  1.1  mrg               if (compare * compare2 >= 0)
    394  1.1  mrg                 compare = compare + compare2;
    395  1.1  mrg               else
    396  1.1  mrg                 compare = inexact; /* cannot determine sign(t-f(x)) */
    397  1.1  mrg               if (((inexact == 0) && (compare != 0)) ||
    398  1.1  mrg                   ((inexact > 0) && (compare <= 0)) ||
    399  1.1  mrg                   ((inexact < 0) && (compare >= 0)))
    400  1.1  mrg                 {
    401  1.1  mrg                   printf ("Wrong inexact flag for rnd=%s: expected %d, got %d"
    402  1.1  mrg                           "\n", mpfr_print_rnd_mode (rnd), compare, inexact);
    403  1.1  mrg                   printf ("x="); mpfr_print_binary (x); puts ("");
    404  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    405  1.1  mrg                   printf ("u="); mpfr_print_binary (u); puts ("");
    406  1.1  mrg #endif
    407  1.1  mrg                   printf ("y="); mpfr_print_binary (y); puts ("");
    408  1.1  mrg                   printf ("t="); mpfr_print_binary (t); puts ("");
    409  1.1  mrg                   exit (1);
    410  1.1  mrg                 }
    411  1.1  mrg             }
    412  1.1  mrg           else if (getenv ("MPFR_SUSPICIOUS_OVERFLOW") != NULL)
    413  1.1  mrg             {
    414  1.1  mrg               /* For developers only! */
    415  1.1  mrg               MPFR_ASSERTN (MPFR_IS_PURE_FP (y));
    416  1.1  mrg               mpfr_nexttoinf (y);
    417  1.1  mrg               if (MPFR_IS_INF (y) && MPFR_IS_LIKE_RNDZ (rnd, MPFR_IS_NEG (y))
    418  1.1  mrg                   && !mpfr_overflow_p ())
    419  1.1  mrg                 {
    420  1.1  mrg                   printf ("Possible bug! |y| is the maximum finite number "
    421  1.1  mrg                           "and has been obtained when\nrounding toward zero"
    422  1.1  mrg                           " (%s). Thus there is a very probable overflow,\n"
    423  1.1  mrg                           "but the overflow flag is not set!\n",
    424  1.1  mrg                           mpfr_print_rnd_mode (rnd));
    425  1.1  mrg                   printf ("x="); mpfr_print_binary (x); puts ("");
    426  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    427  1.1  mrg                   printf ("u="); mpfr_print_binary (u); puts ("");
    428  1.1  mrg #endif
    429  1.1  mrg                   exit (1);
    430  1.1  mrg                 }
    431  1.1  mrg             }
    432  1.1  mrg 
    433  1.1  mrg         next_n:
    434  1.1  mrg           /* In case the exponent range has been changed by
    435  1.1  mrg              tests_default_random() or for special values... */
    436  1.1  mrg           mpfr_set_emin (old_emin);
    437  1.1  mrg           mpfr_set_emax (old_emax);
    438  1.1  mrg         }
    439  1.1  mrg     }
    440  1.1  mrg 
    441  1.1  mrg #ifndef TGENERIC_NOWARNING
    442  1.1  mrg   if (3 * ctrn < 2 * ctrt)
    443  1.1  mrg     printf ("Warning! Too few normal cases in generic tests (%lu / %lu)\n",
    444  1.1  mrg             ctrn, ctrt);
    445  1.1  mrg #endif
    446  1.1  mrg 
    447  1.1  mrg   mpfr_clears (x, y, z, t, w, (mpfr_ptr) 0);
    448  1.1  mrg #if defined(TWO_ARGS) || defined(DOUBLE_ARG1) || defined(DOUBLE_ARG2)
    449  1.1  mrg   mpfr_clear (u);
    450  1.1  mrg #endif
    451  1.1  mrg }
    452  1.1  mrg 
    453  1.1  mrg #undef TEST_RANDOM_POS
    454  1.1  mrg #undef TEST_RANDOM_POS2
    455  1.1  mrg #undef TEST_RANDOM_EMIN
    456  1.1  mrg #undef TEST_RANDOM_EMAX
    457  1.1  mrg #undef RAND_FUNCTION
    458  1.1  mrg #undef TWO_ARGS
    459  1.1  mrg #undef TWO_ARGS_UI
    460  1.1  mrg #undef TEST_FUNCTION
    461  1.1  mrg #undef test_generic
    462