Home | History | Annotate | Line # | Download | only in tests
tadd.c revision 1.1.1.3
      1      1.1  mrg /* Test file for mpfr_add and mpfr_sub.
      2      1.1  mrg 
      3  1.1.1.3  mrg Copyright 1999-2016 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  mrg http://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 <stdio.h>
     26      1.1  mrg #include <stdlib.h>
     27      1.1  mrg #include <float.h>
     28      1.1  mrg 
     29      1.1  mrg #include "mpfr-test.h"
     30      1.1  mrg 
     31      1.1  mrg /* If the precisions are the same, we want to test both mpfr_add1sp
     32      1.1  mrg    and mpfr_add1. */
     33      1.1  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  mrg       mpfr_out_str(stdout, 10, 0, zz, MPFR_RNDN);
     87      1.1  mrg       printf ("mpfr_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  mrg       printf ("got        "); mpfr_print_binary(zz); puts ("");
    113      1.1  mrg       mpfr_set_str(zz, rs, 2, MPFR_RNDN);
    114      1.1  mrg       printf ("instead of "); mpfr_print_binary(zz); puts ("");
    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  mrg   if (MPFR_MANT(u)[0] << 2)
    153      1.1  mrg     {
    154      1.1  mrg       printf ("result not normalized for prec=2\n");
    155      1.1  mrg       mpfr_print_binary (u); puts ("");
    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  mrg       printf ("expect "); mpfr_print_binary(t); puts ("");
    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  mrg       printf ("expect "); mpfr_print_binary(t); puts ("");
    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  mrg   if ((MPFR_MANT(u)[(MPFR_PREC(u)-1)/mp_bits_per_limb] &
    254      1.1  mrg        ((mp_limb_t)1<<(mp_bits_per_limb-1)))==0)
    255      1.1  mrg     {
    256      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (1)\n");
    257      1.1  mrg       exit (1);
    258      1.1  mrg     }
    259      1.1  mrg   mpfr_set_prec(x, 65); mpfr_set_prec(t, 65); mpfr_set_prec(u, 65);
    260      1.1  mrg   mpfr_set_str_binary(x, "0.10011010101000110101010000000011001001001110001011101011111011101E623");
    261      1.1  mrg   mpfr_set_str_binary(t, "0.10011010101000110101010000000011001001001110001011101011111011100E623");
    262      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDU);
    263      1.1  mrg   if (mpfr_cmp_ui_2exp(u, 1, 558))
    264      1.1  mrg     { /* 2^558 */
    265      1.1  mrg       printf ("Error (1) in mpfr_sub\n");
    266      1.1  mrg       exit (1);
    267      1.1  mrg     }
    268      1.1  mrg 
    269      1.1  mrg   mpfr_set_prec(x, 64); mpfr_set_prec(t, 64); mpfr_set_prec(u, 64);
    270      1.1  mrg   mpfr_set_str_binary(x, "0.1000011110101111011110111111000011101011101111101101101100000100E-220");
    271      1.1  mrg   mpfr_set_str_binary(t, "0.1000011110101111011110111111000011101011101111101101010011111101E-220");
    272      1.1  mrg   test_add (u, x, t, MPFR_RNDU);
    273      1.1  mrg   if ((MPFR_MANT(u)[0] & 1) != 1)
    274      1.1  mrg     {
    275      1.1  mrg       printf ("error in mpfr_add with rnd_mode=MPFR_RNDU\n");
    276      1.1  mrg       printf ("b=  "); mpfr_print_binary(x); puts ("");
    277      1.1  mrg       printf ("c=  "); mpfr_print_binary(t); puts ("");
    278      1.1  mrg       printf ("b+c="); mpfr_print_binary(u); puts ("");
    279      1.1  mrg       exit (1);
    280      1.1  mrg     }
    281      1.1  mrg 
    282      1.1  mrg   /* bug found by Norbert Mueller, 14 Sep 2000 */
    283      1.1  mrg   mpfr_set_prec(x, 56); mpfr_set_prec(t, 83); mpfr_set_prec(u, 10);
    284      1.1  mrg   mpfr_set_str_binary(x, "0.10001001011011001111101100110100000101111010010111010111E-7");
    285      1.1  mrg   mpfr_set_str_binary(t, "0.10001001011011001111101100110100000101111010010111010111000000000111110110110000100E-7");
    286      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDU);
    287      1.1  mrg 
    288      1.1  mrg   /* array bound write found by Norbert Mueller, 26 Sep 2000 */
    289      1.1  mrg   mpfr_set_prec(x, 109); mpfr_set_prec(t, 153); mpfr_set_prec(u, 95);
    290      1.1  mrg   mpfr_set_str_binary(x,"0.1001010000101011101100111000110001111111111111111111111111111111111111111111111111111111111111100000000000000E33");
    291      1.1  mrg   mpfr_set_str_binary(t,"-0.100101000010101110110011100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011100101101000000100100001100110111E33");
    292      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    293      1.1  mrg 
    294      1.1  mrg   /* array bound writes found by Norbert Mueller, 27 Sep 2000 */
    295      1.1  mrg   mpfr_set_prec(x, 106); mpfr_set_prec(t, 53); mpfr_set_prec(u, 23);
    296      1.1  mrg   mpfr_set_str_binary(x, "-0.1000011110101111111001010001000100001011000000000000000000000000000000000000000000000000000000000000000000E-59");
    297      1.1  mrg   mpfr_set_str_binary(t, "-0.10000111101011111110010100010001101100011100110100000E-59");
    298      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDN);
    299      1.1  mrg   mpfr_set_prec(x, 177); mpfr_set_prec(t, 217); mpfr_set_prec(u, 160);
    300      1.1  mrg   mpfr_set_str_binary(x, "-0.111010001011010000111001001010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E35");
    301      1.1  mrg   mpfr_set_str_binary(t, "0.1110100010110100001110010010100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111011010011100001111001E35");
    302      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    303      1.1  mrg   mpfr_set_prec(x, 214); mpfr_set_prec(t, 278); mpfr_set_prec(u, 207);
    304      1.1  mrg   mpfr_set_str_binary(x, "0.1000100110100110101101101101000000010000100111000001001110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E66");
    305      1.1  mrg   mpfr_set_str_binary(t, "-0.10001001101001101011011011010000000100001001110000010011100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111011111001001100011E66");
    306      1.1  mrg   test_add (u, x, t, MPFR_RNDN);
    307      1.1  mrg   mpfr_set_prec(x, 32); mpfr_set_prec(t, 247); mpfr_set_prec(u, 223);
    308      1.1  mrg   mpfr_set_str_binary(x, "0.10000000000000000000000000000000E1");
    309      1.1  mrg   mpfr_set_str_binary(t, "0.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000110001110100000100011110000101110110011101110100110110111111011010111100100000000000000000000000000E0");
    310      1.1  mrg   mpfr_sub(u, x, t, MPFR_RNDN);
    311      1.1  mrg   if ((MPFR_MANT(u)[(MPFR_PREC(u)-1)/mp_bits_per_limb] &
    312      1.1  mrg        ((mp_limb_t)1<<(mp_bits_per_limb-1)))==0)
    313      1.1  mrg     {
    314      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (2)\n");
    315      1.1  mrg       exit (1);
    316      1.1  mrg     }
    317      1.1  mrg 
    318      1.1  mrg   /* bug found by Nathalie Revol, 21 March 2001 */
    319      1.1  mrg   mpfr_set_prec (x, 65);
    320      1.1  mrg   mpfr_set_prec (t, 65);
    321      1.1  mrg   mpfr_set_prec (u, 65);
    322      1.1  mrg   mpfr_set_str_binary (x, "0.11100100101101001100111011111111110001101001000011101001001010010E-35");
    323      1.1  mrg   mpfr_set_str_binary (t, "0.10000000000000000000000000000000000001110010010110100110011110000E1");
    324      1.1  mrg   mpfr_sub (u, t, x, MPFR_RNDU);
    325      1.1  mrg   if ((MPFR_MANT(u)[(MPFR_PREC(u)-1)/mp_bits_per_limb] &
    326      1.1  mrg        ((mp_limb_t)1<<(mp_bits_per_limb-1)))==0)
    327      1.1  mrg     {
    328      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (3)\n");
    329      1.1  mrg       exit (1);
    330      1.1  mrg     }
    331      1.1  mrg 
    332      1.1  mrg   /* bug found by Fabrice Rouillier, 27 Mar 2001 */
    333      1.1  mrg   mpfr_set_prec (x, 107);
    334      1.1  mrg   mpfr_set_prec (t, 107);
    335      1.1  mrg   mpfr_set_prec (u, 107);
    336      1.1  mrg   mpfr_set_str_binary (x, "0.10111001001111010010001000000010111111011011011101000001001000101000000000000000000000000000000000000000000E315");
    337      1.1  mrg   mpfr_set_str_binary (t, "0.10000000000000000000000000000000000101110100100101110110000001100101011111001000011101111100100100111011000E350");
    338      1.1  mrg   mpfr_sub (u, x, t, MPFR_RNDU);
    339      1.1  mrg   if ((MPFR_MANT(u)[(MPFR_PREC(u)-1)/mp_bits_per_limb] &
    340      1.1  mrg        ((mp_limb_t)1<<(mp_bits_per_limb-1)))==0)
    341      1.1  mrg     {
    342      1.1  mrg       printf ("Error in mpfr_sub: result is not msb-normalized (4)\n");
    343      1.1  mrg       exit (1);
    344      1.1  mrg     }
    345      1.1  mrg 
    346      1.1  mrg   /* checks that NaN flag is correctly reset */
    347      1.1  mrg   mpfr_set_ui (t, 1, MPFR_RNDN);
    348      1.1  mrg   mpfr_set_ui (u, 1, MPFR_RNDN);
    349      1.1  mrg   mpfr_set_nan (x);
    350      1.1  mrg   test_add (x, t, u, MPFR_RNDN);
    351      1.1  mrg   if (mpfr_cmp_ui (x, 2))
    352      1.1  mrg     {
    353      1.1  mrg       printf ("Error in mpfr_add: 1+1 gives ");
    354      1.1  mrg       mpfr_out_str(stdout, 10, 0, x, MPFR_RNDN);
    355      1.1  mrg       exit (1);
    356      1.1  mrg     }
    357      1.1  mrg 
    358      1.1  mrg   mpfr_clear(x); mpfr_clear(t); mpfr_clear(u);
    359      1.1  mrg }
    360      1.1  mrg 
    361      1.1  mrg /* check case when c does not overlap with a, but both b and c count
    362      1.1  mrg    for rounding */
    363      1.1  mrg static void
    364      1.1  mrg check_case_1b (void)
    365      1.1  mrg {
    366      1.1  mrg   mpfr_t a, b, c;
    367      1.1  mrg   unsigned int prec_a, prec_b, prec_c, dif;
    368      1.1  mrg 
    369      1.1  mrg   mpfr_init (a);
    370      1.1  mrg   mpfr_init (b);
    371      1.1  mrg   mpfr_init (c);
    372      1.1  mrg 
    373      1.1  mrg     {
    374      1.1  mrg       prec_a = MPFR_PREC_MIN + (randlimb () % 63);
    375      1.1  mrg       mpfr_set_prec (a, prec_a);
    376      1.1  mrg       for (prec_b = prec_a + 2; prec_b <= 64; prec_b++)
    377      1.1  mrg         {
    378      1.1  mrg           dif = prec_b - prec_a;
    379      1.1  mrg           mpfr_set_prec (b, prec_b);
    380      1.1  mrg           /* b = 1 - 2^(-prec_a) + 2^(-prec_b) */
    381      1.1  mrg           mpfr_set_ui (b, 1, MPFR_RNDN);
    382      1.1  mrg           mpfr_div_2exp (b, b, dif, MPFR_RNDN);
    383      1.1  mrg           mpfr_sub_ui (b, b, 1, MPFR_RNDN);
    384      1.1  mrg           mpfr_div_2exp (b, b, prec_a, MPFR_RNDN);
    385      1.1  mrg           mpfr_add_ui (b, b, 1, MPFR_RNDN);
    386      1.1  mrg           for (prec_c = dif; prec_c <= 64; prec_c++)
    387      1.1  mrg             {
    388      1.1  mrg               /* c = 2^(-prec_a) - 2^(-prec_b) */
    389      1.1  mrg               mpfr_set_prec (c, prec_c);
    390      1.1  mrg               mpfr_set_si (c, -1, MPFR_RNDN);
    391      1.1  mrg               mpfr_div_2exp (c, c, dif, MPFR_RNDN);
    392      1.1  mrg               mpfr_add_ui (c, c, 1, MPFR_RNDN);
    393      1.1  mrg               mpfr_div_2exp (c, c, prec_a, MPFR_RNDN);
    394      1.1  mrg               test_add (a, b, c, MPFR_RNDN);
    395      1.1  mrg               if (mpfr_cmp_ui (a, 1) != 0)
    396      1.1  mrg                 {
    397      1.1  mrg                   printf ("case (1b) failed for prec_a=%u, prec_b=%u,"
    398      1.1  mrg                           " prec_c=%u\n", prec_a, prec_b, prec_c);
    399      1.1  mrg                   printf ("b="); mpfr_print_binary(b); puts ("");
    400      1.1  mrg                   printf ("c="); mpfr_print_binary(c); puts ("");
    401      1.1  mrg                   printf ("a="); mpfr_print_binary(a); puts ("");
    402      1.1  mrg                   exit (1);
    403      1.1  mrg                 }
    404      1.1  mrg             }
    405      1.1  mrg         }
    406      1.1  mrg     }
    407      1.1  mrg 
    408      1.1  mrg   mpfr_clear (a);
    409      1.1  mrg   mpfr_clear (b);
    410      1.1  mrg   mpfr_clear (c);
    411      1.1  mrg }
    412      1.1  mrg 
    413      1.1  mrg /* check case when c overlaps with a */
    414      1.1  mrg static void
    415      1.1  mrg check_case_2 (void)
    416      1.1  mrg {
    417      1.1  mrg   mpfr_t a, b, c, d;
    418      1.1  mrg 
    419      1.1  mrg   mpfr_init2 (a, 300);
    420      1.1  mrg   mpfr_init2 (b, 800);
    421      1.1  mrg   mpfr_init2 (c, 500);
    422      1.1  mrg   mpfr_init2 (d, 800);
    423      1.1  mrg 
    424      1.1  mrg   mpfr_set_str_binary(a, "1E110");  /* a = 2^110 */
    425      1.1  mrg   mpfr_set_str_binary(b, "1E900");  /* b = 2^900 */
    426      1.1  mrg   mpfr_set_str_binary(c, "1E500");  /* c = 2^500 */
    427      1.1  mrg   test_add (c, c, a, MPFR_RNDZ);   /* c = 2^500 + 2^110 */
    428      1.1  mrg   mpfr_sub (d, b, c, MPFR_RNDZ);   /* d = 2^900 - 2^500 - 2^110 */
    429      1.1  mrg   test_add (b, b, c, MPFR_RNDZ);   /* b = 2^900 + 2^500 + 2^110 */
    430      1.1  mrg   test_add (a, b, d, MPFR_RNDZ);   /* a = 2^901 */
    431      1.1  mrg   if (mpfr_cmp_ui_2exp (a, 1, 901))
    432      1.1  mrg     {
    433      1.1  mrg       printf ("b + d fails for b=2^900+2^500+2^110, d=2^900-2^500-2^110\n");
    434      1.1  mrg       printf ("expected 1.0e901, got ");
    435      1.1  mrg       mpfr_out_str (stdout, 2, 0, a, MPFR_RNDN);
    436      1.1  mrg       printf ("\n");
    437      1.1  mrg       exit (1);
    438      1.1  mrg     }
    439      1.1  mrg 
    440      1.1  mrg   mpfr_clear (a);
    441      1.1  mrg   mpfr_clear (b);
    442      1.1  mrg   mpfr_clear (c);
    443      1.1  mrg   mpfr_clear (d);
    444      1.1  mrg }
    445      1.1  mrg 
    446      1.1  mrg /* checks when source and destination are equal */
    447      1.1  mrg static void
    448      1.1  mrg check_same (void)
    449      1.1  mrg {
    450      1.1  mrg   mpfr_t x;
    451      1.1  mrg 
    452      1.1  mrg   mpfr_init(x); mpfr_set_ui(x, 1, MPFR_RNDZ);
    453      1.1  mrg   test_add (x, x, x, MPFR_RNDZ);
    454      1.1  mrg   if (mpfr_cmp_ui (x, 2))
    455      1.1  mrg     {
    456      1.1  mrg       printf ("Error when all 3 operands are equal\n");
    457      1.1  mrg       exit (1);
    458      1.1  mrg     }
    459      1.1  mrg   mpfr_clear(x);
    460      1.1  mrg }
    461      1.1  mrg 
    462      1.1  mrg #define check53(x, y, r, z) check(x, y, r, 53, 53, 53, z)
    463      1.1  mrg 
    464      1.1  mrg #define MAX_PREC 256
    465      1.1  mrg 
    466      1.1  mrg static void
    467      1.1  mrg check_inexact (void)
    468      1.1  mrg {
    469      1.1  mrg   mpfr_t x, y, z, u;
    470      1.1  mrg   mpfr_prec_t px, py, pu, pz;
    471      1.1  mrg   int inexact, cmp;
    472      1.1  mrg   mpfr_rnd_t rnd;
    473      1.1  mrg 
    474      1.1  mrg   mpfr_init (x);
    475      1.1  mrg   mpfr_init (y);
    476      1.1  mrg   mpfr_init (z);
    477      1.1  mrg   mpfr_init (u);
    478      1.1  mrg 
    479      1.1  mrg   mpfr_set_prec (x, 2);
    480      1.1  mrg   mpfr_set_str_binary (x, "0.1E-4");
    481      1.1  mrg   mpfr_set_prec (u, 33);
    482      1.1  mrg   mpfr_set_str_binary (u, "0.101110100101101100000000111100000E-1");
    483      1.1  mrg   mpfr_set_prec (y, 31);
    484      1.1  mrg   if ((inexact = test_add (y, x, u, MPFR_RNDN)))
    485      1.1  mrg     {
    486      1.1  mrg       printf ("Wrong inexact flag (2): expected 0, got %d\n", inexact);
    487      1.1  mrg       exit (1);
    488      1.1  mrg     }
    489      1.1  mrg 
    490      1.1  mrg   mpfr_set_prec (x, 2);
    491      1.1  mrg   mpfr_set_str_binary (x, "0.1E-4");
    492      1.1  mrg   mpfr_set_prec (u, 33);
    493      1.1  mrg   mpfr_set_str_binary (u, "0.101110100101101100000000111100000E-1");
    494      1.1  mrg   mpfr_set_prec (y, 28);
    495      1.1  mrg   if ((inexact = test_add (y, x, u, MPFR_RNDN)))
    496      1.1  mrg     {
    497      1.1  mrg       printf ("Wrong inexact flag (1): expected 0, got %d\n", inexact);
    498      1.1  mrg       exit (1);
    499      1.1  mrg     }
    500      1.1  mrg 
    501      1.1  mrg   for (px=2; px<MAX_PREC; px++)
    502      1.1  mrg     {
    503      1.1  mrg       mpfr_set_prec (x, px);
    504      1.1  mrg       do
    505      1.1  mrg         {
    506      1.1  mrg           mpfr_urandomb (x, RANDS);
    507      1.1  mrg         }
    508      1.1  mrg       while (mpfr_cmp_ui (x, 0) == 0);
    509      1.1  mrg       for (pu=2; pu<MAX_PREC; pu++)
    510      1.1  mrg         {
    511      1.1  mrg           mpfr_set_prec (u, pu);
    512      1.1  mrg           do
    513      1.1  mrg             {
    514      1.1  mrg               mpfr_urandomb (u, RANDS);
    515      1.1  mrg             }
    516      1.1  mrg           while (mpfr_cmp_ui (u, 0) == 0);
    517      1.1  mrg           {
    518      1.1  mrg               py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - 1));
    519      1.1  mrg               mpfr_set_prec (y, py);
    520      1.1  mrg               pz =  (mpfr_cmpabs (x, u) >= 0) ? MPFR_EXP(x) - MPFR_EXP(u)
    521      1.1  mrg                 : MPFR_EXP(u) - MPFR_EXP(x);
    522      1.1  mrg               /* x + u is exactly representable with precision
    523      1.1  mrg                  abs(EXP(x)-EXP(u)) + max(prec(x), prec(u)) + 1 */
    524      1.1  mrg               pz = pz + MAX(MPFR_PREC(x), MPFR_PREC(u)) + 1;
    525      1.1  mrg               mpfr_set_prec (z, pz);
    526      1.1  mrg               rnd = RND_RAND ();
    527      1.1  mrg               if (test_add (z, x, u, rnd))
    528      1.1  mrg                 {
    529      1.1  mrg                   printf ("z <- x + u should be exact\n");
    530      1.1  mrg                   printf ("x="); mpfr_print_binary (x); puts ("");
    531      1.1  mrg                   printf ("u="); mpfr_print_binary (u); puts ("");
    532      1.1  mrg                   printf ("z="); mpfr_print_binary (z); puts ("");
    533      1.1  mrg                   exit (1);
    534      1.1  mrg                 }
    535      1.1  mrg                 {
    536      1.1  mrg                   rnd = RND_RAND ();
    537      1.1  mrg                   inexact = test_add (y, x, u, rnd);
    538      1.1  mrg                   cmp = mpfr_cmp (y, z);
    539      1.1  mrg                   if (((inexact == 0) && (cmp != 0)) ||
    540      1.1  mrg                       ((inexact > 0) && (cmp <= 0)) ||
    541      1.1  mrg                       ((inexact < 0) && (cmp >= 0)))
    542      1.1  mrg                     {
    543      1.1  mrg                       printf ("Wrong inexact flag for rnd=%s\n",
    544      1.1  mrg                               mpfr_print_rnd_mode(rnd));
    545      1.1  mrg                       printf ("expected %d, got %d\n", cmp, inexact);
    546      1.1  mrg                       printf ("x="); mpfr_print_binary (x); puts ("");
    547      1.1  mrg                       printf ("u="); mpfr_print_binary (u); puts ("");
    548      1.1  mrg                       printf ("y=  "); mpfr_print_binary (y); puts ("");
    549      1.1  mrg                       printf ("x+u="); mpfr_print_binary (z); puts ("");
    550      1.1  mrg                       exit (1);
    551      1.1  mrg                     }
    552      1.1  mrg                 }
    553      1.1  mrg             }
    554      1.1  mrg         }
    555      1.1  mrg     }
    556      1.1  mrg 
    557      1.1  mrg   mpfr_clear (x);
    558      1.1  mrg   mpfr_clear (y);
    559      1.1  mrg   mpfr_clear (z);
    560      1.1  mrg   mpfr_clear (u);
    561      1.1  mrg }
    562      1.1  mrg 
    563      1.1  mrg static void
    564      1.1  mrg check_nans (void)
    565      1.1  mrg {
    566      1.1  mrg   mpfr_t  s, x, y;
    567      1.1  mrg 
    568      1.1  mrg   mpfr_init2 (x, 8L);
    569      1.1  mrg   mpfr_init2 (y, 8L);
    570      1.1  mrg   mpfr_init2 (s, 8L);
    571      1.1  mrg 
    572      1.1  mrg   /* +inf + -inf == nan */
    573      1.1  mrg   mpfr_set_inf (x, 1);
    574      1.1  mrg   mpfr_set_inf (y, -1);
    575      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    576      1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (s));
    577      1.1  mrg 
    578      1.1  mrg   /* +inf + 1 == +inf */
    579      1.1  mrg   mpfr_set_inf (x, 1);
    580      1.1  mrg   mpfr_set_ui (y, 1L, MPFR_RNDN);
    581      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    582      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    583      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) > 0);
    584      1.1  mrg 
    585      1.1  mrg   /* -inf + 1 == -inf */
    586      1.1  mrg   mpfr_set_inf (x, -1);
    587      1.1  mrg   mpfr_set_ui (y, 1L, MPFR_RNDN);
    588      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    589      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    590      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) < 0);
    591      1.1  mrg 
    592      1.1  mrg   /* 1 + +inf == +inf */
    593      1.1  mrg   mpfr_set_ui (x, 1L, MPFR_RNDN);
    594      1.1  mrg   mpfr_set_inf (y, 1);
    595      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    596      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    597      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) > 0);
    598      1.1  mrg 
    599      1.1  mrg   /* 1 + -inf == -inf */
    600      1.1  mrg   mpfr_set_ui (x, 1L, MPFR_RNDN);
    601      1.1  mrg   mpfr_set_inf (y, -1);
    602      1.1  mrg   test_add (s, x, y, MPFR_RNDN);
    603      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (s));
    604      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (s) < 0);
    605      1.1  mrg 
    606      1.1  mrg   mpfr_clear (x);
    607      1.1  mrg   mpfr_clear (y);
    608      1.1  mrg   mpfr_clear (s);
    609      1.1  mrg }
    610      1.1  mrg 
    611      1.1  mrg static void
    612      1.1  mrg check_alloc (void)
    613      1.1  mrg {
    614      1.1  mrg   mpfr_t a;
    615      1.1  mrg 
    616      1.1  mrg   mpfr_init2 (a, 10000);
    617      1.1  mrg   mpfr_set_prec (a, 53);
    618      1.1  mrg   mpfr_set_ui (a, 15236, MPFR_RNDN);
    619      1.1  mrg   test_add (a, a, a, MPFR_RNDN);
    620      1.1  mrg   mpfr_mul (a, a, a, MPFR_RNDN);
    621      1.1  mrg   mpfr_div (a, a, a, MPFR_RNDN);
    622      1.1  mrg   mpfr_sub (a, a, a, MPFR_RNDN);
    623      1.1  mrg   mpfr_clear (a);
    624      1.1  mrg }
    625      1.1  mrg 
    626      1.1  mrg static void
    627      1.1  mrg check_overflow (void)
    628      1.1  mrg {
    629      1.1  mrg   mpfr_t a, b, c;
    630      1.1  mrg   mpfr_prec_t prec_a;
    631      1.1  mrg   int r;
    632      1.1  mrg 
    633      1.1  mrg   mpfr_init2 (a, 256);
    634      1.1  mrg   mpfr_init2 (b, 256);
    635      1.1  mrg   mpfr_init2 (c, 256);
    636      1.1  mrg 
    637      1.1  mrg   mpfr_set_ui (b, 1, MPFR_RNDN);
    638      1.1  mrg   mpfr_setmax (b, mpfr_get_emax ());
    639      1.1  mrg   mpfr_set_ui (c, 1, MPFR_RNDN);
    640      1.1  mrg   mpfr_set_exp (c, mpfr_get_emax () - 192);
    641      1.1  mrg   RND_LOOP(r)
    642      1.1  mrg     for (prec_a = 128; prec_a < 512; prec_a += 64)
    643      1.1  mrg       {
    644      1.1  mrg         mpfr_set_prec (a, prec_a);
    645      1.1  mrg         mpfr_clear_overflow ();
    646      1.1  mrg         test_add (a, b, c, (mpfr_rnd_t) r);
    647      1.1  mrg         if (!mpfr_overflow_p ())
    648      1.1  mrg           {
    649      1.1  mrg             printf ("No overflow in check_overflow\n");
    650      1.1  mrg             exit (1);
    651      1.1  mrg           }
    652      1.1  mrg       }
    653      1.1  mrg 
    654      1.1  mrg   mpfr_set_exp (c, mpfr_get_emax () - 512);
    655      1.1  mrg   mpfr_set_prec (a, 256);
    656      1.1  mrg   mpfr_clear_overflow ();
    657      1.1  mrg   test_add (a, b, c, MPFR_RNDU);
    658      1.1  mrg   if (!mpfr_overflow_p ())
    659      1.1  mrg     {
    660      1.1  mrg       printf ("No overflow in check_overflow\n");
    661      1.1  mrg       exit (1);
    662      1.1  mrg     }
    663      1.1  mrg 
    664      1.1  mrg   mpfr_clear (a);
    665      1.1  mrg   mpfr_clear (b);
    666      1.1  mrg   mpfr_clear (c);
    667      1.1  mrg }
    668      1.1  mrg 
    669      1.1  mrg static void
    670      1.1  mrg check_1111 (void)
    671      1.1  mrg {
    672      1.1  mrg   mpfr_t one;
    673      1.1  mrg   long n;
    674      1.1  mrg 
    675      1.1  mrg   mpfr_init2 (one, MPFR_PREC_MIN);
    676      1.1  mrg   mpfr_set_ui (one, 1, MPFR_RNDN);
    677  1.1.1.2  mrg   for (n = 0; n < N; n++)
    678      1.1  mrg     {
    679      1.1  mrg       mpfr_prec_t prec_a, prec_b, prec_c;
    680      1.1  mrg       mpfr_exp_t tb=0, tc, diff;
    681      1.1  mrg       mpfr_t a, b, c, s;
    682      1.1  mrg       int m = 512;
    683      1.1  mrg       int sb, sc;
    684      1.1  mrg       int inex_a, inex_s;
    685      1.1  mrg       mpfr_rnd_t rnd_mode;
    686      1.1  mrg 
    687      1.1  mrg       prec_a = MPFR_PREC_MIN + (randlimb () % m);
    688      1.1  mrg       prec_b = MPFR_PREC_MIN + (randlimb () % m);
    689      1.1  mrg       prec_c = MPFR_PREC_MIN + (randlimb () % m);
    690      1.1  mrg       mpfr_init2 (a, prec_a);
    691      1.1  mrg       mpfr_init2 (b, prec_b);
    692      1.1  mrg       mpfr_init2 (c, prec_c);
    693      1.1  mrg       sb = randlimb () % 3;
    694      1.1  mrg       if (sb != 0)
    695      1.1  mrg         {
    696      1.1  mrg           tb = 1 + (randlimb () % (prec_b - (sb != 2)));
    697      1.1  mrg           mpfr_div_2ui (b, one, tb, MPFR_RNDN);
    698      1.1  mrg           if (sb == 2)
    699      1.1  mrg             mpfr_neg (b, b, MPFR_RNDN);
    700      1.1  mrg           test_add (b, b, one, MPFR_RNDN);
    701      1.1  mrg         }
    702      1.1  mrg       else
    703      1.1  mrg         mpfr_set (b, one, MPFR_RNDN);
    704      1.1  mrg       tc = 1 + (randlimb () % (prec_c - 1));
    705      1.1  mrg       mpfr_div_2ui (c, one, tc, MPFR_RNDN);
    706      1.1  mrg       sc = randlimb () % 2;
    707      1.1  mrg       if (sc)
    708      1.1  mrg         mpfr_neg (c, c, MPFR_RNDN);
    709      1.1  mrg       test_add (c, c, one, MPFR_RNDN);
    710      1.1  mrg       diff = (randlimb () % (2*m)) - m;
    711      1.1  mrg       mpfr_mul_2si (c, c, diff, MPFR_RNDN);
    712      1.1  mrg       rnd_mode = RND_RAND ();
    713      1.1  mrg       inex_a = test_add (a, b, c, rnd_mode);
    714      1.1  mrg       mpfr_init2 (s, MPFR_PREC_MIN + 2*m);
    715      1.1  mrg       inex_s = test_add (s, b, c, MPFR_RNDN); /* exact */
    716      1.1  mrg       if (inex_s)
    717      1.1  mrg         {
    718      1.1  mrg           printf ("check_1111: result should have been exact.\n");
    719      1.1  mrg           exit (1);
    720      1.1  mrg         }
    721      1.1  mrg       inex_s = mpfr_prec_round (s, prec_a, rnd_mode);
    722      1.1  mrg       if ((inex_a < 0 && inex_s >= 0) ||
    723      1.1  mrg           (inex_a == 0 && inex_s != 0) ||
    724      1.1  mrg           (inex_a > 0 && inex_s <= 0) ||
    725      1.1  mrg           !mpfr_equal_p (a, s))
    726      1.1  mrg         {
    727      1.1  mrg           printf ("check_1111: results are different.\n");
    728      1.1  mrg           printf ("prec_a = %d, prec_b = %d, prec_c = %d\n",
    729      1.1  mrg                   (int) prec_a, (int) prec_b, (int) prec_c);
    730      1.1  mrg           printf ("tb = %d, tc = %d, diff = %d, rnd = %s\n",
    731      1.1  mrg                   (int) tb, (int) tc, (int) diff,
    732      1.1  mrg                   mpfr_print_rnd_mode (rnd_mode));
    733      1.1  mrg           printf ("sb = %d, sc = %d\n", sb, sc);
    734      1.1  mrg           printf ("a = "); mpfr_print_binary (a); puts ("");
    735      1.1  mrg           printf ("s = "); mpfr_print_binary (s); puts ("");
    736      1.1  mrg           printf ("inex_a = %d, inex_s = %d\n", inex_a, inex_s);
    737      1.1  mrg           exit (1);
    738      1.1  mrg         }
    739      1.1  mrg       mpfr_clear (a);
    740      1.1  mrg       mpfr_clear (b);
    741      1.1  mrg       mpfr_clear (c);
    742      1.1  mrg       mpfr_clear (s);
    743      1.1  mrg     }
    744      1.1  mrg   mpfr_clear (one);
    745      1.1  mrg }
    746      1.1  mrg 
    747      1.1  mrg static void
    748      1.1  mrg check_1minuseps (void)
    749      1.1  mrg {
    750      1.1  mrg   static mpfr_prec_t prec_a[] = {
    751      1.1  mrg     MPFR_PREC_MIN, 30, 31, 32, 33, 62, 63, 64, 65, 126, 127, 128, 129
    752      1.1  mrg   };
    753      1.1  mrg   static int supp_b[] = {
    754      1.1  mrg     0, 1, 2, 3, 4, 29, 30, 31, 32, 33, 34, 35, 61, 62, 63, 64, 65, 66, 67
    755      1.1  mrg   };
    756      1.1  mrg   mpfr_t a, b, c;
    757      1.1  mrg   unsigned int ia, ib, ic;
    758      1.1  mrg 
    759      1.1  mrg   mpfr_init2 (c, MPFR_PREC_MIN);
    760      1.1  mrg 
    761      1.1  mrg   for (ia = 0; ia < numberof (prec_a); ia++)
    762      1.1  mrg     for (ib = 0; ib < numberof(supp_b); ib++)
    763      1.1  mrg       {
    764      1.1  mrg         mpfr_prec_t prec_b;
    765      1.1  mrg         int rnd_mode;
    766      1.1  mrg 
    767      1.1  mrg         prec_b = prec_a[ia] + supp_b[ib];
    768      1.1  mrg 
    769      1.1  mrg         mpfr_init2 (a, prec_a[ia]);
    770      1.1  mrg         mpfr_init2 (b, prec_b);
    771      1.1  mrg 
    772      1.1  mrg         mpfr_set_ui (c, 1, MPFR_RNDN);
    773      1.1  mrg         mpfr_div_ui (b, c, prec_a[ia], MPFR_RNDN);
    774      1.1  mrg         mpfr_sub (b, c, b, MPFR_RNDN);  /* b = 1 - 2^(-prec_a) */
    775      1.1  mrg 
    776      1.1  mrg         for (ic = 0; ic < numberof(supp_b); ic++)
    777      1.1  mrg           for (rnd_mode = 0; rnd_mode < MPFR_RND_MAX; rnd_mode++)
    778      1.1  mrg             {
    779      1.1  mrg               mpfr_t s;
    780      1.1  mrg               int inex_a, inex_s;
    781      1.1  mrg 
    782      1.1  mrg               mpfr_set_ui (c, 1, MPFR_RNDN);
    783      1.1  mrg               mpfr_div_ui (c, c, prec_a[ia] + supp_b[ic], MPFR_RNDN);
    784      1.1  mrg               inex_a = test_add (a, b, c, (mpfr_rnd_t) rnd_mode);
    785      1.1  mrg               mpfr_init2 (s, 256);
    786      1.1  mrg               inex_s = test_add (s, b, c, MPFR_RNDN); /* exact */
    787      1.1  mrg               if (inex_s)
    788      1.1  mrg                 {
    789      1.1  mrg                   printf ("check_1minuseps: result should have been exact "
    790      1.1  mrg                           "(ia = %u, ib = %u, ic = %u)\n", ia, ib, ic);
    791      1.1  mrg                   exit (1);
    792      1.1  mrg                 }
    793      1.1  mrg               inex_s = mpfr_prec_round (s, prec_a[ia], (mpfr_rnd_t) rnd_mode);
    794      1.1  mrg               if ((inex_a < 0 && inex_s >= 0) ||
    795      1.1  mrg                   (inex_a == 0 && inex_s != 0) ||
    796      1.1  mrg                   (inex_a > 0 && inex_s <= 0) ||
    797      1.1  mrg                   !mpfr_equal_p (a, s))
    798      1.1  mrg                 {
    799      1.1  mrg                   printf ("check_1minuseps: results are different.\n");
    800      1.1  mrg                   printf ("ia = %u, ib = %u, ic = %u\n", ia, ib, ic);
    801      1.1  mrg                   exit (1);
    802      1.1  mrg                 }
    803      1.1  mrg               mpfr_clear (s);
    804      1.1  mrg             }
    805      1.1  mrg 
    806      1.1  mrg         mpfr_clear (a);
    807      1.1  mrg         mpfr_clear (b);
    808      1.1  mrg       }
    809      1.1  mrg 
    810      1.1  mrg   mpfr_clear (c);
    811      1.1  mrg }
    812      1.1  mrg 
    813      1.1  mrg /* Test case bk == 0 in add1.c (b has entirely been read and
    814      1.1  mrg    c hasn't been taken into account). */
    815      1.1  mrg static void
    816      1.1  mrg coverage_bk_eq_0 (void)
    817      1.1  mrg {
    818      1.1  mrg   mpfr_t a, b, c;
    819      1.1  mrg   int inex;
    820      1.1  mrg 
    821      1.1  mrg   mpfr_init2 (a, GMP_NUMB_BITS);
    822      1.1  mrg   mpfr_init2 (b, 2 * GMP_NUMB_BITS);
    823      1.1  mrg   mpfr_init2 (c, GMP_NUMB_BITS);
    824      1.1  mrg 
    825      1.1  mrg   mpfr_set_ui_2exp (b, 1, 2 * GMP_NUMB_BITS, MPFR_RNDN);
    826      1.1  mrg   mpfr_sub_ui (b, b, 1, MPFR_RNDN);
    827      1.1  mrg   /* b = 111...111 (in base 2) where the 1's fit 2 whole limbs */
    828      1.1  mrg 
    829      1.1  mrg   mpfr_set_ui_2exp (c, 1, -1, MPFR_RNDN);  /* c = 1/2 */
    830      1.1  mrg 
    831      1.1  mrg   inex = mpfr_add (a, b, c, MPFR_RNDU);
    832      1.1  mrg   mpfr_set_ui_2exp (c, 1, 2 * GMP_NUMB_BITS, MPFR_RNDN);
    833      1.1  mrg   if (! mpfr_equal_p (a, c))
    834      1.1  mrg     {
    835      1.1  mrg       printf ("Error in coverage_bk_eq_0\n");
    836      1.1  mrg       printf ("Expected ");
    837      1.1  mrg       mpfr_dump (c);
    838      1.1  mrg       printf ("Got      ");
    839      1.1  mrg       mpfr_dump (a);
    840      1.1  mrg       exit (1);
    841      1.1  mrg     }
    842      1.1  mrg   MPFR_ASSERTN (inex > 0);
    843      1.1  mrg 
    844      1.1  mrg   mpfr_clear (a);
    845      1.1  mrg   mpfr_clear (b);
    846      1.1  mrg   mpfr_clear (c);
    847      1.1  mrg }
    848      1.1  mrg 
    849      1.1  mrg static void
    850      1.1  mrg tests (void)
    851      1.1  mrg {
    852      1.1  mrg   check_alloc ();
    853      1.1  mrg   check_nans ();
    854      1.1  mrg   check_inexact ();
    855      1.1  mrg   check_case_1b ();
    856      1.1  mrg   check_case_2 ();
    857      1.1  mrg   check64();
    858      1.1  mrg   coverage_bk_eq_0 ();
    859      1.1  mrg 
    860      1.1  mrg   check("293607738.0", "1.9967571564050541e-5", MPFR_RNDU, 64, 53, 53,
    861      1.1  mrg         "2.9360773800002003e8");
    862      1.1  mrg   check("880524.0", "-2.0769715792901673e-5", MPFR_RNDN, 64, 53, 53,
    863      1.1  mrg         "8.8052399997923023e5");
    864      1.1  mrg   check("1196426492.0", "-1.4218093058435347e-3", MPFR_RNDN, 64, 53, 53,
    865      1.1  mrg         "1.1964264919985781e9");
    866      1.1  mrg   check("982013018.0", "-8.941829477291838e-7", MPFR_RNDN, 64, 53, 53,
    867      1.1  mrg         "9.8201301799999905e8");
    868      1.1  mrg   check("1092583421.0", "1.0880649218158844e9", MPFR_RNDN, 64, 53, 53,
    869      1.1  mrg         "2.1806483428158846e9");
    870      1.1  mrg   check("1.8476886419022969e-6", "961494401.0", MPFR_RNDN, 53, 64, 53,
    871      1.1  mrg         "9.6149440100000179e8");
    872      1.1  mrg   check("-2.3222118418069868e5", "1229318102.0", MPFR_RNDN, 53, 64, 53,
    873      1.1  mrg         "1.2290858808158193e9");
    874      1.1  mrg   check("-3.0399171300395734e-6", "874924868.0", MPFR_RNDN, 53, 64, 53,
    875      1.1  mrg         "8.749248679999969e8");
    876      1.1  mrg   check("9.064246624706179e1", "663787413.0", MPFR_RNDN, 53, 64, 53,
    877      1.1  mrg         "6.6378750364246619e8");
    878      1.1  mrg   check("-1.0954322421551264e2", "281806592.0", MPFR_RNDD, 53, 64, 53,
    879      1.1  mrg         "2.8180648245677572e8");
    880      1.1  mrg   check("5.9836930386056659e-8", "1016217213.0", MPFR_RNDN, 53, 64, 53,
    881      1.1  mrg         "1.0162172130000001e9");
    882      1.1  mrg   check("-1.2772161928500301e-7", "1237734238.0", MPFR_RNDN, 53, 64, 53,
    883      1.1  mrg         "1.2377342379999998e9");
    884      1.1  mrg   check("-4.567291988483277e8", "1262857194.0", MPFR_RNDN, 53, 64, 53,
    885      1.1  mrg         "8.0612799515167236e8");
    886      1.1  mrg   check("4.7719471752925262e7", "196089880.0", MPFR_RNDN, 53, 53, 53,
    887      1.1  mrg         "2.4380935175292528e8");
    888      1.1  mrg   check("4.7719471752925262e7", "196089880.0", MPFR_RNDN, 53, 64, 53,
    889      1.1  mrg         "2.4380935175292528e8");
    890      1.1  mrg   check("-1.716113812768534e-140", "1271212614.0", MPFR_RNDZ, 53, 64, 53,
    891      1.1  mrg         "1.2712126139999998e9");
    892      1.1  mrg   check("-1.2927455200185474e-50", "1675676122.0", MPFR_RNDD, 53, 64, 53,
    893      1.1  mrg         "1.6756761219999998e9");
    894      1.1  mrg 
    895      1.1  mrg   check53("1.22191250737771397120e+20", "948002822.0", MPFR_RNDN,
    896      1.1  mrg           "122191250738719408128.0");
    897      1.1  mrg   check53("9966027674114492.0", "1780341389094537.0", MPFR_RNDN,
    898      1.1  mrg           "11746369063209028.0");
    899      1.1  mrg   check53("2.99280481918991653800e+272", "5.34637717585790933424e+271",
    900      1.1  mrg           MPFR_RNDN, "3.5274425367757071711e272");
    901      1.1  mrg   check_same();
    902      1.1  mrg   check53("6.14384195492641560499e-02", "-6.14384195401037683237e-02",
    903      1.1  mrg           MPFR_RNDU, "9.1603877261370314499e-12");
    904      1.1  mrg   check53("1.16809465359248765399e+196", "7.92883212101990665259e+196",
    905      1.1  mrg           MPFR_RNDU, "9.0969267746123943065e196");
    906      1.1  mrg   check53("3.14553393112021279444e-67", "3.14553401015952024126e-67", MPFR_RNDU,
    907      1.1  mrg           "6.2910679412797336946e-67");
    908      1.1  mrg 
    909      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDN,
    910      1.1  mrg           "5.4388530464436950905e185");
    911      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDZ,
    912      1.1  mrg           "5.4388530464436944867e185");
    913      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDU,
    914      1.1  mrg           "5.4388530464436950905e185");
    915      1.1  mrg   check53("5.43885304644369509058e+185","-1.87427265794105342763e-57",MPFR_RNDD,
    916      1.1  mrg           "5.4388530464436944867e185");
    917      1.1  mrg 
    918      1.1  mrg   check2b("1.001010101110011000000010100101110010111001010000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e358",187,
    919      1.1  mrg           "-1.11100111001101100010001111111110101101110001000000000000000000000000000000000000000000e160",87,
    920      1.1  mrg           "1.001010101110011000000010100101110010111001010000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111e358",178,
    921      1.1  mrg           MPFR_RNDD);
    922      1.1  mrg   check2b("-1.111100100011100111010101010101001010100100000111001000000000000000000e481",70,
    923      1.1  mrg           "1.1111000110100011110101111110110010010000000110101000000000000000e481",65,
    924      1.1  mrg           "-1.001010111111101011010000001100011101100101000000000000000000e472",61,
    925      1.1  mrg           MPFR_RNDD);
    926      1.1  mrg   check2b("1.0100010111010000100101000000111110011100011001011010000000000000000000000000000000e516",83,
    927      1.1  mrg           "-1.1001111000100001011100000001001100110011110010111111000000e541",59,
    928      1.1  mrg           "-1.1001111000100001011011110111000001001011100000011110100000110001110011010011000000000000000000000000000000000000000000000000e541",125,
    929      1.1  mrg           MPFR_RNDZ);
    930      1.1  mrg   check2b("-1.0010111100000100110001011011010000000011000111101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e261",155,
    931      1.1  mrg           "-1.00111110100011e239",15,
    932      1.1  mrg           "-1.00101111000001001100101010101110001100110001111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e261",159,
    933      1.1  mrg           MPFR_RNDD);
    934      1.1  mrg   check2b("-1.110111000011111011000000001001111101101001010100111000000000000000000000000e880",76,
    935      1.1  mrg           "-1.1010010e-634",8,
    936      1.1  mrg           "-1.11011100001111101100000000100111110110100101010011100000000000000000000000e880",75,
    937      1.1  mrg           MPFR_RNDZ);
    938      1.1  mrg   check2b("1.00100100110110101001010010101111000001011100100101010000000000000000000000000000e-530",81,
    939      1.1  mrg           "-1.101101111100000111000011001010110011001011101001110100000e-908",58,
    940      1.1  mrg           "1.00100100110110101001010010101111000001011100100101010e-530",54,
    941      1.1  mrg           MPFR_RNDN);
    942      1.1  mrg   check2b("1.0101100010010111101000000001000010010010011000111011000000000000000000000000000000000000000000000000000000000000000000e374",119,
    943      1.1  mrg           "1.11100101100101e358",15,
    944      1.1  mrg           "1.01011000100110011000010110100100100100100110001110110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e374",150,
    945      1.1  mrg           MPFR_RNDZ);
    946      1.1  mrg   check2b("-1.10011001000010100000010100100110110010011111101111000000000000000000000000000000000000000000000000000000000000000000e-172",117,
    947      1.1  mrg           "1.111011100000101010110000100100110100100001001000011100000000e-173",61,
    948      1.1  mrg           "-1.0100010000001001010110011011101001001011101011110001000000000000000e-173",68,
    949      1.1  mrg           MPFR_RNDZ);
    950      1.1  mrg   check2b("-1.011110000111101011100001100110100011100101000011011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-189",175,
    951      1.1  mrg           "1.1e631",2,
    952      1.1  mrg           "1.011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111e631",115,
    953      1.1  mrg           MPFR_RNDZ);
    954      1.1  mrg   check2b("-1.101011101001011101100011001000001100010100001101011000000000000000000000000000000000000000000e-449",94,
    955      1.1  mrg           "-1.01111101010111000011000110011101000111001100110111100000000000000e-429",66,
    956      1.1  mrg           "-1.01111101010111000100110010000110100100101111111111101100010100001101011000000000000000000000000000000000000000e-429",111,
    957      1.1  mrg           MPFR_RNDU);
    958      1.1  mrg   check2b("-1.101011101001011101100011001000001100010100001101011000000000000000000000000000000000000000000e-449",94,
    959      1.1  mrg           "-1.01111101010111000011000110011101000111001100110111100000000000000e-429",66,
    960      1.1  mrg           "-1.01111101010111000100110010000110100100101111111111101100010100001101011000000000000000000000000000000000000000e-429",111,
    961      1.1  mrg           MPFR_RNDD);
    962      1.1  mrg   check2b("-1.1001000011101000110000111110010100100101110101111100000000000000000000000000000000000000000000000000000000e-72",107,
    963      1.1  mrg           "-1.001100011101100100010101101010101011010010111111010000000000000000000000000000e521",79,
    964      1.1  mrg           "-1.00110001110110010001010110101010101101001011111101000000000000000000000000000000000000000000000001e521",99,
    965      1.1  mrg           MPFR_RNDD);
    966      1.1  mrg   check2b("-1.01010001111000000101010100100100110101011011100001110000000000e498",63,
    967      1.1  mrg           "1.010000011010101111000100111100011100010101011110010100000000000e243",64,
    968      1.1  mrg           "-1.010100011110000001010101001001001101010110111000011100000000000e498",64,
    969      1.1  mrg           MPFR_RNDN);
    970      1.1  mrg   check2b("1.00101100010101000011010000011000111111011110010111000000000000000000000000000000000000000000000000000000000e178",108,
    971      1.1  mrg           "-1.10101101010101000110011011111001001101111111110000100000000e160",60,
    972      1.1  mrg           "1.00101100010100111100100011000011111001000010011101110010000000001111100000000000000000000000000000000000e178",105,
    973      1.1  mrg           MPFR_RNDN);
    974      1.1  mrg   check2b("1.00110011010100111110011010110100111101110101100100110000000000000000000000000000000000000000000000e559",99,
    975      1.1  mrg           "-1.011010110100111011100110100110011100000000111010011000000000000000e559",67,
    976      1.1  mrg           "-1.101111111101011111111111001001100100011100001001100000000000000000000000000000000000000000000e556",94,
    977      1.1  mrg           MPFR_RNDU);
    978      1.1  mrg   check2b("-1.100000111100101001100111011100011011000001101001111100000000000000000000000000e843",79,
    979      1.1  mrg           "-1.1101101010110000001001000100001100110011000110110111000000000000000000000000000000000000000000e414",95,
    980      1.1  mrg           "-1.1000001111001010011001110111000110110000011010100000e843",53,
    981      1.1  mrg           MPFR_RNDD);
    982      1.1  mrg   check2b("-1.110110010110100010100011000110111001010000010111110000000000e-415",61,
    983      1.1  mrg           "-1.0000100101100001111100110011111111110100011101101011000000000000000000e751",71,
    984      1.1  mrg           "-1.00001001011000011111001100111111111101000111011010110e751",54,
    985      1.1  mrg           MPFR_RNDN);
    986      1.1  mrg   check2b("-1.1011011011110001001101010101001000010100010110111101000000000000000000000e258",74,
    987      1.1  mrg           "-1.00011100010110110101001011000100100000100010101000010000000000000000000000000000000000000000000000e268",99,
    988      1.1  mrg           "-1.0001110011001001000011110001000111010110101011110010011011110100000000000000000000000000000000000000e268",101,
    989      1.1  mrg           MPFR_RNDD);
    990      1.1  mrg   check2b("-1.1011101010011101011000000100100110101101101110000001000000000e629",62,
    991      1.1  mrg           "1.111111100000011100100011100000011101100110111110111000000000000000000000000000000000000000000e525",94,
    992      1.1  mrg           "-1.101110101001110101100000010010011010110110111000000011111111111111111111111111111111111111111111111111101e629",106,
    993      1.1  mrg           MPFR_RNDD);
    994      1.1  mrg   check2b("1.111001000010001100010000001100000110001011110111011000000000000000000000000000000000000e152",88,
    995      1.1  mrg           "1.111110111001100100000100111111010111000100111111001000000000000000e152",67,
    996      1.1  mrg           "1.1110111111011110000010101001011011101010000110110100e153",53,
    997      1.1  mrg           MPFR_RNDN);
    998      1.1  mrg   check2b("1.000001100011110010110000110100001010101101111011110100e696",55,
    999      1.1  mrg           "-1.1011001111011100100001011110100101010101110111010101000000000000000000000000000000000000000000000000000000000000e730",113,
   1000      1.1  mrg           "-1.1011001111011100100001011110100100010100010011100010e730",53,
   1001      1.1  mrg           MPFR_RNDN);
   1002      1.1  mrg   check2b("-1.11010111100001001111000001110101010010001111111001100000000000000000000000000000000000000000000000000000000000e530",111,
   1003      1.1  mrg           "1.01110100010010000000010110111101011101000001111101100000000000000000000000000000000000000000000000e530",99,
   1004      1.1  mrg           "-1.1000110011110011101010101101111101010011011111000000000000000e528",62,
   1005      1.1  mrg           MPFR_RNDD);
   1006      1.1  mrg   check2b("-1.0001100010010100111101101011101000100100010011100011000000000000000000000000000000000000000000000000000000000e733",110,
   1007      1.1  mrg           "-1.001000000111110010100101010100110111001111011011001000000000000000000000000000000000000000000000000000000000e710",109,
   1008      1.1  mrg           "-1.000110001001010011111000111110110001110110011000110110e733",55,
   1009      1.1  mrg           MPFR_RNDN);
   1010      1.1  mrg   check2b("-1.1101011110000100111100000111010101001000111111100110000000000000000000000e530",74,
   1011      1.1  mrg           "1.01110100010010000000010110111101011101000001111101100000000000000000000000000000000000000000000000000000000000e530",111,
   1012      1.1  mrg           "-1.10001100111100111010101011011111010100110111110000000000000000000000000000e528",75,
   1013      1.1  mrg           MPFR_RNDU);
   1014      1.1  mrg   check2b("1.00110011010100111110011010110100111101110101100100110000000000000000000000000000000000000000000000e559",99,
   1015      1.1  mrg           "-1.011010110100111011100110100110011100000000111010011000000000000000e559",67,
   1016      1.1  mrg           "-1.101111111101011111111111001001100100011100001001100000000000000000000000000000000000000000000e556",94,
   1017      1.1  mrg           MPFR_RNDU);
   1018      1.1  mrg   check2b("-1.100101111110110000000110111111011010011101101111100100000000000000e-624",67,
   1019      1.1  mrg           "1.10111010101110100000010110101000000000010011100000100000000e-587",60,
   1020      1.1  mrg           "1.1011101010111010000001011010011111110100011110001011111111001000000100101100010010000011100000000000000000000e-587",110,
   1021      1.1  mrg           MPFR_RNDU);
   1022      1.1  mrg   check2b("-1.10011001000010100000010100100110110010011111101111000000000000000000000000000000000000000000000000000000000000000000e-172",117,
   1023      1.1  mrg           "1.111011100000101010110000100100110100100001001000011100000000e-173",61,
   1024      1.1  mrg           "-1.0100010000001001010110011011101001001011101011110001000000000000000e-173",68,
   1025      1.1  mrg           MPFR_RNDZ);
   1026      1.1  mrg   check2b("1.1000111000110010101001010011010011101100010110001001000000000000000000000000000000000000000000000000e167",101,
   1027      1.1  mrg           "1.0011110010000110000000101100100111000001110110110000000000000000000000000e167",74,
   1028      1.1  mrg           "1.01100101010111000101001111111111010101110001100111001000000000000000000000000000000000000000000000000000e168",105,
   1029      1.1  mrg           MPFR_RNDZ);
   1030      1.1  mrg   check2b("1.100101111111110010100101110111100001110000100001010000000000000000000000000000000000000000000000e808",97,
   1031      1.1  mrg           "-1.1110011001100000100000111111110000110010100111001011000000000000000000000000000000e807",83,
   1032      1.1  mrg           "1.01001001100110001100011111000000000001011010010111010000000000000000000000000000000000000000000e807",96,
   1033      1.1  mrg           MPFR_RNDN);
   1034      1.1  mrg   check2b("1e128",128,
   1035      1.1  mrg           "1e0",128,
   1036      1.1  mrg           "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0",256,
   1037      1.1  mrg           MPFR_RNDN);
   1038      1.1  mrg 
   1039      1.1  mrg   /* Checking double precision (53 bits) */
   1040      1.1  mrg   check53("-8.22183238641455905806e-19", "7.42227178769761587878e-19",MPFR_RNDD,
   1041      1.1  mrg           "-7.9956059871694317927e-20");
   1042      1.1  mrg   check53("5.82106394662028628236e+234","-5.21514064202368477230e+89",MPFR_RNDD,
   1043      1.1  mrg           "5.8210639466202855763e234");
   1044      1.1  mrg   check53("5.72931679569871602371e+122","-5.72886070363264321230e+122",
   1045      1.1  mrg           MPFR_RNDN, "4.5609206607281141508e118");
   1046      1.1  mrg   check53("-5.09937369394650450820e+238", "2.70203299854862982387e+250",
   1047      1.1  mrg           MPFR_RNDD, "2.7020329985435301323e250");
   1048      1.1  mrg   check53("-2.96695924472363684394e+27", "1.22842938251111500000e+16",MPFR_RNDD,
   1049      1.1  mrg           "-2.96695924471135255027e27");
   1050      1.1  mrg   check53("1.74693641655743793422e-227", "-7.71776956366861843469e-229",
   1051      1.1  mrg           MPFR_RNDN, "1.669758720920751867e-227");
   1052      1.1  mrg   /*  x = -7883040437021647.0; for (i=0; i<468; i++) x = x / 2.0;*/
   1053      1.1  mrg   check53("-1.03432206392780011159e-125", "1.30127034799251347548e-133",
   1054      1.1  mrg           MPFR_RNDN,
   1055      1.1  mrg           "-1.0343220509150965661100887242027378881805094180354e-125");
   1056      1.1  mrg   check53("1.05824655795525779205e+71", "-1.06022698059744327881e+71",MPFR_RNDZ,
   1057      1.1  mrg           "-1.9804226421854867632e68");
   1058      1.1  mrg   check53("-5.84204911040921732219e+240", "7.26658169050749590763e+240",
   1059      1.1  mrg           MPFR_RNDD, "1.4245325800982785854e240");
   1060      1.1  mrg   check53("1.00944884131046636376e+221","2.33809162651471520268e+215",MPFR_RNDN,
   1061      1.1  mrg           "1.0094511794020929787e221");
   1062      1.1  mrg   /*x = 7045852550057985.0; for (i=0; i<986; i++) x = x / 2.0;*/
   1063      1.1  mrg   check53("4.29232078932667367325e-278",
   1064      1.1  mrg           "1.0773525047389793833221116707010783793203080117586e-281"
   1065      1.1  mrg           , MPFR_RNDU, "4.2933981418314132787e-278");
   1066      1.1  mrg   check53("5.27584773801377058681e-80", "8.91207657803547196421e-91", MPFR_RNDN,
   1067      1.1  mrg           "5.2758477381028917269e-80");
   1068      1.1  mrg   check53("2.99280481918991653800e+272", "5.34637717585790933424e+271",
   1069      1.1  mrg           MPFR_RNDN, "3.5274425367757071711e272");
   1070      1.1  mrg   check53("4.67302514390488041733e-184", "2.18321376145645689945e-190",
   1071      1.1  mrg           MPFR_RNDN, "4.6730273271186420541e-184");
   1072      1.1  mrg   check53("5.57294120336300389254e+71", "2.60596167942024924040e+65", MPFR_RNDZ,
   1073      1.1  mrg           "5.5729438093246831053e71");
   1074      1.1  mrg   check53("6.6052588496951015469e24", "4938448004894539.0", MPFR_RNDU,
   1075      1.1  mrg           "6.6052588546335505068e24");
   1076      1.1  mrg   check53("1.23056185051606761523e-190", "1.64589756643433857138e-181",
   1077      1.1  mrg           MPFR_RNDU, "1.6458975676649006598e-181");
   1078      1.1  mrg   check53("2.93231171510175981584e-280", "3.26266919161341483877e-273",
   1079      1.1  mrg           MPFR_RNDU, "3.2626694848445867288e-273");
   1080      1.1  mrg   check53("5.76707395945001907217e-58", "4.74752971449827687074e-51", MPFR_RNDD,
   1081      1.1  mrg           "4.747530291205672325e-51");
   1082      1.1  mrg   check53("277363943109.0", "11.0", MPFR_RNDN, "277363943120.0");
   1083      1.1  mrg   check53("1.44791789689198883921e-140", "-1.90982880222349071284e-121",
   1084      1.1  mrg           MPFR_RNDN, "-1.90982880222349071e-121");
   1085      1.1  mrg 
   1086      1.1  mrg 
   1087      1.1  mrg   /* tests for particular cases (Vincent Lefevre, 22 Aug 2001) */
   1088      1.1  mrg   check53("9007199254740992.0", "1.0", MPFR_RNDN, "9007199254740992.0");
   1089      1.1  mrg   check53("9007199254740994.0", "1.0", MPFR_RNDN, "9007199254740996.0");
   1090      1.1  mrg   check53("9007199254740992.0", "-1.0", MPFR_RNDN, "9007199254740991.0");
   1091      1.1  mrg   check53("9007199254740994.0", "-1.0", MPFR_RNDN, "9007199254740992.0");
   1092      1.1  mrg   check53("9007199254740996.0", "-1.0", MPFR_RNDN, "9007199254740996.0");
   1093      1.1  mrg 
   1094      1.1  mrg   check_overflow ();
   1095      1.1  mrg   check_1111 ();
   1096      1.1  mrg   check_1minuseps ();
   1097      1.1  mrg }
   1098      1.1  mrg 
   1099      1.1  mrg #define TEST_FUNCTION test_add
   1100      1.1  mrg #define TWO_ARGS
   1101      1.1  mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
   1102      1.1  mrg #include "tgeneric.c"
   1103      1.1  mrg 
   1104      1.1  mrg int
   1105      1.1  mrg main (int argc, char *argv[])
   1106      1.1  mrg {
   1107      1.1  mrg   tests_start_mpfr ();
   1108      1.1  mrg 
   1109      1.1  mrg   usesp = 0;
   1110      1.1  mrg   tests ();
   1111      1.1  mrg 
   1112      1.1  mrg #ifndef CHECK_EXTERNAL /* no need to check twice */
   1113      1.1  mrg   usesp = 1;
   1114      1.1  mrg   tests ();
   1115      1.1  mrg #endif
   1116      1.1  mrg   test_generic (2, 1000, 100);
   1117      1.1  mrg 
   1118      1.1  mrg   tests_end_mpfr ();
   1119      1.1  mrg   return 0;
   1120      1.1  mrg }
   1121