Home | History | Annotate | Line # | Download | only in tests
      1      1.1  mrg /* Test file for round away.
      2      1.1  mrg 
      3  1.1.1.6  mrg Copyright 2000-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 DISP(s,t)                                       \
     26  1.1.1.4  mrg   do                                                    \
     27  1.1.1.4  mrg     {                                                   \
     28  1.1.1.4  mrg       printf (s);                                       \
     29  1.1.1.4  mrg       mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);        \
     30  1.1.1.4  mrg     }                                                   \
     31  1.1.1.4  mrg   while (0)
     32  1.1.1.4  mrg 
     33  1.1.1.4  mrg #define DISP2(s,t) do { DISP(s,t); putchar ('\n'); } while (0)
     34      1.1  mrg 
     35      1.1  mrg #define SPECIAL_MAX 12
     36      1.1  mrg 
     37      1.1  mrg static void
     38      1.1  mrg set_special (mpfr_ptr x, unsigned int select)
     39      1.1  mrg {
     40      1.1  mrg   MPFR_ASSERTN (select < SPECIAL_MAX);
     41      1.1  mrg   switch (select)
     42      1.1  mrg     {
     43      1.1  mrg     case 0:
     44      1.1  mrg       MPFR_SET_NAN (x);
     45      1.1  mrg       break;
     46      1.1  mrg     case 1:
     47      1.1  mrg       MPFR_SET_INF (x);
     48      1.1  mrg       MPFR_SET_POS (x);
     49      1.1  mrg       break;
     50      1.1  mrg     case 2:
     51      1.1  mrg       MPFR_SET_INF (x);
     52      1.1  mrg       MPFR_SET_NEG (x);
     53      1.1  mrg       break;
     54      1.1  mrg     case 3:
     55      1.1  mrg       MPFR_SET_ZERO (x);
     56      1.1  mrg       MPFR_SET_POS  (x);
     57      1.1  mrg       break;
     58      1.1  mrg     case 4:
     59      1.1  mrg       MPFR_SET_ZERO (x);
     60      1.1  mrg       MPFR_SET_NEG  (x);
     61      1.1  mrg       break;
     62      1.1  mrg     case 5:
     63      1.1  mrg       mpfr_set_str_binary (x, "1");
     64      1.1  mrg       break;
     65      1.1  mrg     case 6:
     66      1.1  mrg       mpfr_set_str_binary (x, "-1");
     67      1.1  mrg       break;
     68      1.1  mrg     case 7:
     69      1.1  mrg       mpfr_set_str_binary (x, "1e-1");
     70      1.1  mrg       break;
     71      1.1  mrg     case 8:
     72      1.1  mrg       mpfr_set_str_binary (x, "1e+1");
     73      1.1  mrg       break;
     74      1.1  mrg     case 9:
     75      1.1  mrg       mpfr_const_pi (x, MPFR_RNDN);
     76      1.1  mrg       break;
     77      1.1  mrg     case 10:
     78      1.1  mrg       mpfr_const_pi (x, MPFR_RNDN);
     79      1.1  mrg       MPFR_SET_EXP (x, MPFR_GET_EXP (x)-1);
     80      1.1  mrg       break;
     81      1.1  mrg     default:
     82      1.1  mrg       mpfr_urandomb (x, RANDS);
     83      1.1  mrg       break;
     84      1.1  mrg     }
     85      1.1  mrg }
     86  1.1.1.6  mrg 
     87  1.1.1.6  mrg /* same as mpfr_cmp, but returns 0 for both NaN's */
     88      1.1  mrg static int
     89      1.1  mrg mpfr_compare (mpfr_srcptr a, mpfr_srcptr b)
     90      1.1  mrg {
     91      1.1  mrg   return (MPFR_IS_NAN(a)) ? !MPFR_IS_NAN(b) :
     92      1.1  mrg     (MPFR_IS_NAN(b) || mpfr_cmp(a, b));
     93      1.1  mrg }
     94      1.1  mrg 
     95      1.1  mrg static void
     96      1.1  mrg test3 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_rnd_t),
     97  1.1.1.2  mrg        const char *foo)
     98      1.1  mrg {
     99      1.1  mrg   mpfr_t ref1, ref2, ref3;
    100      1.1  mrg   mpfr_t res1;
    101      1.1  mrg   mpfr_prec_t p1, p2, p3;
    102      1.1  mrg   int i, inexa, inexd;
    103      1.1  mrg   mpfr_rnd_t r;
    104      1.1  mrg 
    105      1.1  mrg   p1 = (randlimb () % 200) + MPFR_PREC_MIN;
    106      1.1  mrg   p2 = (randlimb () % 200) + MPFR_PREC_MIN;
    107      1.1  mrg   p3 = (randlimb () % 200) + MPFR_PREC_MIN;
    108      1.1  mrg 
    109      1.1  mrg   mpfr_init2 (ref1, p1);
    110      1.1  mrg   mpfr_init2 (ref2, p2);
    111      1.1  mrg   mpfr_init2 (ref3, p3);
    112      1.1  mrg   mpfr_init2 (res1, p1);
    113      1.1  mrg 
    114      1.1  mrg   /* for each variable, consider each of the following 6 possibilities:
    115      1.1  mrg      NaN, +Infinity, -Infinity, +0, -0 or a random number */
    116      1.1  mrg   for (i = 0; i < SPECIAL_MAX * SPECIAL_MAX; i++)
    117      1.1  mrg     {
    118      1.1  mrg       set_special (ref2, i%SPECIAL_MAX);
    119      1.1  mrg       set_special (ref3, i/SPECIAL_MAX);
    120      1.1  mrg 
    121      1.1  mrg       inexa = testfunc (res1, ref2, ref3, MPFR_RNDA);
    122  1.1.1.4  mrg       r = MPFR_IS_POS (res1) ? MPFR_RNDU : MPFR_RNDD;
    123      1.1  mrg       inexd = testfunc (ref1, ref2, ref3, r);
    124      1.1  mrg 
    125      1.1  mrg       if (mpfr_compare (res1, ref1) || inexa != inexd)
    126      1.1  mrg         {
    127      1.1  mrg           printf ("Error with RNDA for %s with ", foo);
    128      1.1  mrg           DISP("x=",ref2); DISP2(", y=",ref3);
    129      1.1  mrg           printf ("inexa=%d inexd=%d\n", inexa, inexd);
    130  1.1.1.4  mrg           printf ("expected "); mpfr_dump (ref1);
    131  1.1.1.4  mrg           printf ("got      "); mpfr_dump (res1);
    132      1.1  mrg           exit (1);
    133      1.1  mrg         }
    134      1.1  mrg     }
    135      1.1  mrg 
    136      1.1  mrg   mpfr_clear (ref1);
    137      1.1  mrg   mpfr_clear (ref2);
    138      1.1  mrg   mpfr_clear (ref3);
    139      1.1  mrg   mpfr_clear (res1);
    140      1.1  mrg }
    141      1.1  mrg 
    142      1.1  mrg static void
    143      1.1  mrg test4 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr,
    144  1.1.1.2  mrg                        mpfr_rnd_t), const char *foo)
    145      1.1  mrg {
    146      1.1  mrg   mpfr_t ref, op1, op2, op3;
    147      1.1  mrg   mpfr_prec_t pout, p1, p2, p3;
    148      1.1  mrg   mpfr_t res;
    149      1.1  mrg   int i, j, k, inexa, inexd;
    150      1.1  mrg   mpfr_rnd_t r;
    151      1.1  mrg 
    152      1.1  mrg   pout = (randlimb () % 200) + MPFR_PREC_MIN;
    153      1.1  mrg   p1 = (randlimb () % 200) + MPFR_PREC_MIN;
    154      1.1  mrg   p2 = (randlimb () % 200) + MPFR_PREC_MIN;
    155      1.1  mrg   p3 = (randlimb () % 200) + MPFR_PREC_MIN;
    156      1.1  mrg 
    157      1.1  mrg   mpfr_init2 (ref, pout);
    158      1.1  mrg   mpfr_init2 (res, pout);
    159      1.1  mrg   mpfr_init2 (op1, p1);
    160      1.1  mrg   mpfr_init2 (op2, p2);
    161      1.1  mrg   mpfr_init2 (op3, p3);
    162      1.1  mrg 
    163      1.1  mrg   /* for each variable, consider each of the following 6 possibilities:
    164      1.1  mrg      NaN, +Infinity, -Infinity, +0, -0 or a random number */
    165      1.1  mrg 
    166      1.1  mrg   for (i = 0; i < SPECIAL_MAX; i++)
    167      1.1  mrg     {
    168      1.1  mrg       set_special (op1, i);
    169      1.1  mrg       for (j = 0; j < SPECIAL_MAX; j++)
    170      1.1  mrg         {
    171      1.1  mrg           set_special (op2, j);
    172      1.1  mrg           for (k = 0; k < SPECIAL_MAX; k++)
    173      1.1  mrg             {
    174      1.1  mrg               set_special (op3, k);
    175      1.1  mrg 
    176      1.1  mrg               inexa = testfunc (res, op1, op2, op3, MPFR_RNDA);
    177  1.1.1.4  mrg               r = MPFR_IS_POS (res) ? MPFR_RNDU : MPFR_RNDD;
    178      1.1  mrg               inexd = testfunc (ref, op1, op2, op3, r);
    179      1.1  mrg 
    180      1.1  mrg               if (mpfr_compare (res, ref) || inexa != inexd)
    181      1.1  mrg                 {
    182      1.1  mrg                   printf ("Error with RNDA for %s with ", foo);
    183      1.1  mrg                   DISP("a=", op1); DISP(", b=", op2); DISP2(", c=", op3);
    184      1.1  mrg                   printf ("inexa=%d inexd=%d\n", inexa, inexd);
    185      1.1  mrg                   DISP("expected ", ref); DISP2(", got ", res);
    186      1.1  mrg                   exit (1);
    187      1.1  mrg                 }
    188      1.1  mrg             }
    189      1.1  mrg         }
    190      1.1  mrg     }
    191      1.1  mrg 
    192      1.1  mrg   mpfr_clear (ref);
    193      1.1  mrg   mpfr_clear (op1);
    194      1.1  mrg   mpfr_clear (op2);
    195      1.1  mrg   mpfr_clear (op3);
    196      1.1  mrg   mpfr_clear (res);
    197      1.1  mrg }
    198      1.1  mrg 
    199      1.1  mrg static void
    200      1.1  mrg test2ui (int (*testfunc)(mpfr_ptr, mpfr_srcptr, unsigned long int, mpfr_rnd_t),
    201  1.1.1.2  mrg          const char *foo)
    202      1.1  mrg {
    203      1.1  mrg   mpfr_t ref1, ref2;
    204      1.1  mrg   unsigned int ref3;
    205      1.1  mrg   mpfr_t res1;
    206      1.1  mrg   mpfr_prec_t p1, p2;
    207      1.1  mrg   int i, inexa, inexd;
    208      1.1  mrg   mpfr_rnd_t r;
    209      1.1  mrg 
    210      1.1  mrg   p1 = (randlimb () % 200) + MPFR_PREC_MIN;
    211      1.1  mrg   p2 = (randlimb () % 200) + MPFR_PREC_MIN;
    212      1.1  mrg 
    213      1.1  mrg   mpfr_init2 (ref1, p1);
    214      1.1  mrg   mpfr_init2 (ref2, p2);
    215      1.1  mrg   mpfr_init2 (res1, p1);
    216      1.1  mrg 
    217      1.1  mrg   /* ref2 can be NaN, +Inf, -Inf, +0, -0 or any number
    218      1.1  mrg      ref3 can be 0 or any number */
    219      1.1  mrg   for (i = 0; i < SPECIAL_MAX * 2; i++)
    220      1.1  mrg     {
    221      1.1  mrg       set_special (ref2, i % SPECIAL_MAX);
    222      1.1  mrg       ref3 = i / SPECIAL_MAX == 0 ? 0 : randlimb ();
    223      1.1  mrg 
    224      1.1  mrg       inexa = testfunc (res1, ref2, ref3, MPFR_RNDA);
    225  1.1.1.4  mrg       r = MPFR_IS_POS (res1) ? MPFR_RNDU : MPFR_RNDD;
    226      1.1  mrg       inexd = testfunc (ref1, ref2, ref3, r);
    227      1.1  mrg 
    228      1.1  mrg       if (mpfr_compare (res1, ref1) || inexa != inexd)
    229      1.1  mrg         {
    230      1.1  mrg           printf ("Error with RNDA for %s for c=%u\n", foo, ref3);
    231      1.1  mrg           DISP2("a=",ref2);
    232      1.1  mrg           printf ("inexa=%d inexd=%d\n", inexa, inexd);
    233  1.1.1.4  mrg           printf ("expected "); mpfr_dump (ref1);
    234  1.1.1.4  mrg           printf ("got      "); mpfr_dump (res1);
    235      1.1  mrg           exit (1);
    236      1.1  mrg         }
    237      1.1  mrg     }
    238      1.1  mrg 
    239      1.1  mrg   mpfr_clear (ref1);
    240      1.1  mrg   mpfr_clear (ref2);
    241      1.1  mrg   mpfr_clear (res1);
    242      1.1  mrg }
    243      1.1  mrg 
    244      1.1  mrg static void
    245      1.1  mrg testui2 (int (*testfunc)(mpfr_ptr, unsigned long int, mpfr_srcptr, mpfr_rnd_t),
    246  1.1.1.2  mrg          const char *foo)
    247      1.1  mrg {
    248      1.1  mrg   mpfr_t ref1, ref3;
    249      1.1  mrg   unsigned int ref2;
    250      1.1  mrg   mpfr_t res1;
    251      1.1  mrg   mpfr_prec_t p1, p3;
    252      1.1  mrg   int i, inexa, inexd;
    253      1.1  mrg   mpfr_rnd_t r;
    254      1.1  mrg 
    255      1.1  mrg   p1 = (randlimb () % 200) + MPFR_PREC_MIN;
    256      1.1  mrg   p3 = (randlimb () % 200) + MPFR_PREC_MIN;
    257      1.1  mrg 
    258      1.1  mrg   mpfr_init2 (ref1, p1);
    259      1.1  mrg   mpfr_init2 (ref3, p3);
    260      1.1  mrg   mpfr_init2 (res1, p1);
    261      1.1  mrg 
    262      1.1  mrg   for (i = 0; i < SPECIAL_MAX * 2; i++)
    263      1.1  mrg     {
    264      1.1  mrg       set_special (ref3, i % SPECIAL_MAX);
    265      1.1  mrg       ref2 = i / SPECIAL_MAX == 0 ? 0 : randlimb ();
    266      1.1  mrg 
    267      1.1  mrg       inexa = testfunc (res1, ref2, ref3, MPFR_RNDA);
    268  1.1.1.4  mrg       r = MPFR_IS_POS (res1) ? MPFR_RNDU : MPFR_RNDD;
    269      1.1  mrg       inexd = testfunc (ref1, ref2, ref3, r);
    270      1.1  mrg 
    271      1.1  mrg       if (mpfr_compare (res1, ref1) || inexa != inexd)
    272      1.1  mrg         {
    273      1.1  mrg           printf ("Error with RNDA for %s for b=%u\n", foo, ref2);
    274      1.1  mrg           DISP2("a=", ref3);
    275      1.1  mrg           printf ("inexa=%d inexd=%d\n", inexa, inexd);
    276      1.1  mrg           DISP("expected ", ref1); DISP2(", got ", res1);
    277      1.1  mrg           exit (1);
    278      1.1  mrg         }
    279      1.1  mrg     }
    280      1.1  mrg 
    281      1.1  mrg   mpfr_clear (ref1);
    282      1.1  mrg   mpfr_clear (ref3);
    283      1.1  mrg   mpfr_clear (res1);
    284      1.1  mrg }
    285      1.1  mrg 
    286      1.1  mrg /* foo(mpfr_ptr, mpfr_srcptr, mp_rndt) */
    287      1.1  mrg static void
    288  1.1.1.2  mrg test2 (int (*testfunc)(mpfr_ptr, mpfr_srcptr, mpfr_rnd_t), const char *foo)
    289      1.1  mrg {
    290      1.1  mrg   mpfr_t ref1, ref2;
    291      1.1  mrg   mpfr_t res1;
    292      1.1  mrg   mpfr_prec_t p1, p2;
    293      1.1  mrg   int i, inexa, inexd;
    294      1.1  mrg   mpfr_rnd_t r;
    295      1.1  mrg 
    296      1.1  mrg   p1 = (randlimb () % 200) + MPFR_PREC_MIN;
    297      1.1  mrg   p2 = (randlimb () % 200) + MPFR_PREC_MIN;
    298      1.1  mrg 
    299      1.1  mrg   mpfr_init2 (ref1, p1);
    300      1.1  mrg   mpfr_init2 (ref2, p2);
    301      1.1  mrg   mpfr_init2 (res1, p1);
    302      1.1  mrg 
    303      1.1  mrg   for (i = 0; i < SPECIAL_MAX; i++)
    304      1.1  mrg     {
    305      1.1  mrg       set_special (ref2, i);
    306      1.1  mrg 
    307      1.1  mrg       /* first round to away */
    308      1.1  mrg       inexa = testfunc (res1, ref2, MPFR_RNDA);
    309      1.1  mrg 
    310  1.1.1.4  mrg       r = MPFR_IS_POS (res1) ? MPFR_RNDU : MPFR_RNDD;
    311      1.1  mrg       inexd = testfunc (ref1, ref2, r);
    312      1.1  mrg       if (mpfr_compare (res1, ref1) || inexa != inexd)
    313      1.1  mrg         {
    314      1.1  mrg           printf ("Error with RNDA for %s with ", foo);
    315      1.1  mrg           DISP2("x=", ref2);
    316      1.1  mrg           printf ("inexa=%d inexd=%d\n", inexa, inexd);
    317      1.1  mrg           DISP("expected ", ref1); DISP2(", got ", res1);
    318      1.1  mrg           exit (1);
    319      1.1  mrg         }
    320      1.1  mrg     }
    321      1.1  mrg 
    322      1.1  mrg   mpfr_clear (ref1);
    323      1.1  mrg   mpfr_clear (ref2);
    324      1.1  mrg   mpfr_clear (res1);
    325      1.1  mrg }
    326      1.1  mrg 
    327      1.1  mrg /* one operand, two results, like mpfr_sin_cos */
    328      1.1  mrg static void
    329  1.1.1.2  mrg test3a (int (*testfunc)(mpfr_ptr, mpfr_ptr, mpfr_srcptr, mpfr_rnd_t),
    330  1.1.1.2  mrg         const char *foo)
    331      1.1  mrg {
    332      1.1  mrg   mpfr_t ref1, ref2, ref3;
    333      1.1  mrg   mpfr_t res1, res2;
    334      1.1  mrg   mpfr_prec_t p1, p2, p3;
    335      1.1  mrg   int i, inexa, inexd;
    336      1.1  mrg   mpfr_rnd_t r;
    337      1.1  mrg 
    338      1.1  mrg   p1 = (randlimb () % 200) + MPFR_PREC_MIN;
    339      1.1  mrg   p2 = (randlimb () % 200) + MPFR_PREC_MIN;
    340      1.1  mrg   p3 = (randlimb () % 200) + MPFR_PREC_MIN;
    341      1.1  mrg 
    342      1.1  mrg   mpfr_init2 (ref1, p1);
    343      1.1  mrg   mpfr_init2 (ref2, p2);
    344      1.1  mrg   mpfr_init2 (ref3, p3);
    345      1.1  mrg   mpfr_init2 (res1, p1);
    346      1.1  mrg   mpfr_init2 (res2, p2);
    347      1.1  mrg 
    348      1.1  mrg   for (i = 0; i < SPECIAL_MAX; i++)
    349      1.1  mrg     {
    350      1.1  mrg       set_special (ref3, i);
    351      1.1  mrg 
    352      1.1  mrg       inexa = testfunc (res1, res2, ref3, MPFR_RNDA);
    353      1.1  mrg 
    354      1.1  mrg       /* first check wrt the first operand */
    355  1.1.1.4  mrg       r = MPFR_IS_POS (res1) ? MPFR_RNDU : MPFR_RNDD;
    356      1.1  mrg       inexd = testfunc (ref1, ref2, ref3, r);
    357      1.1  mrg       /* the low 2 bits of the inexact flag concern the 1st operand */
    358      1.1  mrg       if (mpfr_compare (res1, ref1) || (inexa & 3) != (inexd & 3))
    359      1.1  mrg         {
    360      1.1  mrg           printf ("Error with RNDA for %s (1st operand)\n", foo);
    361      1.1  mrg           DISP2("a=",ref3);
    362      1.1  mrg           DISP("expected ", ref1); printf ("\n");
    363      1.1  mrg           DISP("got      ", res1); printf ("\n");
    364      1.1  mrg           printf ("inexa=%d inexd=%d\n", inexa & 3, inexd & 3);
    365      1.1  mrg           exit (1);
    366      1.1  mrg         }
    367      1.1  mrg 
    368      1.1  mrg       /* now check wrt the second operand */
    369  1.1.1.4  mrg       r = MPFR_IS_POS (res2) ? MPFR_RNDU : MPFR_RNDD;
    370      1.1  mrg       inexd = testfunc (ref1, ref2, ref3, r);
    371      1.1  mrg       /* bits 2..3 of the inexact flag concern the 2nd operand */
    372      1.1  mrg       if (mpfr_compare (res2, ref2) || (inexa >> 2) != (inexd >> 2))
    373      1.1  mrg         {
    374      1.1  mrg           printf ("Error with RNDA for %s (2nd operand)\n", foo);
    375      1.1  mrg           DISP2("a=",ref3);
    376      1.1  mrg           DISP("expected ", ref2); printf ("\n");
    377      1.1  mrg           DISP("got      ", res2); printf ("\n");
    378      1.1  mrg           printf ("inexa=%d inexd=%d\n", inexa >> 2, inexd >> 2);
    379      1.1  mrg           exit (1);
    380      1.1  mrg         }
    381      1.1  mrg 
    382      1.1  mrg     }
    383      1.1  mrg 
    384      1.1  mrg   mpfr_clear (ref1);
    385      1.1  mrg   mpfr_clear (ref2);
    386      1.1  mrg   mpfr_clear (ref3);
    387      1.1  mrg   mpfr_clear (res1);
    388      1.1  mrg   mpfr_clear (res2);
    389      1.1  mrg }
    390      1.1  mrg 
    391      1.1  mrg int
    392      1.1  mrg main (void)
    393      1.1  mrg {
    394  1.1.1.2  mrg   int N = 20;
    395      1.1  mrg 
    396      1.1  mrg   tests_start_mpfr ();
    397      1.1  mrg 
    398      1.1  mrg   while (N--)
    399      1.1  mrg     {
    400      1.1  mrg       /* no need to test mpfr_round, mpfr_ceil, mpfr_floor, mpfr_trunc since
    401      1.1  mrg          they take no rounding mode */
    402      1.1  mrg 
    403      1.1  mrg       test2ui (mpfr_add_ui, "mpfr_add_ui");
    404      1.1  mrg       test2ui (mpfr_div_2exp, "mpfr_div_2exp");
    405  1.1.1.5  mrg       test2ui (mpfr_div_2ui, "mpfr_div_2ui");
    406      1.1  mrg       test2ui (mpfr_div_ui, "mpfr_div_ui");
    407      1.1  mrg       test2ui (mpfr_mul_2exp, "mpfr_mul_2exp");
    408  1.1.1.5  mrg       test2ui (mpfr_mul_2ui, "mpfr_mul_2ui");
    409      1.1  mrg       test2ui (mpfr_mul_ui, "mpfr_mul_ui");
    410      1.1  mrg       test2ui (mpfr_pow_ui, "mpfr_pow_ui");
    411      1.1  mrg       test2ui (mpfr_sub_ui, "mpfr_sub_ui");
    412      1.1  mrg 
    413      1.1  mrg       testui2 (mpfr_ui_div, "mpfr_ui_div");
    414      1.1  mrg       testui2 (mpfr_ui_sub, "mpfr_ui_sub");
    415      1.1  mrg       testui2 (mpfr_ui_pow, "mpfr_ui_pow");
    416      1.1  mrg 
    417      1.1  mrg       test2 (mpfr_sqr, "mpfr_sqr");
    418      1.1  mrg       test2 (mpfr_sqrt, "mpfr_sqrt");
    419      1.1  mrg       test2 (mpfr_abs, "mpfr_abs");
    420      1.1  mrg       test2 (mpfr_neg, "mpfr_neg");
    421      1.1  mrg 
    422      1.1  mrg       test2 (mpfr_log, "mpfr_log");
    423      1.1  mrg       test2 (mpfr_log2, "mpfr_log2");
    424      1.1  mrg       test2 (mpfr_log10, "mpfr_log10");
    425      1.1  mrg       test2 (mpfr_log1p, "mpfr_log1p");
    426      1.1  mrg 
    427      1.1  mrg       test2 (mpfr_exp, "mpfr_exp");
    428      1.1  mrg       test2 (mpfr_exp2, "mpfr_exp2");
    429      1.1  mrg       test2 (mpfr_exp10, "mpfr_exp10");
    430      1.1  mrg       test2 (mpfr_expm1, "mpfr_expm1");
    431      1.1  mrg       test2 (mpfr_eint, "mpfr_eint");
    432      1.1  mrg 
    433      1.1  mrg       test2 (mpfr_sinh, "mpfr_sinh");
    434      1.1  mrg       test2 (mpfr_cosh, "mpfr_cosh");
    435      1.1  mrg       test2 (mpfr_tanh, "mpfr_tanh");
    436      1.1  mrg       test2 (mpfr_asinh, "mpfr_asinh");
    437      1.1  mrg       test2 (mpfr_acosh, "mpfr_acosh");
    438      1.1  mrg       test2 (mpfr_atanh, "mpfr_atanh");
    439      1.1  mrg       test2 (mpfr_sech, "mpfr_sech");
    440      1.1  mrg       test2 (mpfr_csch, "mpfr_csch");
    441      1.1  mrg       test2 (mpfr_coth, "mpfr_coth");
    442      1.1  mrg 
    443      1.1  mrg       test2 (mpfr_asin, "mpfr_asin");
    444      1.1  mrg       test2 (mpfr_acos, "mpfr_acos");
    445      1.1  mrg       test2 (mpfr_atan, "mpfr_atan");
    446      1.1  mrg       test2 (mpfr_cos, "mpfr_cos");
    447      1.1  mrg       test2 (mpfr_sin, "mpfr_sin");
    448      1.1  mrg       test2 (mpfr_tan, "mpfr_tan");
    449      1.1  mrg       test2 (mpfr_sec, "mpfr_sec");
    450      1.1  mrg       test2 (mpfr_csc, "mpfr_csc");
    451      1.1  mrg       test2 (mpfr_cot, "mpfr_cot");
    452      1.1  mrg 
    453      1.1  mrg       test2 (mpfr_erf,  "mpfr_erf");
    454      1.1  mrg       test2 (mpfr_erfc, "mpfr_erfc");
    455      1.1  mrg       test2 (mpfr_j0,   "mpfr_j0");
    456      1.1  mrg       test2 (mpfr_j1,   "mpfr_j1");
    457      1.1  mrg       test2 (mpfr_y0,   "mpfr_y0");
    458      1.1  mrg       test2 (mpfr_y1,   "mpfr_y1");
    459      1.1  mrg       test2 (mpfr_zeta, "mpfr_zeta");
    460      1.1  mrg       test2 (mpfr_gamma, "mpfr_gamma");
    461      1.1  mrg       test2 (mpfr_lngamma, "mpfr_lngamma");
    462      1.1  mrg 
    463      1.1  mrg       test2 (mpfr_rint, "mpfr_rint");
    464      1.1  mrg       test2 (mpfr_rint_ceil, "mpfr_rint_ceil");
    465      1.1  mrg       test2 (mpfr_rint_floor, "mpfr_rint_floor");
    466      1.1  mrg       test2 (mpfr_rint_round, "mpfr_rint_round");
    467      1.1  mrg       test2 (mpfr_rint_trunc, "mpfr_rint_trunc");
    468      1.1  mrg       test2 (mpfr_frac, "mpfr_frac");
    469      1.1  mrg 
    470      1.1  mrg       test3 (mpfr_add, "mpfr_add");
    471      1.1  mrg       test3 (mpfr_sub, "mpfr_sub");
    472      1.1  mrg       test3 (mpfr_mul, "mpfr_mul");
    473      1.1  mrg       test3 (mpfr_div, "mpfr_div");
    474      1.1  mrg 
    475      1.1  mrg       test3 (mpfr_agm, "mpfr_agm");
    476      1.1  mrg       test3 (mpfr_min, "mpfr_min");
    477      1.1  mrg       test3 (mpfr_max, "mpfr_max");
    478      1.1  mrg 
    479      1.1  mrg       /* we don't test reldiff since it does not guarantee correct rounding,
    480      1.1  mrg          thus we can get different results with RNDA and RNDU or RNDD. */
    481      1.1  mrg       test3 (mpfr_dim, "mpfr_dim");
    482      1.1  mrg 
    483      1.1  mrg       test3 (mpfr_remainder, "mpfr_remainder");
    484      1.1  mrg       test3 (mpfr_pow, "mpfr_pow");
    485      1.1  mrg       test3 (mpfr_atan2, "mpfr_atan2");
    486      1.1  mrg       test3 (mpfr_hypot, "mpfr_hypot");
    487      1.1  mrg 
    488      1.1  mrg       test3a (mpfr_sin_cos, "mpfr_sin_cos");
    489      1.1  mrg 
    490      1.1  mrg       test4 (mpfr_fma, "mpfr_fma");
    491      1.1  mrg       test4 (mpfr_fms, "mpfr_fms");
    492      1.1  mrg 
    493      1.1  mrg       test2 (mpfr_li2, "mpfr_li2");
    494      1.1  mrg       test2 (mpfr_rec_sqrt, "mpfr_rec_sqrt");
    495      1.1  mrg       test3 (mpfr_fmod, "mpfr_fmod");
    496      1.1  mrg       test3a (mpfr_modf, "mpfr_modf");
    497      1.1  mrg       test3a (mpfr_sinh_cosh, "mpfr_sinh_cosh");
    498  1.1.1.4  mrg 
    499  1.1.1.4  mrg #if MPFR_VERSION >= MPFR_VERSION_NUM(3,0,0)
    500  1.1.1.4  mrg       test2 (mpfr_ai, "mpfr_ai");
    501  1.1.1.4  mrg       test2 (mpfr_digamma, "mpfr_digamma");
    502      1.1  mrg #endif
    503      1.1  mrg     }
    504      1.1  mrg 
    505      1.1  mrg   tests_end_mpfr ();
    506      1.1  mrg   return 0;
    507      1.1  mrg }
    508