Home | History | Annotate | Line # | Download | only in tests
tadd.c revision 1.1.1.5
      1      1.1  mrg /* Test file for mpfr_add and mpfr_sub.
      2      1.1  mrg 
      3  1.1.1.5  mrg Copyright 1999-2020 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.1.2  mrg #define N 30000
     24      1.1  mrg 
     25      1.1  mrg #include <float.h>
     26      1.1  mrg 
     27      1.1  mrg #include "mpfr-test.h"
     28      1.1  mrg 
     29      1.1  mrg /* If the precisions are the same, we want to test both mpfr_add1sp
     30      1.1  mrg    and mpfr_add1. */
     31      1.1  mrg 
     32  1.1.1.4  mrg /* FIXME: modify check() to test the ternary value and the flags. */
     33  1.1.1.4  mrg 
     34      1.1  mrg static int usesp;
     35      1.1  mrg 
     36      1.1  mrg static int
     37      1.1  mrg test_add (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode)
     38      1.1  mrg {
     39      1.1  mrg   int res;
     40      1.1  mrg #ifdef CHECK_EXTERNAL
     41      1.1  mrg   int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_number_p (c);
     42      1.1  mrg   if (ok)
     43      1.1  mrg     {
     44      1.1  mrg       mpfr_print_raw (b);
     45      1.1  mrg       printf (" ");
     46      1.1  mrg       mpfr_print_raw (c);
     47      1.1  mrg     }
     48      1.1  mrg #endif
     49      1.1  mrg   if (usesp || MPFR_ARE_SINGULAR(b,c) || MPFR_SIGN(b) != MPFR_SIGN(c))
     50      1.1  mrg     res = mpfr_add (a, b, c, rnd_mode);
     51      1.1  mrg   else
     52      1.1  mrg     {
     53      1.1  mrg       if (MPFR_GET_EXP(b) < MPFR_GET_EXP(c))
     54      1.1  mrg         res = mpfr_add1(a, c, b, rnd_mode);
     55      1.1  mrg       else
     56      1.1  mrg         res = mpfr_add1(a, b, c, rnd_mode);
     57      1.1  mrg     }
     58      1.1  mrg #ifdef CHECK_EXTERNAL
     59      1.1  mrg   if (ok)
     60      1.1  mrg     {
     61      1.1  mrg       printf (" ");
     62      1.1  mrg       mpfr_print_raw (a);
     63      1.1  mrg       printf ("\n");
     64      1.1  mrg     }
     65      1.1  mrg #endif
     66      1.1  mrg   return res;
     67      1.1  mrg }
     68      1.1  mrg 
     69      1.1  mrg /* checks that xs+ys gives the expected result zs */
     70      1.1  mrg static void
     71      1.1  mrg check (const char *xs, const char *ys, mpfr_rnd_t rnd_mode,
     72      1.1  mrg         unsigned int px, unsigned int py, unsigned int pz, const char *zs)
     73      1.1  mrg {
     74      1.1  mrg   mpfr_t xx,yy,zz;
     75      1.1  mrg 
     76      1.1  mrg   mpfr_init2 (xx, px);
     77      1.1  mrg   mpfr_init2 (yy, py);
     78      1.1  mrg   mpfr_init2 (zz, pz);
     79      1.1  mrg 
     80      1.1  mrg   mpfr_set_str1 (xx, xs);
     81      1.1  mrg   mpfr_set_str1 (yy, ys);
     82      1.1  mrg   test_add (zz, xx, yy, rnd_mode);
     83      1.1  mrg   if (mpfr_cmp_str1 (zz, zs) )
     84      1.1  mrg     {
     85      1.1  mrg       printf ("expected sum is %s, got ", zs);
     86  1.1.1.4  mrg       mpfr_out_str (stdout, 10, 0, zz, MPFR_RNDN);
     87  1.1.1.4  mrg       printf ("\nmpfr_add failed for x=%s y=%s with rnd_mode=%s\n",
     88      1.1  mrg               xs, ys, mpfr_print_rnd_mode (rnd_mode));
     89      1.1  mrg       exit (1);
     90      1.1  mrg     }
     91      1.1  mrg   mpfr_clears (xx, yy, zz, (mpfr_ptr) 0);
     92      1.1  mrg }
     93      1.1  mrg 
     94      1.1  mrg static void
     95      1.1  mrg check2b (const char *xs, int px,
     96      1.1  mrg          const char *ys, int py,
     97      1.1  mrg          const char *rs, int pz,
     98      1.1  mrg          mpfr_rnd_t rnd_mode)
     99      1.1  mrg {
    100      1.1  mrg   mpfr_t xx, yy, zz;
    101      1.1  mrg 
    102      1.1  mrg   mpfr_init2 (xx,px);
    103      1.1  mrg   mpfr_init2 (yy,py);
    104      1.1  mrg   mpfr_init2 (zz,pz);
    105      1.1  mrg   mpfr_set_str_binary (xx, xs);
    106      1.1  mrg   mpfr_set_str_binary (yy, ys);
    107      1.1  mrg   test_add (zz, xx, yy, rnd_mode);
    108      1.1  mrg   if (mpfr_cmp_str (zz, rs, 2, MPFR_RNDN))
    109      1.1  mrg     {
    110      1.1  mrg       printf ("(2) x=%s,%d y=%s,%d pz=%d,rnd=%s\n",
    111      1.1  mrg               xs, px, ys, py, pz, mpfr_print_rnd_mode (rnd_mode));
    112  1.1.1.4  mrg       printf ("got        "); mpfr_dump (zz);
    113      1.1  mrg       mpfr_set_str(zz, rs, 2, MPFR_RNDN);
    114  1.1.1.4  mrg       printf ("instead of "); mpfr_dump (zz);
    115      1.1  mrg       exit (1);
    116      1.1  mrg     }
    117      1.1  mrg   mpfr_clear(xx); mpfr_clear(yy); mpfr_clear(zz);
    118      1.1  mrg }
    119      1.1  mrg 
    120      1.1  mrg static void
    121      1.1  mrg check64 (void)
    122      1.1  mrg {
    123      1.1  mrg   mpfr_t x, t, u;
    124      1.1  mrg 
    125      1.1  mrg   mpfr_init (x);
    126      1.1  mrg   mpfr_init (t);
    127      1.1  mrg   mpfr_init (u);
    128      1.1  mrg 
    129      1.1  mrg   mpfr_set_prec (x, 29);
    130      1.1  mrg   mpfr_set_str_binary (x, "1.1101001000101111011010010110e-3");
    131      1.1  mrg   mpfr_set_prec (t, 58);
    132      1.1  mrg   mpfr_set_str_binary (t, "0.11100010011111001001100110010111110110011000000100101E-1");
    133      1.1  mrg   mpfr_set_prec (u, 29);
    134      1.1  mrg   test_add (u, x, t, MPFR_RNDD);
    135      1.1  mrg   mpfr_set_str_binary (t, "1.0101011100001000011100111110e-1");
    136      1.1  mrg   if (mpfr_cmp (u, t))
    137      1.1  mrg     {
    138      1.1  mrg       printf ("mpfr_add(u, x, t) failed for prec(x)=29, prec(t)=58\n");
    139      1.1  mrg       printf ("expected "); mpfr_out_str (stdout, 2, 29, t, MPFR_RNDN);
    140      1.1  mrg       puts ("");
    141      1.1  mrg       printf ("got      "); mpfr_out_str (stdout, 2, 29, u, MPFR_RNDN);
    142      1.1  mrg       puts ("");
    143      1.1  mrg       exit(1);
    144      1.1  mrg     }
    145      1.1  mrg 
    146      1.1  mrg   mpfr_set_prec (x, 4);
    147      1.1  mrg   mpfr_set_str_binary (x, "-1.0E-2");
    148      1.1  mrg   mpfr_set_prec (t, 2);
    149      1.1  mrg   mpfr_set_str_binary (t, "-1.1e-2");
    150      1.1  mrg   mpfr_set_prec (u, 2);
    151      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    152  1.1.1.5  mrg   if ((mp_limb_t) (MPFR_MANT(u)[0] << 2))
    153      1.1  mrg     {
    154      1.1  mrg       printf ("result not normalized for prec=2\n");
    155  1.1.1.4  mrg       mpfr_dump (u);
    156      1.1  mrg       exit (1);
    157      1.1  mrg     }
    158      1.1  mrg   mpfr_set_str_binary (t, "-1.0e-1");
    159      1.1  mrg   if (mpfr_cmp (u, t))
    160      1.1  mrg     {
    161      1.1  mrg       printf ("mpfr_add(u, x, t) failed for prec(x)=4, prec(t)=2\n");
    162      1.1  mrg       printf ("expected -1.0e-1\n");
    163      1.1  mrg       printf ("got      "); mpfr_out_str (stdout, 2, 4, u, MPFR_RNDN);
    164      1.1  mrg       puts ("");
    165      1.1  mrg       exit (1);
    166      1.1  mrg     }
    167      1.1  mrg 
    168      1.1  mrg   mpfr_set_prec (x, 8);
    169      1.1  mrg   mpfr_set_str_binary (x, "-0.10011010"); /* -77/128 */
    170      1.1  mrg   mpfr_set_prec (t, 4);
    171      1.1  mrg   mpfr_set_str_binary (t, "-1.110e-5"); /* -7/128 */
    172      1.1  mrg   mpfr_set_prec (u, 4);
    173      1.1  mrg   test_add (u, x, t, MPFR_RNDN); /* should give -5/8 */
    174      1.1  mrg   mpfr_set_str_binary (t, "-1.010e-1");
    175      1.1  mrg   if (mpfr_cmp (u, t)) {
    176      1.1  mrg     printf ("mpfr_add(u, x, t) failed for prec(x)=8, prec(t)=4\n");
    177      1.1  mrg     printf ("expected -1.010e-1\n");
    178      1.1  mrg     printf ("got      "); mpfr_out_str (stdout, 2, 4, u, MPFR_RNDN);
    179      1.1  mrg     puts ("");
    180      1.1  mrg     exit (1);
    181      1.1  mrg   }
    182      1.1  mrg 
    183      1.1  mrg   mpfr_set_prec (x, 112); mpfr_set_prec (t, 98); mpfr_set_prec (u, 54);
    184      1.1  mrg   mpfr_set_str_binary (x, "-0.11111100100000000011000011100000101101010001000111E-401");
    185      1.1  mrg   mpfr_set_str_binary (t, "0.10110000100100000101101100011111111011101000111000101E-464");
    186      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    187      1.1  mrg   if (mpfr_cmp (u, x))
    188      1.1  mrg     {
    189      1.1  mrg       printf ("mpfr_add(u, x, t) failed for prec(x)=112, prec(t)=98\n");
    190      1.1  mrg       exit (1);
    191      1.1  mrg     }
    192      1.1  mrg 
    193      1.1  mrg   mpfr_set_prec (x, 92); mpfr_set_prec (t, 86); mpfr_set_prec (u, 53);
    194      1.1  mrg   mpfr_set_str (x, "-5.03525136761487735093e-74", 10, MPFR_RNDN);
    195      1.1  mrg   mpfr_set_str (t, "8.51539046314262304109e-91", 10, MPFR_RNDN);
    196      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    197      1.1  mrg   if (mpfr_cmp_str1 (u, "-5.0352513676148773509283672e-74") )
    198      1.1  mrg     {
    199      1.1  mrg       printf ("mpfr_add(u, x, t) failed for prec(x)=92, prec(t)=86\n");
    200      1.1  mrg       exit (1);
    201      1.1  mrg     }
    202      1.1  mrg 
    203      1.1  mrg   mpfr_set_prec(x, 53); mpfr_set_prec(t, 76); mpfr_set_prec(u, 76);
    204      1.1  mrg   mpfr_set_str_binary(x, "-0.10010010001001011011110000000000001010011011011110001E-32");
    205      1.1  mrg   mpfr_set_str_binary(t, "-0.1011000101110010000101111111011111010001110011110111100110101011110010011111");
    206      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDU);
    207      1.1  mrg   mpfr_set_str_binary(t, "0.1011000101110010000101111111011100111111101010011011110110101011101000000100");
    208      1.1  mrg   if (mpfr_cmp(u,t))
    209      1.1  mrg     {
    210  1.1.1.4  mrg       printf ("expect "); mpfr_dump (t);
    211      1.1  mrg       printf ("mpfr_add failed for precisions 53-76\n");
    212      1.1  mrg       exit (1);
    213      1.1  mrg     }
    214      1.1  mrg   mpfr_set_prec(x, 53); mpfr_set_prec(t, 108); mpfr_set_prec(u, 108);
    215      1.1  mrg   mpfr_set_str_binary(x, "-0.10010010001001011011110000000000001010011011011110001E-32");
    216      1.1  mrg   mpfr_set_str_binary(t, "-0.101100010111001000010111111101111101000111001111011110011010101111001001111000111011001110011000000000111111");
    217      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDU);
    218      1.1  mrg   mpfr_set_str_binary(t, "0.101100010111001000010111111101110011111110101001101111011010101110100000001011000010101110011000000000111111");
    219      1.1  mrg   if (mpfr_cmp(u,t))
    220      1.1  mrg     {
    221  1.1.1.4  mrg       printf ("expect "); mpfr_dump (t);
    222      1.1  mrg       printf ("mpfr_add failed for precisions 53-108\n");
    223      1.1  mrg       exit (1);
    224      1.1  mrg     }
    225      1.1  mrg   mpfr_set_prec(x, 97); mpfr_set_prec(t, 97); mpfr_set_prec(u, 97);
    226      1.1  mrg   mpfr_set_str_binary(x, "0.1111101100001000000001011000110111101000001011111000100001000101010100011111110010000000000000000E-39");
    227      1.1  mrg   mpfr_set_ui(t, 1, MPFR_RNDN);
    228      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    229      1.1  mrg   mpfr_set_str_binary(x, "0.1000000000000000000000000000000000000000111110110000100000000101100011011110100000101111100010001E1");
    230      1.1  mrg   if (mpfr_cmp(u,x))
    231      1.1  mrg     {
    232      1.1  mrg       printf ("mpfr_add failed for precision 97\n");
    233      1.1  mrg       exit (1);
    234      1.1  mrg     }
    235      1.1  mrg   mpfr_set_prec(x, 128); mpfr_set_prec(t, 128); mpfr_set_prec(u, 128);
    236      1.1  mrg   mpfr_set_str_binary(x, "0.10101011111001001010111011001000101100111101000000111111111011010100001100011101010001010111111101111010100110111111100101100010E-4");
    237      1.1  mrg   mpfr_set(t, x, MPFR_RNDN);
    238      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDN);
    239      1.1  mrg   mpfr_set_prec(x, 96); mpfr_set_prec(t, 96); mpfr_set_prec(u, 96);
    240      1.1  mrg   mpfr_set_str_binary(x, "0.111000000001110100111100110101101001001010010011010011100111100011010100011001010011011011000010E-4");
    241      1.1  mrg   mpfr_set(t, x, MPFR_RNDN);
    242      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDN);
    243      1.1  mrg   mpfr_set_prec(x, 85); mpfr_set_prec(t, 85); mpfr_set_prec(u, 85);
    244      1.1  mrg   mpfr_set_str_binary(x, "0.1111101110100110110110100010101011101001100010100011110110110010010011101100101111100E-4");
    245      1.1  mrg   mpfr_set_str_binary(t, "0.1111101110100110110110100010101001001000011000111000011101100101110100001110101010110E-4");
    246      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDU);
    247      1.1  mrg   mpfr_sub(x, x, t, MPFR_RNDU);
    248      1.1  mrg   if (mpfr_cmp(x, u) != 0)
    249      1.1  mrg     {
    250      1.1  mrg       printf ("Error in mpfr_sub: u=x-t and x=x-t give different results\n");
    251      1.1  mrg       exit (1);
    252      1.1  mrg     }
    253  1.1.1.4  mrg   if (! MPFR_IS_NORMALIZED (u))
    254      1.1  mrg     {
    255      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (1)\n");
    256      1.1  mrg       exit (1);
    257      1.1  mrg     }
    258      1.1  mrg   mpfr_set_prec(x, 65); mpfr_set_prec(t, 65); mpfr_set_prec(u, 65);
    259      1.1  mrg   mpfr_set_str_binary(x, "0.10011010101000110101010000000011001001001110001011101011111011101E623");
    260      1.1  mrg   mpfr_set_str_binary(t, "0.10011010101000110101010000000011001001001110001011101011111011100E623");
    261      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDU);
    262      1.1  mrg   if (mpfr_cmp_ui_2exp(u, 1, 558))
    263      1.1  mrg     { /* 2^558 */
    264      1.1  mrg       printf ("Error (1) in mpfr_sub\n");
    265      1.1  mrg       exit (1);
    266      1.1  mrg     }
    267      1.1  mrg 
    268      1.1  mrg   mpfr_set_prec(x, 64); mpfr_set_prec(t, 64); mpfr_set_prec(u, 64);
    269      1.1  mrg   mpfr_set_str_binary(x, "0.1000011110101111011110111111000011101011101111101101101100000100E-220");
    270      1.1  mrg   mpfr_set_str_binary(t, "0.1000011110101111011110111111000011101011101111101101010011111101E-220");
    271      1.1  mrg   test_add (u, x, t, MPFR_RNDU);
    272      1.1  mrg   if ((MPFR_MANT(u)[0] & 1) != 1)
    273      1.1  mrg     {
    274      1.1  mrg       printf ("error in mpfr_add with rnd_mode=MPFR_RNDU\n");
    275  1.1.1.4  mrg       printf ("b=  "); mpfr_dump (x);
    276  1.1.1.4  mrg       printf ("c=  "); mpfr_dump (t);
    277  1.1.1.4  mrg       printf ("b+c="); mpfr_dump (u);
    278      1.1  mrg       exit (1);
    279      1.1  mrg     }
    280      1.1  mrg 
    281      1.1  mrg   /* bug found by Norbert Mueller, 14 Sep 2000 */
    282      1.1  mrg   mpfr_set_prec(x, 56); mpfr_set_prec(t, 83); mpfr_set_prec(u, 10);
    283      1.1  mrg   mpfr_set_str_binary(x, "0.10001001011011001111101100110100000101111010010111010111E-7");
    284      1.1  mrg   mpfr_set_str_binary(t, "0.10001001011011001111101100110100000101111010010111010111000000000111110110110000100E-7");
    285      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDU);
    286      1.1  mrg 
    287      1.1  mrg   /* array bound write found by Norbert Mueller, 26 Sep 2000 */
    288      1.1  mrg   mpfr_set_prec(x, 109); mpfr_set_prec(t, 153); mpfr_set_prec(u, 95);
    289      1.1  mrg   mpfr_set_str_binary(x,"0.1001010000101011101100111000110001111111111111111111111111111111111111111111111111111111111111100000000000000E33");
    290      1.1  mrg   mpfr_set_str_binary(t,"-0.100101000010101110110011100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011100101101000000100100001100110111E33");
    291      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    292      1.1  mrg 
    293      1.1  mrg   /* array bound writes found by Norbert Mueller, 27 Sep 2000 */
    294      1.1  mrg   mpfr_set_prec(x, 106); mpfr_set_prec(t, 53); mpfr_set_prec(u, 23);
    295      1.1  mrg   mpfr_set_str_binary(x, "-0.1000011110101111111001010001000100001011000000000000000000000000000000000000000000000000000000000000000000E-59");
    296      1.1  mrg   mpfr_set_str_binary(t, "-0.10000111101011111110010100010001101100011100110100000E-59");
    297      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDN);
    298      1.1  mrg   mpfr_set_prec(x, 177); mpfr_set_prec(t, 217); mpfr_set_prec(u, 160);
    299      1.1  mrg   mpfr_set_str_binary(x, "-0.111010001011010000111001001010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E35");
    300      1.1  mrg   mpfr_set_str_binary(t, "0.1110100010110100001110010010100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111011010011100001111001E35");
    301      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    302      1.1  mrg   mpfr_set_prec(x, 214); mpfr_set_prec(t, 278); mpfr_set_prec(u, 207);
    303      1.1  mrg   mpfr_set_str_binary(x, "0.1000100110100110101101101101000000010000100111000001001110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E66");
    304      1.1  mrg   mpfr_set_str_binary(t, "-0.10001001101001101011011011010000000100001001110000010011100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111011111001001100011E66");
    305      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    306      1.1  mrg   mpfr_set_prec(x, 32); mpfr_set_prec(t, 247); mpfr_set_prec(u, 223);
    307      1.1  mrg   mpfr_set_str_binary(x, "0.10000000000000000000000000000000E1");
    308      1.1  mrg   mpfr_set_str_binary(t, "0.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000110001110100000100011110000101110110011101110100110110111111011010111100100000000000000000000000000E0");
    309      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDN);
    310  1.1.1.4  mrg   if (! MPFR_IS_NORMALIZED (u))
    311      1.1  mrg     {
    312      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (2)\n");
    313      1.1  mrg       exit (1);
    314      1.1  mrg     }
    315      1.1  mrg 
    316      1.1  mrg   /* bug found by Nathalie Revol, 21 March 2001 */
    317      1.1  mrg   mpfr_set_prec (x, 65);
    318      1.1  mrg   mpfr_set_prec (t, 65);
    319      1.1  mrg   mpfr_set_prec (u, 65);
    320      1.1  mrg   mpfr_set_str_binary (x, "0.11100100101101001100111011111111110001101001000011101001001010010E-35");
    321      1.1  mrg   mpfr_set_str_binary (t, "0.10000000000000000000000000000000000001110010010110100110011110000E1");
    322      1.1  mrg   mpfr_sub (u, t, x, MPFR_RNDU);
    323  1.1.1.4  mrg   if (! MPFR_IS_NORMALIZED (u))
    324      1.1  mrg     {
    325      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (3)\n");
    326      1.1  mrg       exit (1);
    327      1.1  mrg     }
    328      1.1  mrg 
    329      1.1  mrg   /* bug found by Fabrice Rouillier, 27 Mar 2001 */
    330      1.1  mrg   mpfr_set_prec (x, 107);
    331      1.1  mrg   mpfr_set_prec (t, 107);
    332      1.1  mrg   mpfr_set_prec (u, 107);
    333      1.1  mrg   mpfr_set_str_binary (x, "0.10111001001111010010001000000010111111011011011101000001001000101000000000000000000000000000000000000000000E315");
    334      1.1  mrg   mpfr_set_str_binary (t, "0.10000000000000000000000000000000000101110100100101110110000001100101011111001000011101111100100100111011000E350");
    335      1.1  mrg   mpfr_sub (u, x, t, MPFR_RNDU);
    336  1.1.1.4  mrg   if (! MPFR_IS_NORMALIZED (u))
    337      1.1  mrg     {
    338      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (4)\n");
    339      1.1  mrg       exit (1);
    340      1.1  mrg     }
    341      1.1  mrg 
    342      1.1  mrg   /* checks that NaN flag is correctly reset */
    343      1.1  mrg   mpfr_set_ui (t, 1, MPFR_RNDN);
    344      1.1  mrg   mpfr_set_ui (u, 1, MPFR_RNDN);
    345      1.1  mrg   mpfr_set_nan (x);
    346      1.1  mrg   test_add (x, t, u, MPFR_RNDN);
    347      1.1  mrg   if (mpfr_cmp_ui (x, 2))
    348      1.1  mrg     {
    349      1.1  mrg       printf ("Error in mpfr_add: 1+1 gives ");
    350      1.1  mrg       mpfr_out_str(stdout, 10, 0, x, MPFR_RNDN);
    351      1.1  mrg       exit (1);
    352      1.1  mrg     }
    353      1.1  mrg 
    354      1.1  mrg   mpfr_clear(x); mpfr_clear(t); mpfr_clear(u);
    355      1.1  mrg }
    356      1.1  mrg 
    357      1.1  mrg /* check case when c does not overlap with a, but both b and c count
    358      1.1  mrg    for rounding */
    359      1.1  mrg static void
    360      1.1  mrg check_case_1b (void)
    361      1.1  mrg {
    362      1.1  mrg   mpfr_t a, b, c;
    363      1.1  mrg   unsigned int prec_a, prec_b, prec_c, dif;
    364      1.1  mrg 
    365      1.1  mrg   mpfr_init (a);
    366      1.1  mrg   mpfr_init (b);
    367      1.1  mrg   mpfr_init (c);
    368      1.1  mrg 
    369      1.1  mrg     {
    370      1.1  mrg       prec_a = MPFR_PREC_MIN + (randlimb () % 63);
    371      1.1  mrg       mpfr_set_prec (a, prec_a);
    372      1.1  mrg       for (prec_b = prec_a + 2; prec_b <= 64; prec_b++)
    373      1.1  mrg         {
    374      1.1  mrg           dif = prec_b - prec_a;
    375      1.1  mrg           mpfr_set_prec (b, prec_b);
    376      1.1  mrg           /* b = 1 - 2^(-prec_a) + 2^(-prec_b) */
    377      1.1  mrg           mpfr_set_ui (b, 1, MPFR_RNDN);
    378  1.1.1.5  mrg           mpfr_div_2ui (b, b, dif, MPFR_RNDN);
    379      1.1  mrg           mpfr_sub_ui (b, b, 1, MPFR_RNDN);
    380  1.1.1.5  mrg           mpfr_div_2ui (b, b, prec_a, MPFR_RNDN);
    381      1.1  mrg           mpfr_add_ui (b, b, 1, MPFR_RNDN);
    382      1.1  mrg           for (prec_c = dif; prec_c <= 64; prec_c++)
    383      1.1  mrg             {
    384      1.1  mrg               /* c = 2^(-prec_a) - 2^(-prec_b) */
    385      1.1  mrg               mpfr_set_prec (c, prec_c);
    386      1.1  mrg               mpfr_set_si (c, -1, MPFR_RNDN);
    387  1.1.1.5  mrg               mpfr_div_2ui (c, c, dif, MPFR_RNDN);
    388      1.1  mrg               mpfr_add_ui (c, c, 1, MPFR_RNDN);
    389  1.1.1.5  mrg               mpfr_div_2ui (c, c, prec_a, MPFR_RNDN);
    390      1.1  mrg               test_add (a, b, c, MPFR_RNDN);
    391      1.1  mrg               if (mpfr_cmp_ui (a, 1) != 0)
    392      1.1  mrg                 {
    393      1.1  mrg                   printf ("case (1b) failed for prec_a=%u, prec_b=%u,"
    394      1.1  mrg                           " prec_c=%u\n", prec_a, prec_b, prec_c);
    395  1.1.1.4  mrg                   printf ("b="); mpfr_dump (b);
    396  1.1.1.4  mrg                   printf ("c="); mpfr_dump (c);
    397  1.1.1.4  mrg                   printf ("a="); mpfr_dump (a);
    398      1.1  mrg                   exit (1);
    399      1.1  mrg                 }
    400      1.1  mrg             }
    401      1.1  mrg         }
    402      1.1  mrg     }
    403      1.1  mrg 
    404      1.1  mrg   mpfr_clear (a);
    405      1.1  mrg   mpfr_clear (b);
    406      1.1  mrg   mpfr_clear (c);
    407      1.1  mrg }
    408      1.1  mrg 
    409      1.1  mrg /* check case when c overlaps with a */
    410      1.1  mrg static void
    411      1.1  mrg check_case_2 (void)
    412      1.1  mrg {
    413      1.1  mrg   mpfr_t a, b, c, d;
    414      1.1  mrg 
    415      1.1  mrg   mpfr_init2 (a, 300);
    416      1.1  mrg   mpfr_init2 (b, 800);
    417      1.1  mrg   mpfr_init2 (c, 500);
    418      1.1  mrg   mpfr_init2 (d, 800);
    419      1.1  mrg 
    420      1.1  mrg   mpfr_set_str_binary(a, "1E110");  /* a = 2^110 */
    421      1.1  mrg   mpfr_set_str_binary(b, "1E900");  /* b = 2^900 */
    422      1.1  mrg   mpfr_set_str_binary(c, "1E500");  /* c = 2^500 */
    423      1.1  mrg   test_add (c, c, a, MPFR_RNDZ);   /* c = 2^500 + 2^110 */
    424      1.1  mrg   mpfr_sub (d, b, c, MPFR_RNDZ);   /* d = 2^900 - 2^500 - 2^110 */
    425      1.1  mrg   test_add (b, b, c, MPFR_RNDZ);   /* b = 2^900 + 2^500 + 2^110 */
    426      1.1  mrg   test_add (a, b, d, MPFR_RNDZ);   /* a = 2^901 */
    427      1.1  mrg   if (mpfr_cmp_ui_2exp (a, 1, 901))
    428      1.1  mrg     {
    429      1.1  mrg       printf ("b + d fails for b=2^900+2^500+2^110, d=2^900-2^500-2^110\n");
    430      1.1  mrg       printf ("expected 1.0e901, got ");
    431      1.1  mrg       mpfr_out_str (stdout, 2, 0, a, MPFR_RNDN);
    432      1.1  mrg       printf ("\n");
    433      1.1  mrg       exit (1);
    434      1.1  mrg     }
    435      1.1  mrg 
    436      1.1  mrg   mpfr_clear (a);
    437      1.1  mrg   mpfr_clear (b);
    438      1.1  mrg   mpfr_clear (c);
    439      1.1  mrg   mpfr_clear (d);
    440      1.1  mrg }
    441      1.1  mrg 
    442      1.1  mrg /* checks when source and destination are equal */
    443      1.1  mrg static void
    444      1.1  mrg check_same (void)
    445      1.1  mrg {
    446      1.1  mrg   mpfr_t x;
    447      1.1  mrg 
    448      1.1  mrg   mpfr_init(x); mpfr_set_ui(x, 1, MPFR_RNDZ);
    449      1.1  mrg   test_add (x, x, x, MPFR_RNDZ);
    450      1.1  mrg   if (mpfr_cmp_ui (x, 2))
    451      1.1  mrg     {
    452      1.1  mrg       printf ("Error when all 3 operands are equal\n");
    453      1.1  mrg       exit (1);
    454      1.1  mrg     }
    455      1.1  mrg   mpfr_clear(x);
    456      1.1  mrg }
    457      1.1  mrg 
    458      1.1  mrg #define check53(x, y, r, z) check(x, y, r, 53, 53, 53, z)
    459      1.1  mrg 
    460      1.1  mrg #define MAX_PREC 256
    461      1.1  mrg 
    462      1.1  mrg static void
    463      1.1  mrg check_inexact (void)
    464      1.1  mrg {
    465      1.1  mrg   mpfr_t x, y, z, u;
    466      1.1  mrg   mpfr_prec_t px, py, pu, pz;
    467      1.1  mrg   int inexact, cmp;
    468      1.1  mrg   mpfr_rnd_t rnd;
    469      1.1  mrg 
    470      1.1  mrg   mpfr_init (x);
    471      1.1  mrg   mpfr_init (y);
    472      1.1  mrg   mpfr_init (z);
    473      1.1  mrg   mpfr_init (u);
    474      1.1  mrg 
    475      1.1  mrg   mpfr_set_prec (x, 2);
    476      1.1  mrg   mpfr_set_str_binary (x, "0.1E-4");
    477      1.1  mrg   mpfr_set_prec (u, 33);
    478      1.1  mrg   mpfr_set_str_binary (u, "0.101110100101101100000000111100000E-1");
    479      1.1  mrg   mpfr_set_prec (y, 31);
    480  1.1.1.4  mrg   inexact = test_add (y, x, u, MPFR_RNDN);
    481  1.1.1.4  mrg 
    482  1.1.1.4  mrg   if (inexact != 0)
    483      1.1  mrg     {
    484  1.1.1.4  mrg       printf ("Wrong ternary value (2): expected 0, got %d\n", inexact);
    485      1.1  mrg       exit (1);
    486      1.1  mrg     }
    487      1.1  mrg 
    488      1.1  mrg   mpfr_set_prec (x, 2);
    489      1.1  mrg   mpfr_set_str_binary (x, "0.1E-4");
    490      1.1  mrg   mpfr_set_prec (u, 33);
    491      1.1  mrg   mpfr_set_str_binary (u, "0.101110100101101100000000111100000E-1");
    492      1.1  mrg   mpfr_set_prec (y, 28);
    493  1.1.1.4  mrg   inexact = test_add (y, x, u, MPFR_RNDN);
    494  1.1.1.4  mrg 
    495  1.1.1.4  mrg   if (inexact != 0)
    496      1.1  mrg     {
    497  1.1.1.4  mrg       printf ("Wrong ternary value (1): expected 0, got %d\n", inexact);
    498      1.1  mrg       exit (1);
    499      1.1  mrg     }
    500      1.1  mrg 
    501  1.1.1.4  mrg   for (px = 2; px < MAX_PREC; px++)
    502      1.1  mrg     {
    503      1.1  mrg       mpfr_set_prec (x, px);
    504  1.1.1.4  mrg 
    505      1.1  mrg       do
    506      1.1  mrg         {
    507      1.1  mrg           mpfr_urandomb (x, RANDS);
    508      1.1  mrg         }
    509      1.1  mrg       while (mpfr_cmp_ui (x, 0) == 0);
    510  1.1.1.4  mrg 
    511  1.1.1.4  mrg       for (pu = 2; pu < MAX_PREC; pu++)
    512      1.1  mrg         {
    513      1.1  mrg           mpfr_set_prec (u, pu);
    514  1.1.1.4  mrg 
    515      1.1  mrg           do
    516      1.1  mrg             {
    517      1.1  mrg               mpfr_urandomb (u, RANDS);
    518      1.1  mrg             }
    519      1.1  mrg           while (mpfr_cmp_ui (u, 0) == 0);
    520  1.1.1.4  mrg 
    521  1.1.1.4  mrg           py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - 1));
    522  1.1.1.4  mrg           mpfr_set_prec (y, py);
    523  1.1.1.4  mrg           pz = mpfr_cmpabs (x, u) >= 0 ?
    524  1.1.1.4  mrg             MPFR_EXP(x) - MPFR_EXP(u) :
    525  1.1.1.4  mrg             MPFR_EXP(u) - MPFR_EXP(x);
    526  1.1.1.4  mrg           /* x + u is exactly representable with precision
    527  1.1.1.4  mrg              abs(EXP(x)-EXP(u)) + max(prec(x), prec(u)) + 1 */
    528  1.1.1.4  mrg           pz = pz + MAX(MPFR_PREC(x), MPFR_PREC(u)) + 1;
    529  1.1.1.4  mrg           mpfr_set_prec (z, pz);
    530  1.1.1.4  mrg 
    531  1.1.1.4  mrg           rnd = RND_RAND_NO_RNDF ();
    532  1.1.1.4  mrg           inexact = test_add (z, x, u, rnd);
    533  1.1.1.4  mrg           if (inexact != 0)
    534  1.1.1.4  mrg             {
    535  1.1.1.4  mrg               printf ("z <- x + u should be exact\n");
    536  1.1.1.4  mrg               printf ("x="); mpfr_dump (x);
    537  1.1.1.4  mrg               printf ("u="); mpfr_dump (u);
    538  1.1.1.4  mrg               printf ("z="); mpfr_dump (z);
    539  1.1.1.4  mrg               exit (1);
    540  1.1.1.4  mrg             }
    541  1.1.1.4  mrg 
    542  1.1.1.4  mrg           rnd = RND_RAND_NO_RNDF ();
    543  1.1.1.4  mrg           inexact = test_add (y, x, u, rnd);
    544  1.1.1.4  mrg           cmp = mpfr_cmp (y, z);
    545  1.1.1.4  mrg           if ((inexact == 0 && cmp != 0) ||
    546  1.1.1.4  mrg               (inexact > 0 && cmp <= 0) ||
    547  1.1.1.4  mrg               (inexact < 0 && cmp >= 0))
    548  1.1.1.4  mrg             {
    549  1.1.1.4  mrg               printf ("Wrong ternary value for rnd=%s\n",
    550  1.1.1.4  mrg                       mpfr_print_rnd_mode (rnd));
    551  1.1.1.4  mrg               printf ("expected %d, got %d\n", cmp, inexact);
    552  1.1.1.4  mrg               printf ("x="); mpfr_dump (x);
    553  1.1.1.4  mrg               printf ("u="); mpfr_dump (u);
    554  1.1.1.4  mrg               printf ("y=  "); mpfr_dump (y);
    555  1.1.1.4  mrg               printf ("x+u="); mpfr_dump (z);
    556  1.1.1.4  mrg               exit (1);
    557      1.1  mrg             }
    558      1.1  mrg         }
    559      1.1  mrg     }
    560      1.1  mrg 
    561      1.1  mrg   mpfr_clear (x);
    562      1.1  mrg   mpfr_clear (y);
    563      1.1  mrg   mpfr_clear (z);
    564      1.1  mrg   mpfr_clear (u);
    565      1.1  mrg }
    566      1.1  mrg 
    567      1.1  mrg static void
    568      1.1  mrg check_nans (void)
    569      1.1  mrg {
    570      1.1  mrg   mpfr_t  s, x, y;
    571      1.1  mrg 
    572      1.1  mrg   mpfr_init2 (x, 8L);
    573      1.1  mrg   mpfr_init2 (y, 8L);
    574      1.1  mrg   mpfr_init2 (s, 8L);
    575      1.1  mrg 
    576      1.1  mrg   /* +inf + -inf == nan */
    577      1.1  mrg   mpfr_set_inf (x, 1);
    578      1.1  mrg   mpfr_set_inf (y, -1);
    579      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    580      1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (s));
    581      1.1  mrg 
    582      1.1  mrg   /* +inf + 1 == +inf */
    583      1.1  mrg   mpfr_set_inf (x, 1);
    584      1.1  mrg   mpfr_set_ui (y, 1L, MPFR_RNDN);
    585      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    586      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    587      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) > 0);
    588      1.1  mrg 
    589      1.1  mrg   /* -inf + 1 == -inf */
    590      1.1  mrg   mpfr_set_inf (x, -1);
    591      1.1  mrg   mpfr_set_ui (y, 1L, MPFR_RNDN);
    592      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    593      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    594      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) < 0);
    595      1.1  mrg 
    596      1.1  mrg   /* 1 + +inf == +inf */
    597      1.1  mrg   mpfr_set_ui (x, 1L, MPFR_RNDN);
    598      1.1  mrg   mpfr_set_inf (y, 1);
    599      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    600      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    601      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) > 0);
    602      1.1  mrg 
    603      1.1  mrg   /* 1 + -inf == -inf */
    604      1.1  mrg   mpfr_set_ui (x, 1L, MPFR_RNDN);
    605      1.1  mrg   mpfr_set_inf (y, -1);
    606      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    607      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    608      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) < 0);
    609      1.1  mrg 
    610      1.1  mrg   mpfr_clear (x);
    611      1.1  mrg   mpfr_clear (y);
    612      1.1  mrg   mpfr_clear (s);
    613      1.1  mrg }
    614      1.1  mrg 
    615      1.1  mrg static void
    616      1.1  mrg check_alloc (void)
    617      1.1  mrg {
    618      1.1  mrg   mpfr_t a;
    619      1.1  mrg 
    620      1.1  mrg   mpfr_init2 (a, 10000);
    621      1.1  mrg   mpfr_set_prec (a, 53);
    622      1.1  mrg   mpfr_set_ui (a, 15236, MPFR_RNDN);
    623      1.1  mrg   test_add (a, a, a, MPFR_RNDN);
    624      1.1  mrg   mpfr_mul (a, a, a, MPFR_RNDN);
    625      1.1  mrg   mpfr_div (a, a, a, MPFR_RNDN);
    626      1.1  mrg   mpfr_sub (a, a, a, MPFR_RNDN);
    627      1.1  mrg   mpfr_clear (a);
    628      1.1  mrg }
    629      1.1  mrg 
    630      1.1  mrg static void
    631      1.1  mrg check_overflow (void)
    632      1.1  mrg {
    633      1.1  mrg   mpfr_t a, b, c;
    634  1.1.1.4  mrg   mpfr_prec_t prec_a, prec_b, prec_c;
    635  1.1.1.4  mrg   int r, up;
    636      1.1  mrg 
    637  1.1.1.4  mrg   mpfr_init (a);
    638  1.1.1.4  mrg   mpfr_init (b);
    639  1.1.1.4  mrg   mpfr_init (c);
    640      1.1  mrg 
    641  1.1.1.4  mrg   RND_LOOP_NO_RNDF (r)
    642  1.1.1.4  mrg     for (prec_a = 2; prec_a <= 128; prec_a += 2)
    643  1.1.1.4  mrg       for (prec_b = 2; prec_b <= 128; prec_b += 2)
    644  1.1.1.4  mrg         for (prec_c = 2; prec_c <= 128; prec_c += 2)
    645      1.1  mrg           {
    646  1.1.1.4  mrg             mpfr_set_prec (a, prec_a);
    647  1.1.1.4  mrg             mpfr_set_prec (b, prec_b);
    648  1.1.1.4  mrg             mpfr_set_prec (c, prec_c);
    649  1.1.1.4  mrg 
    650  1.1.1.4  mrg             mpfr_setmax (b, mpfr_get_emax ());
    651  1.1.1.4  mrg 
    652  1.1.1.4  mrg             up = r == MPFR_RNDA || r == MPFR_RNDU || r == MPFR_RNDN;
    653  1.1.1.4  mrg 
    654  1.1.1.4  mrg             /* set c with overlap with bits of b: will always overflow */
    655  1.1.1.4  mrg             mpfr_set_ui_2exp (c, 1, mpfr_get_emax () - prec_b / 2, MPFR_RNDN);
    656  1.1.1.4  mrg             mpfr_nextbelow (c);
    657  1.1.1.4  mrg             mpfr_clear_overflow ();
    658  1.1.1.4  mrg             test_add (a, b, c, (mpfr_rnd_t) r);
    659  1.1.1.4  mrg             if (!mpfr_overflow_p () || (up && !mpfr_inf_p (a)))
    660  1.1.1.4  mrg               {
    661  1.1.1.4  mrg                 printf ("No overflow (1) in check_overflow for rnd=%s\n",
    662  1.1.1.4  mrg                         mpfr_print_rnd_mode ((mpfr_rnd_t) r));
    663  1.1.1.4  mrg                 printf ("b="); mpfr_dump (b);
    664  1.1.1.4  mrg                 printf ("c="); mpfr_dump (c);
    665  1.1.1.4  mrg                 printf ("a="); mpfr_dump (a);
    666  1.1.1.4  mrg                 exit (1);
    667  1.1.1.4  mrg               }
    668  1.1.1.4  mrg 
    669  1.1.1.4  mrg             if (r == MPFR_RNDZ || r == MPFR_RNDD || prec_a >= prec_b + prec_c)
    670  1.1.1.4  mrg               continue;
    671  1.1.1.4  mrg 
    672  1.1.1.4  mrg             /* set c to 111...111 so that ufp(c) = 1/2 ulp(b): will only overflow
    673  1.1.1.4  mrg                when prec_a < prec_b + prec_c, and rounding up or to nearest */
    674  1.1.1.4  mrg             mpfr_set_ui_2exp (c, 1, mpfr_get_emax () - prec_b, MPFR_RNDN);
    675  1.1.1.4  mrg             mpfr_nextbelow (c);
    676  1.1.1.4  mrg             mpfr_clear_overflow ();
    677  1.1.1.4  mrg             test_add (a, b, c, (mpfr_rnd_t) r);
    678  1.1.1.4  mrg             /* b + c is exactly representable iff prec_a >= prec_b + prec_c */
    679  1.1.1.4  mrg             if (!mpfr_overflow_p () || !mpfr_inf_p (a))
    680  1.1.1.4  mrg               {
    681  1.1.1.4  mrg                 printf ("No overflow (2) in check_overflow for rnd=%s\n",
    682  1.1.1.4  mrg                         mpfr_print_rnd_mode ((mpfr_rnd_t) r));
    683  1.1.1.4  mrg                 printf ("b="); mpfr_dump (b);
    684  1.1.1.4  mrg                 printf ("c="); mpfr_dump (c);
    685  1.1.1.4  mrg                 printf ("a="); mpfr_dump (a);
    686  1.1.1.4  mrg                 exit (1);
    687  1.1.1.4  mrg               }
    688      1.1  mrg           }
    689      1.1  mrg 
    690  1.1.1.4  mrg   mpfr_set_prec (b, 256);
    691  1.1.1.4  mrg   mpfr_setmax (b, mpfr_get_emax ());
    692  1.1.1.4  mrg   mpfr_set_prec (c, 256);
    693  1.1.1.4  mrg   mpfr_set_ui (c, 1, MPFR_RNDN);
    694      1.1  mrg   mpfr_set_exp (c, mpfr_get_emax () - 512);
    695      1.1  mrg   mpfr_set_prec (a, 256);
    696      1.1  mrg   mpfr_clear_overflow ();
    697  1.1.1.4  mrg   mpfr_add (a, b, c, MPFR_RNDU);
    698      1.1  mrg   if (!mpfr_overflow_p ())
    699      1.1  mrg     {
    700  1.1.1.4  mrg       printf ("No overflow (3) in check_overflow\n");
    701  1.1.1.4  mrg       printf ("b="); mpfr_dump (b);
    702  1.1.1.4  mrg       printf ("c="); mpfr_dump (c);
    703  1.1.1.4  mrg       printf ("a="); mpfr_dump (a);
    704      1.1  mrg       exit (1);
    705      1.1  mrg     }
    706      1.1  mrg 
    707      1.1  mrg   mpfr_clear (a);
    708      1.1  mrg   mpfr_clear (b);
    709      1.1  mrg   mpfr_clear (c);
    710      1.1  mrg }
    711      1.1  mrg 
    712      1.1  mrg static void
    713      1.1  mrg check_1111 (void)
    714      1.1  mrg {
    715      1.1  mrg   mpfr_t one;
    716      1.1  mrg   long n;
    717      1.1  mrg 
    718      1.1  mrg   mpfr_init2 (one, MPFR_PREC_MIN);
    719      1.1  mrg   mpfr_set_ui (one, 1, MPFR_RNDN);
    720  1.1.1.2  mrg   for (n = 0; n < N; n++)
    721      1.1  mrg     {
    722      1.1  mrg       mpfr_prec_t prec_a, prec_b, prec_c;
    723      1.1  mrg       mpfr_exp_t tb=0, tc, diff;
    724      1.1  mrg       mpfr_t a, b, c, s;
    725      1.1  mrg       int m = 512;
    726      1.1  mrg       int sb, sc;
    727      1.1  mrg       int inex_a, inex_s;
    728      1.1  mrg       mpfr_rnd_t rnd_mode;
    729      1.1  mrg 
    730      1.1  mrg       prec_a = MPFR_PREC_MIN + (randlimb () % m);
    731      1.1  mrg       prec_b = MPFR_PREC_MIN + (randlimb () % m);
    732  1.1.1.4  mrg       /* we need prec_c > 1 so that % (prec_c - 1) is well defined below */
    733  1.1.1.4  mrg       do prec_c = MPFR_PREC_MIN + (randlimb () % m); while (prec_c == 1);
    734      1.1  mrg       mpfr_init2 (a, prec_a);
    735      1.1  mrg       mpfr_init2 (b, prec_b);
    736      1.1  mrg       mpfr_init2 (c, prec_c);
    737  1.1.1.4  mrg       /* we need prec_b - (sb != 2) > 0 below */
    738  1.1.1.4  mrg       do sb = randlimb () % 3; while (prec_b - (sb != 2) == 0);
    739      1.1  mrg       if (sb != 0)
    740      1.1  mrg         {
    741      1.1  mrg           tb = 1 + (randlimb () % (prec_b - (sb != 2)));
    742      1.1  mrg           mpfr_div_2ui (b, one, tb, MPFR_RNDN);
    743      1.1  mrg           if (sb == 2)
    744      1.1  mrg             mpfr_neg (b, b, MPFR_RNDN);
    745      1.1  mrg           test_add (b, b, one, MPFR_RNDN);
    746      1.1  mrg         }
    747      1.1  mrg       else
    748      1.1  mrg         mpfr_set (b, one, MPFR_RNDN);
    749      1.1  mrg       tc = 1 + (randlimb () % (prec_c - 1));
    750      1.1  mrg       mpfr_div_2ui (c, one, tc, MPFR_RNDN);
    751      1.1  mrg       sc = randlimb () % 2;
    752      1.1  mrg       if (sc)
    753      1.1  mrg         mpfr_neg (c, c, MPFR_RNDN);
    754      1.1  mrg       test_add (c, c, one, MPFR_RNDN);
    755      1.1  mrg       diff = (randlimb () % (2*m)) - m;
    756      1.1  mrg       mpfr_mul_2si (c, c, diff, MPFR_RNDN);
    757  1.1.1.4  mrg       rnd_mode = RND_RAND_NO_RNDF ();
    758      1.1  mrg       inex_a = test_add (a, b, c, rnd_mode);
    759      1.1  mrg       mpfr_init2 (s, MPFR_PREC_MIN + 2*m);
    760      1.1  mrg       inex_s = test_add (s, b, c, MPFR_RNDN); /* exact */
    761      1.1  mrg       if (inex_s)
    762      1.1  mrg         {
    763      1.1  mrg           printf ("check_1111: result should have been exact.\n");
    764      1.1  mrg           exit (1);
    765      1.1  mrg         }
    766      1.1  mrg       inex_s = mpfr_prec_round (s, prec_a, rnd_mode);
    767      1.1  mrg       if ((inex_a < 0 && inex_s >= 0) ||
    768      1.1  mrg           (inex_a == 0 && inex_s != 0) ||
    769      1.1  mrg           (inex_a > 0 && inex_s <= 0) ||
    770      1.1  mrg           !mpfr_equal_p (a, s))
    771      1.1  mrg         {
    772      1.1  mrg           printf ("check_1111: results are different.\n");
    773      1.1  mrg           printf ("prec_a = %d, prec_b = %d, prec_c = %d\n",
    774      1.1  mrg                   (int) prec_a, (int) prec_b, (int) prec_c);
    775      1.1  mrg           printf ("tb = %d, tc = %d, diff = %d, rnd = %s\n",
    776      1.1  mrg                   (int) tb, (int) tc, (int) diff,
    777      1.1  mrg                   mpfr_print_rnd_mode (rnd_mode));
    778      1.1  mrg           printf ("sb = %d, sc = %d\n", sb, sc);
    779  1.1.1.5  mrg           printf ("b = "); mpfr_dump (b);
    780  1.1.1.5  mrg           printf ("c = "); mpfr_dump (c);
    781  1.1.1.4  mrg           printf ("a = "); mpfr_dump (a);
    782  1.1.1.4  mrg           printf ("s = "); mpfr_dump (s);
    783      1.1  mrg           printf ("inex_a = %d, inex_s = %d\n", inex_a, inex_s);
    784      1.1  mrg           exit (1);
    785      1.1  mrg         }
    786      1.1  mrg       mpfr_clear (a);
    787      1.1  mrg       mpfr_clear (b);
    788      1.1  mrg       mpfr_clear (c);
    789      1.1  mrg       mpfr_clear (s);
    790      1.1  mrg     }
    791      1.1  mrg   mpfr_clear (one);
    792      1.1  mrg }
    793      1.1  mrg 
    794      1.1  mrg static void
    795      1.1  mrg check_1minuseps (void)
    796      1.1  mrg {
    797      1.1  mrg   static mpfr_prec_t prec_a[] = {
    798      1.1  mrg     MPFR_PREC_MIN, 30, 31, 32, 33, 62, 63, 64, 65, 126, 127, 128, 129
    799      1.1  mrg   };
    800      1.1  mrg   static int supp_b[] = {
    801      1.1  mrg     0, 1, 2, 3, 4, 29, 30, 31, 32, 33, 34, 35, 61, 62, 63, 64, 65, 66, 67
    802      1.1  mrg   };
    803      1.1  mrg   mpfr_t a, b, c;
    804      1.1  mrg   unsigned int ia, ib, ic;
    805      1.1  mrg 
    806      1.1  mrg   mpfr_init2 (c, MPFR_PREC_MIN);
    807      1.1  mrg 
    808      1.1  mrg   for (ia = 0; ia < numberof (prec_a); ia++)
    809  1.1.1.4  mrg     for (ib = 0; ib < numberof (supp_b); ib++)
    810      1.1  mrg       {
    811      1.1  mrg         mpfr_prec_t prec_b;
    812      1.1  mrg         int rnd_mode;
    813      1.1  mrg 
    814      1.1  mrg         prec_b = prec_a[ia] + supp_b[ib];
    815      1.1  mrg 
    816      1.1  mrg         mpfr_init2 (a, prec_a[ia]);
    817      1.1  mrg         mpfr_init2 (b, prec_b);
    818      1.1  mrg 
    819      1.1  mrg         mpfr_set_ui (c, 1, MPFR_RNDN);
    820      1.1  mrg         mpfr_div_ui (b, c, prec_a[ia], MPFR_RNDN);
    821      1.1  mrg         mpfr_sub (b, c, b, MPFR_RNDN);  /* b = 1 - 2^(-prec_a) */
    822      1.1  mrg 
    823  1.1.1.4  mrg         for (ic = 0; ic < numberof (supp_b); ic++)
    824      1.1  mrg           for (rnd_mode = 0; rnd_mode < MPFR_RND_MAX; rnd_mode++)
    825      1.1  mrg             {
    826      1.1  mrg               mpfr_t s;
    827      1.1  mrg               int inex_a, inex_s;
    828      1.1  mrg 
    829  1.1.1.4  mrg               if (rnd_mode == MPFR_RNDF)
    830  1.1.1.4  mrg                 continue; /* inex_a, inex_s make no sense */
    831  1.1.1.4  mrg 
    832      1.1  mrg               mpfr_set_ui (c, 1, MPFR_RNDN);
    833      1.1  mrg               mpfr_div_ui (c, c, prec_a[ia] + supp_b[ic], MPFR_RNDN);
    834      1.1  mrg               inex_a = test_add (a, b, c, (mpfr_rnd_t) rnd_mode);
    835      1.1  mrg               mpfr_init2 (s, 256);
    836      1.1  mrg               inex_s = test_add (s, b, c, MPFR_RNDN); /* exact */
    837      1.1  mrg               if (inex_s)
    838      1.1  mrg                 {
    839      1.1  mrg                   printf ("check_1minuseps: result should have been exact "
    840      1.1  mrg                           "(ia = %u, ib = %u, ic = %u)\n", ia, ib, ic);
    841      1.1  mrg                   exit (1);
    842      1.1  mrg                 }
    843      1.1  mrg               inex_s = mpfr_prec_round (s, prec_a[ia], (mpfr_rnd_t) rnd_mode);
    844      1.1  mrg               if ((inex_a < 0 && inex_s >= 0) ||
    845      1.1  mrg                   (inex_a == 0 && inex_s != 0) ||
    846      1.1  mrg                   (inex_a > 0 && inex_s <= 0) ||
    847      1.1  mrg                   !mpfr_equal_p (a, s))
    848      1.1  mrg                 {
    849      1.1  mrg                   printf ("check_1minuseps: results are different.\n");
    850      1.1  mrg                   printf ("ia = %u, ib = %u, ic = %u\n", ia, ib, ic);
    851      1.1  mrg                   exit (1);
    852      1.1  mrg                 }
    853      1.1  mrg               mpfr_clear (s);
    854      1.1  mrg             }
    855      1.1  mrg 
    856      1.1  mrg         mpfr_clear (a);
    857      1.1  mrg         mpfr_clear (b);
    858      1.1  mrg       }
    859      1.1  mrg 
    860      1.1  mrg   mpfr_clear (c);
    861      1.1  mrg }
    862      1.1  mrg 
    863      1.1  mrg /* Test case bk == 0 in add1.c (b has entirely been read and
    864      1.1  mrg    c hasn't been taken into account). */
    865      1.1  mrg static void
    866      1.1  mrg coverage_bk_eq_0 (void)
    867      1.1  mrg {
    868      1.1  mrg   mpfr_t a, b, c;
    869      1.1  mrg   int inex;
    870      1.1  mrg 
    871      1.1  mrg   mpfr_init2 (a, GMP_NUMB_BITS);
    872      1.1  mrg   mpfr_init2 (b, 2 * GMP_NUMB_BITS);
    873      1.1  mrg   mpfr_init2 (c, GMP_NUMB_BITS);
    874      1.1  mrg 
    875      1.1  mrg   mpfr_set_ui_2exp (b, 1, 2 * GMP_NUMB_BITS, MPFR_RNDN);
    876      1.1  mrg   mpfr_sub_ui (b, b, 1, MPFR_RNDN);
    877      1.1  mrg   /* b = 111...111 (in base 2) where the 1's fit 2 whole limbs */
    878      1.1  mrg 
    879      1.1  mrg   mpfr_set_ui_2exp (c, 1, -1, MPFR_RNDN);  /* c = 1/2 */
    880      1.1  mrg 
    881      1.1  mrg   inex = mpfr_add (a, b, c, MPFR_RNDU);
    882      1.1  mrg   mpfr_set_ui_2exp (c, 1, 2 * GMP_NUMB_BITS, MPFR_RNDN);
    883      1.1  mrg   if (! mpfr_equal_p (a, c))
    884      1.1  mrg     {
    885      1.1  mrg       printf ("Error in coverage_bk_eq_0\n");
    886      1.1  mrg       printf ("Expected ");
    887      1.1  mrg       mpfr_dump (c);
    888      1.1  mrg       printf ("Got      ");
    889      1.1  mrg       mpfr_dump (a);
    890      1.1  mrg       exit (1);
    891      1.1  mrg     }
    892      1.1  mrg   MPFR_ASSERTN (inex > 0);
    893      1.1  mrg 
    894      1.1  mrg   mpfr_clear (a);
    895      1.1  mrg   mpfr_clear (b);
    896      1.1  mrg   mpfr_clear (c);
    897      1.1  mrg }
    898      1.1  mrg 
    899      1.1  mrg static void
    900      1.1  mrg tests (void)
    901      1.1  mrg {
    902      1.1  mrg   check_alloc ();
    903      1.1  mrg   check_nans ();
    904      1.1  mrg   check_inexact ();
    905      1.1  mrg   check_case_1b ();
    906      1.1  mrg   check_case_2 ();
    907      1.1  mrg   check64();
    908      1.1  mrg   coverage_bk_eq_0 ();
    909      1.1  mrg 
    910      1.1  mrg   check("293607738.0", "1.9967571564050541e-5", MPFR_RNDU, 64, 53, 53,
    911      1.1  mrg         "2.9360773800002003e8");
    912      1.1  mrg   check("880524.0", "-2.0769715792901673e-5", MPFR_RNDN, 64, 53, 53,
    913      1.1  mrg         "8.8052399997923023e5");
    914      1.1  mrg   check("1196426492.0", "-1.4218093058435347e-3", MPFR_RNDN, 64, 53, 53,
    915      1.1  mrg         "1.1964264919985781e9");
    916      1.1  mrg   check("982013018.0", "-8.941829477291838e-7", MPFR_RNDN, 64, 53, 53,
    917      1.1  mrg         "9.8201301799999905e8");
    918      1.1  mrg   check("1092583421.0", "1.0880649218158844e9", MPFR_RNDN, 64, 53, 53,
    919      1.1  mrg         "2.1806483428158846e9");
    920      1.1  mrg   check("1.8476886419022969e-6", "961494401.0", MPFR_RNDN, 53, 64, 53,
    921      1.1  mrg         "9.6149440100000179e8");
    922      1.1  mrg   check("-2.3222118418069868e5", "1229318102.0", MPFR_RNDN, 53, 64, 53,
    923      1.1  mrg         "1.2290858808158193e9");
    924      1.1  mrg   check("-3.0399171300395734e-6", "874924868.0", MPFR_RNDN, 53, 64, 53,
    925      1.1  mrg         "8.749248679999969e8");
    926      1.1  mrg   check("9.064246624706179e1", "663787413.0", MPFR_RNDN, 53, 64, 53,
    927      1.1  mrg         "6.6378750364246619e8");
    928      1.1  mrg   check("-1.0954322421551264e2", "281806592.0", MPFR_RNDD, 53, 64, 53,
    929      1.1  mrg         "2.8180648245677572e8");
    930      1.1  mrg   check("5.9836930386056659e-8", "1016217213.0", MPFR_RNDN, 53, 64, 53,
    931      1.1  mrg         "1.0162172130000001e9");
    932      1.1  mrg   check("-1.2772161928500301e-7", "1237734238.0", MPFR_RNDN, 53, 64, 53,
    933      1.1  mrg         "1.2377342379999998e9");
    934      1.1  mrg   check("-4.567291988483277e8", "1262857194.0", MPFR_RNDN, 53, 64, 53,
    935      1.1  mrg         "8.0612799515167236e8");
    936      1.1  mrg   check("4.7719471752925262e7", "196089880.0", MPFR_RNDN, 53, 53, 53,
    937      1.1  mrg         "2.4380935175292528e8");
    938      1.1  mrg   check("4.7719471752925262e7", "196089880.0", MPFR_RNDN, 53, 64, 53,
    939      1.1  mrg         "2.4380935175292528e8");
    940      1.1  mrg   check("-1.716113812768534e-140", "1271212614.0", MPFR_RNDZ, 53, 64, 53,
    941      1.1  mrg         "1.2712126139999998e9");
    942      1.1  mrg   check("-1.2927455200185474e-50", "1675676122.0", MPFR_RNDD, 53, 64, 53,
    943      1.1  mrg         "1.6756761219999998e9");
    944      1.1  mrg 
    945      1.1  mrg   check53("1.22191250737771397120e+20", "948002822.0", MPFR_RNDN,
    946      1.1  mrg           "122191250738719408128.0");
    947      1.1  mrg   check53("9966027674114492.0", "1780341389094537.0", MPFR_RNDN,
    948      1.1  mrg           "11746369063209028.0");
    949      1.1  mrg   check53("2.99280481918991653800e+272", "5.34637717585790933424e+271",
    950      1.1  mrg           MPFR_RNDN, "3.5274425367757071711e272");
    951      1.1  mrg   check_same();
    952      1.1  mrg   check53("6.14384195492641560499e-02", "-6.14384195401037683237e-02",
    953      1.1  mrg           MPFR_RNDU, "9.1603877261370314499e-12");
    954      1.1  mrg   check53("1.16809465359248765399e+196", "7.92883212101990665259e+196",
    955      1.1  mrg           MPFR_RNDU, "9.0969267746123943065e196");
    956      1.1  mrg   check53("3.14553393112021279444e-67", "3.14553401015952024126e-67", MPFR_RNDU,
    957      1.1  mrg           "6.2910679412797336946e-67");
    958      1.1  mrg 
    959      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDN,
    960      1.1  mrg           "5.4388530464436950905e185");
    961      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDZ,
    962      1.1  mrg           "5.4388530464436944867e185");
    963      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDU,
    964      1.1  mrg           "5.4388530464436950905e185");
    965      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDD,
    966      1.1  mrg           "5.4388530464436944867e185");
    967      1.1  mrg 
    968      1.1  mrg   check2b("1.001010101110011000000010100101110010111001010000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e358",187,
    969      1.1  mrg           "-1.11100111001101100010001111111110101101110001000000000000000000000000000000000000000000e160",87,
    970      1.1  mrg           "1.001010101110011000000010100101110010111001010000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111e358",178,
    971      1.1  mrg           MPFR_RNDD);
    972      1.1  mrg   check2b("-1.111100100011100111010101010101001010100100000111001000000000000000000e481",70,
    973      1.1  mrg           "1.1111000110100011110101111110110010010000000110101000000000000000e481",65,
    974      1.1  mrg           "-1.001010111111101011010000001100011101100101000000000000000000e472",61,
    975      1.1  mrg           MPFR_RNDD);
    976      1.1  mrg   check2b("1.0100010111010000100101000000111110011100011001011010000000000000000000000000000000e516",83,
    977      1.1  mrg           "-1.1001111000100001011100000001001100110011110010111111000000e541",59,
    978      1.1  mrg           "-1.1001111000100001011011110111000001001011100000011110100000110001110011010011000000000000000000000000000000000000000000000000e541",125,
    979      1.1  mrg           MPFR_RNDZ);
    980      1.1  mrg   check2b("-1.0010111100000100110001011011010000000011000111101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e261",155,
    981      1.1  mrg           "-1.00111110100011e239",15,
    982      1.1  mrg           "-1.00101111000001001100101010101110001100110001111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e261",159,
    983      1.1  mrg           MPFR_RNDD);
    984      1.1  mrg   check2b("-1.110111000011111011000000001001111101101001010100111000000000000000000000000e880",76,
    985      1.1  mrg           "-1.1010010e-634",8,
    986      1.1  mrg           "-1.11011100001111101100000000100111110110100101010011100000000000000000000000e880",75,
    987      1.1  mrg           MPFR_RNDZ);
    988      1.1  mrg   check2b("1.00100100110110101001010010101111000001011100100101010000000000000000000000000000e-530",81,
    989      1.1  mrg           "-1.101101111100000111000011001010110011001011101001110100000e-908",58,
    990      1.1  mrg           "1.00100100110110101001010010101111000001011100100101010e-530",54,
    991      1.1  mrg           MPFR_RNDN);
    992      1.1  mrg   check2b("1.0101100010010111101000000001000010010010011000111011000000000000000000000000000000000000000000000000000000000000000000e374",119,
    993      1.1  mrg           "1.11100101100101e358",15,
    994      1.1  mrg           "1.01011000100110011000010110100100100100100110001110110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e374",150,
    995      1.1  mrg           MPFR_RNDZ);
    996      1.1  mrg   check2b("-1.10011001000010100000010100100110110010011111101111000000000000000000000000000000000000000000000000000000000000000000e-172",117,
    997      1.1  mrg           "1.111011100000101010110000100100110100100001001000011100000000e-173",61,
    998      1.1  mrg           "-1.0100010000001001010110011011101001001011101011110001000000000000000e-173",68,
    999      1.1  mrg           MPFR_RNDZ);
   1000      1.1  mrg   check2b("-1.011110000111101011100001100110100011100101000011011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-189",175,
   1001      1.1  mrg           "1.1e631",2,
   1002      1.1  mrg           "1.011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111e631",115,
   1003      1.1  mrg           MPFR_RNDZ);
   1004      1.1  mrg   check2b("-1.101011101001011101100011001000001100010100001101011000000000000000000000000000000000000000000e-449",94,
   1005      1.1  mrg           "-1.01111101010111000011000110011101000111001100110111100000000000000e-429",66,
   1006      1.1  mrg           "-1.01111101010111000100110010000110100100101111111111101100010100001101011000000000000000000000000000000000000000e-429",111,
   1007      1.1  mrg           MPFR_RNDU);
   1008      1.1  mrg   check2b("-1.101011101001011101100011001000001100010100001101011000000000000000000000000000000000000000000e-449",94,
   1009      1.1  mrg           "-1.01111101010111000011000110011101000111001100110111100000000000000e-429",66,
   1010      1.1  mrg           "-1.01111101010111000100110010000110100100101111111111101100010100001101011000000000000000000000000000000000000000e-429",111,
   1011      1.1  mrg           MPFR_RNDD);
   1012      1.1  mrg   check2b("-1.1001000011101000110000111110010100100101110101111100000000000000000000000000000000000000000000000000000000e-72",107,
   1013      1.1  mrg           "-1.001100011101100100010101101010101011010010111111010000000000000000000000000000e521",79,
   1014      1.1  mrg           "-1.00110001110110010001010110101010101101001011111101000000000000000000000000000000000000000000000001e521",99,
   1015      1.1  mrg           MPFR_RNDD);
   1016      1.1  mrg   check2b("-1.01010001111000000101010100100100110101011011100001110000000000e498",63,
   1017      1.1  mrg           "1.010000011010101111000100111100011100010101011110010100000000000e243",64,
   1018      1.1  mrg           "-1.010100011110000001010101001001001101010110111000011100000000000e498",64,
   1019      1.1  mrg           MPFR_RNDN);
   1020      1.1  mrg   check2b("1.00101100010101000011010000011000111111011110010111000000000000000000000000000000000000000000000000000000000e178",108,
   1021      1.1  mrg           "-1.10101101010101000110011011111001001101111111110000100000000e160",60,
   1022      1.1  mrg           "1.00101100010100111100100011000011111001000010011101110010000000001111100000000000000000000000000000000000e178",105,
   1023      1.1  mrg           MPFR_RNDN);
   1024      1.1  mrg   check2b("1.00110011010100111110011010110100111101110101100100110000000000000000000000000000000000000000000000e559",99,
   1025      1.1  mrg           "-1.011010110100111011100110100110011100000000111010011000000000000000e559",67,
   1026      1.1  mrg           "-1.101111111101011111111111001001100100011100001001100000000000000000000000000000000000000000000e556",94,
   1027      1.1  mrg           MPFR_RNDU);
   1028      1.1  mrg   check2b("-1.100000111100101001100111011100011011000001101001111100000000000000000000000000e843",79,
   1029      1.1  mrg           "-1.1101101010110000001001000100001100110011000110110111000000000000000000000000000000000000000000e414",95,
   1030      1.1  mrg           "-1.1000001111001010011001110111000110110000011010100000e843",53,
   1031      1.1  mrg           MPFR_RNDD);
   1032      1.1  mrg   check2b("-1.110110010110100010100011000110111001010000010111110000000000e-415",61,
   1033      1.1  mrg           "-1.0000100101100001111100110011111111110100011101101011000000000000000000e751",71,
   1034      1.1  mrg           "-1.00001001011000011111001100111111111101000111011010110e751",54,
   1035      1.1  mrg           MPFR_RNDN);
   1036      1.1  mrg   check2b("-1.1011011011110001001101010101001000010100010110111101000000000000000000000e258",74,
   1037      1.1  mrg           "-1.00011100010110110101001011000100100000100010101000010000000000000000000000000000000000000000000000e268",99,
   1038      1.1  mrg           "-1.0001110011001001000011110001000111010110101011110010011011110100000000000000000000000000000000000000e268",101,
   1039      1.1  mrg           MPFR_RNDD);
   1040      1.1  mrg   check2b("-1.1011101010011101011000000100100110101101101110000001000000000e629",62,
   1041      1.1  mrg           "1.111111100000011100100011100000011101100110111110111000000000000000000000000000000000000000000e525",94,
   1042      1.1  mrg           "-1.101110101001110101100000010010011010110110111000000011111111111111111111111111111111111111111111111111101e629",106,
   1043      1.1  mrg           MPFR_RNDD);
   1044      1.1  mrg   check2b("1.111001000010001100010000001100000110001011110111011000000000000000000000000000000000000e152",88,
   1045      1.1  mrg           "1.111110111001100100000100111111010111000100111111001000000000000000e152",67,
   1046      1.1  mrg           "1.1110111111011110000010101001011011101010000110110100e153",53,
   1047      1.1  mrg           MPFR_RNDN);
   1048      1.1  mrg   check2b("1.000001100011110010110000110100001010101101111011110100e696",55,
   1049      1.1  mrg           "-1.1011001111011100100001011110100101010101110111010101000000000000000000000000000000000000000000000000000000000000e730",113,
   1050      1.1  mrg           "-1.1011001111011100100001011110100100010100010011100010e730",53,
   1051      1.1  mrg           MPFR_RNDN);
   1052      1.1  mrg   check2b("-1.11010111100001001111000001110101010010001111111001100000000000000000000000000000000000000000000000000000000000e530",111,
   1053      1.1  mrg           "1.01110100010010000000010110111101011101000001111101100000000000000000000000000000000000000000000000e530",99,
   1054      1.1  mrg           "-1.1000110011110011101010101101111101010011011111000000000000000e528",62,
   1055      1.1  mrg           MPFR_RNDD);
   1056      1.1  mrg   check2b("-1.0001100010010100111101101011101000100100010011100011000000000000000000000000000000000000000000000000000000000e733",110,
   1057      1.1  mrg           "-1.001000000111110010100101010100110111001111011011001000000000000000000000000000000000000000000000000000000000e710",109,
   1058      1.1  mrg           "-1.000110001001010011111000111110110001110110011000110110e733",55,
   1059      1.1  mrg           MPFR_RNDN);
   1060      1.1  mrg   check2b("-1.1101011110000100111100000111010101001000111111100110000000000000000000000e530",74,
   1061      1.1  mrg           "1.01110100010010000000010110111101011101000001111101100000000000000000000000000000000000000000000000000000000000e530",111,
   1062      1.1  mrg           "-1.10001100111100111010101011011111010100110111110000000000000000000000000000e528",75,
   1063      1.1  mrg           MPFR_RNDU);
   1064      1.1  mrg   check2b("1.00110011010100111110011010110100111101110101100100110000000000000000000000000000000000000000000000e559",99,
   1065      1.1  mrg           "-1.011010110100111011100110100110011100000000111010011000000000000000e559",67,
   1066      1.1  mrg           "-1.101111111101011111111111001001100100011100001001100000000000000000000000000000000000000000000e556",94,
   1067      1.1  mrg           MPFR_RNDU);
   1068      1.1  mrg   check2b("-1.100101111110110000000110111111011010011101101111100100000000000000e-624",67,
   1069      1.1  mrg           "1.10111010101110100000010110101000000000010011100000100000000e-587",60,
   1070      1.1  mrg           "1.1011101010111010000001011010011111110100011110001011111111001000000100101100010010000011100000000000000000000e-587",110,
   1071      1.1  mrg           MPFR_RNDU);
   1072      1.1  mrg   check2b("-1.10011001000010100000010100100110110010011111101111000000000000000000000000000000000000000000000000000000000000000000e-172",117,
   1073      1.1  mrg           "1.111011100000101010110000100100110100100001001000011100000000e-173",61,
   1074      1.1  mrg           "-1.0100010000001001010110011011101001001011101011110001000000000000000e-173",68,
   1075      1.1  mrg           MPFR_RNDZ);
   1076      1.1  mrg   check2b("1.1000111000110010101001010011010011101100010110001001000000000000000000000000000000000000000000000000e167",101,
   1077      1.1  mrg           "1.0011110010000110000000101100100111000001110110110000000000000000000000000e167",74,
   1078      1.1  mrg           "1.01100101010111000101001111111111010101110001100111001000000000000000000000000000000000000000000000000000e168",105,
   1079      1.1  mrg           MPFR_RNDZ);
   1080      1.1  mrg   check2b("1.100101111111110010100101110111100001110000100001010000000000000000000000000000000000000000000000e808",97,
   1081      1.1  mrg           "-1.1110011001100000100000111111110000110010100111001011000000000000000000000000000000e807",83,
   1082      1.1  mrg           "1.01001001100110001100011111000000000001011010010111010000000000000000000000000000000000000000000e807",96,
   1083      1.1  mrg           MPFR_RNDN);
   1084      1.1  mrg   check2b("1e128",128,
   1085      1.1  mrg           "1e0",128,
   1086      1.1  mrg           "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0",256,
   1087      1.1  mrg           MPFR_RNDN);
   1088  1.1.1.5  mrg   check2b("0.10000000000000000011101111111110110110001100010110100011010000110101101101010010000110110011100110001101110010111011011110010101e1",128,
   1089  1.1.1.5  mrg           "0.11110011001100100001111011100010010100011011011111111110101001101001101011100101011110101111111100010010100010100111110110011001e-63",128,
   1090  1.1.1.5  mrg           "0.10000000000000000011101111111110110110001100010110100011010001000100111010000100001110100001101111011111100000111011011000111100e1",128,
   1091  1.1.1.5  mrg           MPFR_RNDN);
   1092  1.1.1.5  mrg   check2b("0.101000111001110100111100000010110010011101001011101001001101101000010100010000011100110110110011011000001110110101100111010110011101000111010011110001010001110110110011111011011100101011111100e-2",192,
   1093  1.1.1.5  mrg           "0.101101100000111110011110000110001000110110010010110000111101110010111010100110000000000110010100010001000001011011101010111010101011010110011011011110110111001000111001101000010101111010010010e-130",192,
   1094  1.1.1.5  mrg           "0.101000111001110100111100000010110010011101001011101001001101101000010100010000011100110110110011011000001110110101100111010110101000011111100011011000110011011001000001100000001000111011011001e-2",192,
   1095  1.1.1.5  mrg           MPFR_RNDN);
   1096      1.1  mrg 
   1097      1.1  mrg   /* Checking double precision (53 bits) */
   1098      1.1  mrg   check53("-8.22183238641455905806e-19", "7.42227178769761587878e-19",MPFR_RNDD,
   1099      1.1  mrg           "-7.9956059871694317927e-20");
   1100      1.1  mrg   check53("5.82106394662028628236e+234","-5.21514064202368477230e+89",MPFR_RNDD,
   1101      1.1  mrg           "5.8210639466202855763e234");
   1102      1.1  mrg   check53("5.72931679569871602371e+122","-5.72886070363264321230e+122",
   1103      1.1  mrg           MPFR_RNDN, "4.5609206607281141508e118");
   1104      1.1  mrg   check53("-5.09937369394650450820e+238", "2.70203299854862982387e+250",
   1105      1.1  mrg           MPFR_RNDD, "2.7020329985435301323e250");
   1106      1.1  mrg   check53("-2.96695924472363684394e+27", "1.22842938251111500000e+16",MPFR_RNDD,
   1107      1.1  mrg           "-2.96695924471135255027e27");
   1108      1.1  mrg   check53("1.74693641655743793422e-227", "-7.71776956366861843469e-229",
   1109      1.1  mrg           MPFR_RNDN, "1.669758720920751867e-227");
   1110      1.1  mrg   /*  x = -7883040437021647.0; for (i=0; i<468; i++) x = x / 2.0;*/
   1111      1.1  mrg   check53("-1.03432206392780011159e-125", "1.30127034799251347548e-133",
   1112      1.1  mrg           MPFR_RNDN,
   1113      1.1  mrg           "-1.0343220509150965661100887242027378881805094180354e-125");
   1114      1.1  mrg   check53("1.05824655795525779205e+71", "-1.06022698059744327881e+71",MPFR_RNDZ,
   1115      1.1  mrg           "-1.9804226421854867632e68");
   1116      1.1  mrg   check53("-5.84204911040921732219e+240", "7.26658169050749590763e+240",
   1117      1.1  mrg           MPFR_RNDD, "1.4245325800982785854e240");
   1118      1.1  mrg   check53("1.00944884131046636376e+221","2.33809162651471520268e+215",MPFR_RNDN,
   1119      1.1  mrg           "1.0094511794020929787e221");
   1120      1.1  mrg   /*x = 7045852550057985.0; for (i=0; i<986; i++) x = x / 2.0;*/
   1121      1.1  mrg   check53("4.29232078932667367325e-278",
   1122      1.1  mrg           "1.0773525047389793833221116707010783793203080117586e-281"
   1123      1.1  mrg           , MPFR_RNDU, "4.2933981418314132787e-278");
   1124      1.1  mrg   check53("5.27584773801377058681e-80", "8.91207657803547196421e-91", MPFR_RNDN,
   1125      1.1  mrg           "5.2758477381028917269e-80");
   1126      1.1  mrg   check53("2.99280481918991653800e+272", "5.34637717585790933424e+271",
   1127      1.1  mrg           MPFR_RNDN, "3.5274425367757071711e272");
   1128      1.1  mrg   check53("4.67302514390488041733e-184", "2.18321376145645689945e-190",
   1129      1.1  mrg           MPFR_RNDN, "4.6730273271186420541e-184");
   1130      1.1  mrg   check53("5.57294120336300389254e+71", "2.60596167942024924040e+65", MPFR_RNDZ,
   1131      1.1  mrg           "5.5729438093246831053e71");
   1132      1.1  mrg   check53("6.6052588496951015469e24", "4938448004894539.0", MPFR_RNDU,
   1133      1.1  mrg           "6.6052588546335505068e24");
   1134      1.1  mrg   check53("1.23056185051606761523e-190", "1.64589756643433857138e-181",
   1135      1.1  mrg           MPFR_RNDU, "1.6458975676649006598e-181");
   1136      1.1  mrg   check53("2.93231171510175981584e-280", "3.26266919161341483877e-273",
   1137      1.1  mrg           MPFR_RNDU, "3.2626694848445867288e-273");
   1138      1.1  mrg   check53("5.76707395945001907217e-58", "4.74752971449827687074e-51", MPFR_RNDD,
   1139      1.1  mrg           "4.747530291205672325e-51");
   1140      1.1  mrg   check53("277363943109.0", "11.0", MPFR_RNDN, "277363943120.0");
   1141      1.1  mrg   check53("1.44791789689198883921e-140", "-1.90982880222349071284e-121",
   1142      1.1  mrg           MPFR_RNDN, "-1.90982880222349071e-121");
   1143      1.1  mrg 
   1144      1.1  mrg 
   1145      1.1  mrg   /* tests for particular cases (Vincent Lefevre, 22 Aug 2001) */
   1146      1.1  mrg   check53("9007199254740992.0", "1.0", MPFR_RNDN, "9007199254740992.0");
   1147      1.1  mrg   check53("9007199254740994.0", "1.0", MPFR_RNDN, "9007199254740996.0");
   1148      1.1  mrg   check53("9007199254740992.0", "-1.0", MPFR_RNDN, "9007199254740991.0");
   1149      1.1  mrg   check53("9007199254740994.0", "-1.0", MPFR_RNDN, "9007199254740992.0");
   1150      1.1  mrg   check53("9007199254740996.0", "-1.0", MPFR_RNDN, "9007199254740996.0");
   1151      1.1  mrg 
   1152      1.1  mrg   check_overflow ();
   1153      1.1  mrg   check_1111 ();
   1154      1.1  mrg   check_1minuseps ();
   1155      1.1  mrg }
   1156      1.1  mrg 
   1157  1.1.1.4  mrg static void
   1158  1.1.1.4  mrg check_extreme (void)
   1159  1.1.1.4  mrg {
   1160  1.1.1.4  mrg   mpfr_t u, v, w, x, y;
   1161  1.1.1.4  mrg   int i, inex, r;
   1162  1.1.1.4  mrg 
   1163  1.1.1.4  mrg   mpfr_inits2 (32, u, v, w, x, y, (mpfr_ptr) 0);
   1164  1.1.1.4  mrg   mpfr_setmin (u, mpfr_get_emax ());
   1165  1.1.1.4  mrg   mpfr_setmax (v, mpfr_get_emin ());
   1166  1.1.1.4  mrg   mpfr_setmin (w, mpfr_get_emax () - 40);
   1167  1.1.1.4  mrg   RND_LOOP (r)
   1168  1.1.1.4  mrg     for (i = 0; i < 2; i++)
   1169  1.1.1.4  mrg       {
   1170  1.1.1.4  mrg         mpfr_add (x, u, v, (mpfr_rnd_t) r);
   1171  1.1.1.4  mrg         mpfr_set_prec (y, 64);
   1172  1.1.1.4  mrg         inex = mpfr_add (y, u, w, MPFR_RNDN);
   1173  1.1.1.4  mrg         MPFR_ASSERTN (inex == 0);
   1174  1.1.1.4  mrg         mpfr_prec_round (y, 32, (mpfr_rnd_t) r);
   1175  1.1.1.4  mrg         /* for RNDF, the rounding directions are not necessarily consistent */
   1176  1.1.1.4  mrg         if (! mpfr_equal_p (x, y) && r != MPFR_RNDF)
   1177  1.1.1.4  mrg           {
   1178  1.1.1.4  mrg             printf ("Error in u + v (%s)\n",
   1179  1.1.1.4  mrg                     mpfr_print_rnd_mode ((mpfr_rnd_t) r));
   1180  1.1.1.4  mrg             printf ("u = ");
   1181  1.1.1.4  mrg             mpfr_dump (u);
   1182  1.1.1.4  mrg             printf ("v = ");
   1183  1.1.1.4  mrg             mpfr_dump (v);
   1184  1.1.1.4  mrg             printf ("Expected ");
   1185  1.1.1.4  mrg             mpfr_dump (y);
   1186  1.1.1.4  mrg             printf ("Got      ");
   1187  1.1.1.4  mrg             mpfr_dump (x);
   1188  1.1.1.4  mrg             exit (1);
   1189  1.1.1.4  mrg           }
   1190  1.1.1.4  mrg         mpfr_neg (v, v, MPFR_RNDN);
   1191  1.1.1.4  mrg         mpfr_neg (w, w, MPFR_RNDN);
   1192  1.1.1.4  mrg       }
   1193  1.1.1.4  mrg   mpfr_clears (u, v, w, x, y, (mpfr_ptr) 0);
   1194  1.1.1.4  mrg }
   1195  1.1.1.4  mrg 
   1196  1.1.1.4  mrg static void
   1197  1.1.1.4  mrg testall_rndf (mpfr_prec_t pmax)
   1198  1.1.1.4  mrg {
   1199  1.1.1.4  mrg   mpfr_t a, b, c, d;
   1200  1.1.1.4  mrg   mpfr_prec_t pa, pb, pc;
   1201  1.1.1.4  mrg   mpfr_exp_t eb;
   1202  1.1.1.4  mrg 
   1203  1.1.1.4  mrg   for (pa = MPFR_PREC_MIN; pa <= pmax; pa++)
   1204  1.1.1.4  mrg     {
   1205  1.1.1.4  mrg       mpfr_init2 (a, pa);
   1206  1.1.1.4  mrg       mpfr_init2 (d, pa);
   1207  1.1.1.4  mrg       for (pb = MPFR_PREC_MIN; pb <= pmax; pb++)
   1208  1.1.1.4  mrg         {
   1209  1.1.1.4  mrg           mpfr_init2 (b, pb);
   1210  1.1.1.4  mrg           for (eb = 0; eb <= pmax + 3; eb ++)
   1211  1.1.1.4  mrg             {
   1212  1.1.1.4  mrg               mpfr_set_ui_2exp (b, 1, eb, MPFR_RNDN);
   1213  1.1.1.4  mrg               while (mpfr_cmp_ui_2exp (b, 1, eb + 1) < 0)
   1214  1.1.1.4  mrg                 {
   1215  1.1.1.4  mrg                   for (pc = MPFR_PREC_MIN; pc <= pmax; pc++)
   1216  1.1.1.4  mrg                     {
   1217  1.1.1.4  mrg                       mpfr_init2 (c, pc);
   1218  1.1.1.4  mrg                       mpfr_set_ui (c, 1, MPFR_RNDN);
   1219  1.1.1.4  mrg                       while (mpfr_cmp_ui (c, 2) < 0)
   1220  1.1.1.4  mrg                         {
   1221  1.1.1.4  mrg                           mpfr_add (a, b, c, MPFR_RNDF);
   1222  1.1.1.4  mrg                           mpfr_add (d, b, c, MPFR_RNDD);
   1223  1.1.1.4  mrg                           if (!mpfr_equal_p (a, d))
   1224  1.1.1.4  mrg                             {
   1225  1.1.1.4  mrg                               mpfr_add (d, b, c, MPFR_RNDU);
   1226  1.1.1.4  mrg                               if (!mpfr_equal_p (a, d))
   1227  1.1.1.4  mrg                                 {
   1228  1.1.1.4  mrg                                   printf ("Error: mpfr_add(a,b,c,RNDF) does not "
   1229  1.1.1.4  mrg                                           "match RNDD/RNDU\n");
   1230  1.1.1.4  mrg                                   printf ("b="); mpfr_dump (b);
   1231  1.1.1.4  mrg                                   printf ("c="); mpfr_dump (c);
   1232  1.1.1.4  mrg                                   printf ("a="); mpfr_dump (a);
   1233  1.1.1.4  mrg                                   exit (1);
   1234  1.1.1.4  mrg                                 }
   1235  1.1.1.4  mrg                             }
   1236  1.1.1.4  mrg                           mpfr_nextabove (c);
   1237  1.1.1.4  mrg                         }
   1238  1.1.1.4  mrg                       mpfr_clear (c);
   1239  1.1.1.4  mrg                     }
   1240  1.1.1.4  mrg                   mpfr_nextabove (b);
   1241  1.1.1.4  mrg                 }
   1242  1.1.1.4  mrg             }
   1243  1.1.1.4  mrg           mpfr_clear (b);
   1244  1.1.1.4  mrg         }
   1245  1.1.1.4  mrg       mpfr_clear (a);
   1246  1.1.1.4  mrg       mpfr_clear (d);
   1247  1.1.1.4  mrg     }
   1248  1.1.1.4  mrg }
   1249  1.1.1.4  mrg 
   1250  1.1.1.4  mrg static void
   1251  1.1.1.4  mrg test_rndf_exact (mp_size_t pmax)
   1252  1.1.1.4  mrg {
   1253  1.1.1.4  mrg   mpfr_t a, b, c, d;
   1254  1.1.1.4  mrg   mpfr_prec_t pa, pb, pc;
   1255  1.1.1.4  mrg   mpfr_exp_t eb;
   1256  1.1.1.4  mrg 
   1257  1.1.1.4  mrg   for (pa = MPFR_PREC_MIN; pa <= pmax; pa++)
   1258  1.1.1.4  mrg     {
   1259  1.1.1.4  mrg       /* only check pa mod GMP_NUMB_BITS = -2, -1, 0, 1, 2 */
   1260  1.1.1.4  mrg       if ((pa + 2) % GMP_NUMB_BITS > 4)
   1261  1.1.1.4  mrg         continue;
   1262  1.1.1.4  mrg       mpfr_init2 (a, pa);
   1263  1.1.1.4  mrg       mpfr_init2 (d, pa);
   1264  1.1.1.4  mrg       for (pb = MPFR_PREC_MIN; pb <= pmax; pb++)
   1265  1.1.1.4  mrg         {
   1266  1.1.1.4  mrg           if ((pb + 2) % GMP_NUMB_BITS > 4)
   1267  1.1.1.4  mrg             continue;
   1268  1.1.1.4  mrg           mpfr_init2 (b, pb);
   1269  1.1.1.4  mrg           for (eb = 0; eb <= pmax + 3; eb ++)
   1270  1.1.1.4  mrg             {
   1271  1.1.1.4  mrg               mpfr_urandomb (b, RANDS);
   1272  1.1.1.5  mrg               mpfr_mul_2ui (b, b, eb, MPFR_RNDN);
   1273  1.1.1.4  mrg               for (pc = MPFR_PREC_MIN; pc <= pmax; pc++)
   1274  1.1.1.4  mrg                 {
   1275  1.1.1.4  mrg                   if ((pc + 2) % GMP_NUMB_BITS > 4)
   1276  1.1.1.4  mrg                     continue;
   1277  1.1.1.4  mrg                   mpfr_init2 (c, pc);
   1278  1.1.1.4  mrg                   mpfr_urandomb (c, RANDS);
   1279  1.1.1.4  mrg                   mpfr_add (a, b, c, MPFR_RNDF);
   1280  1.1.1.4  mrg                   mpfr_add (d, b, c, MPFR_RNDD);
   1281  1.1.1.4  mrg                   if (!mpfr_equal_p (a, d))
   1282  1.1.1.4  mrg                     {
   1283  1.1.1.4  mrg                       mpfr_add (d, b, c, MPFR_RNDU);
   1284  1.1.1.4  mrg                       if (!mpfr_equal_p (a, d))
   1285  1.1.1.4  mrg                         {
   1286  1.1.1.4  mrg                           printf ("Error: mpfr_add(a,b,c,RNDF) does not "
   1287  1.1.1.4  mrg                                   "match RNDD/RNDU\n");
   1288  1.1.1.4  mrg                           printf ("b="); mpfr_dump (b);
   1289  1.1.1.4  mrg                           printf ("c="); mpfr_dump (c);
   1290  1.1.1.4  mrg                           printf ("a="); mpfr_dump (a);
   1291  1.1.1.4  mrg                           exit (1);
   1292  1.1.1.4  mrg                         }
   1293  1.1.1.4  mrg                     }
   1294  1.1.1.4  mrg 
   1295  1.1.1.4  mrg                   /* now make the low bits from c match those from b */
   1296  1.1.1.4  mrg                   mpfr_sub (c, b, d, MPFR_RNDN);
   1297  1.1.1.4  mrg                   mpfr_add (a, b, c, MPFR_RNDF);
   1298  1.1.1.4  mrg                   mpfr_add (d, b, c, MPFR_RNDD);
   1299  1.1.1.4  mrg                   if (!mpfr_equal_p (a, d))
   1300  1.1.1.4  mrg                     {
   1301  1.1.1.4  mrg                       mpfr_add (d, b, c, MPFR_RNDU);
   1302  1.1.1.4  mrg                       if (!mpfr_equal_p (a, d))
   1303  1.1.1.4  mrg                         {
   1304  1.1.1.4  mrg                           printf ("Error: mpfr_add(a,b,c,RNDF) does not "
   1305  1.1.1.4  mrg                                   "match RNDD/RNDU\n");
   1306  1.1.1.4  mrg                           printf ("b="); mpfr_dump (b);
   1307  1.1.1.4  mrg                           printf ("c="); mpfr_dump (c);
   1308  1.1.1.4  mrg                           printf ("a="); mpfr_dump (a);
   1309  1.1.1.4  mrg                           exit (1);
   1310  1.1.1.4  mrg                         }
   1311  1.1.1.4  mrg                     }
   1312  1.1.1.4  mrg 
   1313  1.1.1.4  mrg                   mpfr_clear (c);
   1314  1.1.1.4  mrg                 }
   1315  1.1.1.4  mrg             }
   1316  1.1.1.4  mrg           mpfr_clear (b);
   1317  1.1.1.4  mrg         }
   1318  1.1.1.4  mrg       mpfr_clear (a);
   1319  1.1.1.4  mrg       mpfr_clear (d);
   1320  1.1.1.4  mrg     }
   1321  1.1.1.4  mrg }
   1322  1.1.1.4  mrg 
   1323      1.1  mrg #define TEST_FUNCTION test_add
   1324      1.1  mrg #define TWO_ARGS
   1325      1.1  mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
   1326      1.1  mrg #include "tgeneric.c"
   1327      1.1  mrg 
   1328      1.1  mrg int
   1329      1.1  mrg main (int argc, char *argv[])
   1330      1.1  mrg {
   1331      1.1  mrg   tests_start_mpfr ();
   1332      1.1  mrg 
   1333      1.1  mrg   usesp = 0;
   1334      1.1  mrg   tests ();
   1335      1.1  mrg 
   1336      1.1  mrg #ifndef CHECK_EXTERNAL /* no need to check twice */
   1337      1.1  mrg   usesp = 1;
   1338      1.1  mrg   tests ();
   1339      1.1  mrg #endif
   1340  1.1.1.4  mrg 
   1341  1.1.1.4  mrg   test_rndf_exact (200);
   1342  1.1.1.4  mrg   testall_rndf (7);
   1343  1.1.1.4  mrg   check_extreme ();
   1344  1.1.1.4  mrg 
   1345  1.1.1.4  mrg   test_generic (MPFR_PREC_MIN, 1000, 100);
   1346      1.1  mrg 
   1347      1.1  mrg   tests_end_mpfr ();
   1348      1.1  mrg   return 0;
   1349      1.1  mrg }
   1350