Home | History | Annotate | Line # | Download | only in tests
tdiv.c revision 1.1.1.4
      1  1.1.1.2  mrg /* Test file for mpfr_div (and some mpfr_div_ui, etc. tests).
      2      1.1  mrg 
      3  1.1.1.4  mrg Copyright 1999, 2001-2018 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  mrg #include "mpfr-test.h"
     24      1.1  mrg 
     25  1.1.1.2  mrg static void
     26  1.1.1.2  mrg check_equal (mpfr_srcptr a, mpfr_srcptr a2, char *s,
     27  1.1.1.2  mrg              mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
     28  1.1.1.2  mrg {
     29  1.1.1.4  mrg   if (SAME_VAL (a, a2))
     30  1.1.1.4  mrg     return;
     31  1.1.1.4  mrg   if (r == MPFR_RNDF) /* RNDF might return different values */
     32  1.1.1.2  mrg     return;
     33  1.1.1.2  mrg   printf ("Error in %s\n", mpfr_print_rnd_mode (r));
     34  1.1.1.2  mrg   printf ("b  = ");
     35  1.1.1.2  mrg   mpfr_dump (b);
     36  1.1.1.2  mrg   printf ("c  = ");
     37  1.1.1.2  mrg   mpfr_dump (c);
     38  1.1.1.2  mrg   printf ("mpfr_div    result: ");
     39  1.1.1.2  mrg   mpfr_dump (a);
     40  1.1.1.2  mrg   printf ("%s result: ", s);
     41  1.1.1.2  mrg   mpfr_dump (a2);
     42  1.1.1.2  mrg   exit (1);
     43  1.1.1.2  mrg }
     44  1.1.1.2  mrg 
     45  1.1.1.2  mrg static int
     46  1.1.1.2  mrg mpfr_all_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
     47  1.1.1.2  mrg {
     48  1.1.1.2  mrg   mpfr_t a2;
     49  1.1.1.2  mrg   unsigned int oldflags, newflags;
     50  1.1.1.2  mrg   int inex, inex2;
     51  1.1.1.2  mrg 
     52  1.1.1.2  mrg   oldflags = __gmpfr_flags;
     53  1.1.1.2  mrg   inex = mpfr_div (a, b, c, r);
     54  1.1.1.2  mrg 
     55  1.1.1.4  mrg   /* this test makes no sense for RNDF, since it compares the ternary value
     56  1.1.1.4  mrg      and the flags */
     57  1.1.1.4  mrg   if (a == b || a == c || r == MPFR_RNDF)
     58  1.1.1.2  mrg     return inex;
     59  1.1.1.2  mrg 
     60  1.1.1.2  mrg   newflags = __gmpfr_flags;
     61  1.1.1.2  mrg 
     62  1.1.1.2  mrg   mpfr_init2 (a2, MPFR_PREC (a));
     63  1.1.1.2  mrg 
     64  1.1.1.2  mrg   if (mpfr_integer_p (b) && ! (MPFR_IS_ZERO (b) && MPFR_IS_NEG (b)))
     65  1.1.1.2  mrg     {
     66  1.1.1.2  mrg       /* b is an integer, but not -0 (-0 is rejected as
     67  1.1.1.2  mrg          it becomes +0 when converted to an integer). */
     68  1.1.1.2  mrg       if (mpfr_fits_ulong_p (b, MPFR_RNDA))
     69  1.1.1.2  mrg         {
     70  1.1.1.2  mrg           __gmpfr_flags = oldflags;
     71  1.1.1.2  mrg           inex2 = mpfr_ui_div (a2, mpfr_get_ui (b, MPFR_RNDN), c, r);
     72  1.1.1.2  mrg           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
     73  1.1.1.2  mrg           MPFR_ASSERTN (__gmpfr_flags == newflags);
     74  1.1.1.2  mrg           check_equal (a, a2, "mpfr_ui_div", b, c, r);
     75  1.1.1.2  mrg         }
     76  1.1.1.2  mrg       if (mpfr_fits_slong_p (b, MPFR_RNDA))
     77  1.1.1.2  mrg         {
     78  1.1.1.2  mrg           __gmpfr_flags = oldflags;
     79  1.1.1.2  mrg           inex2 = mpfr_si_div (a2, mpfr_get_si (b, MPFR_RNDN), c, r);
     80  1.1.1.2  mrg           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
     81  1.1.1.2  mrg           MPFR_ASSERTN (__gmpfr_flags == newflags);
     82  1.1.1.2  mrg           check_equal (a, a2, "mpfr_si_div", b, c, r);
     83  1.1.1.2  mrg         }
     84  1.1.1.2  mrg     }
     85  1.1.1.2  mrg 
     86  1.1.1.2  mrg   if (mpfr_integer_p (c) && ! (MPFR_IS_ZERO (c) && MPFR_IS_NEG (c)))
     87  1.1.1.2  mrg     {
     88  1.1.1.2  mrg       /* c is an integer, but not -0 (-0 is rejected as
     89  1.1.1.2  mrg          it becomes +0 when converted to an integer). */
     90  1.1.1.2  mrg       if (mpfr_fits_ulong_p (c, MPFR_RNDA))
     91  1.1.1.2  mrg         {
     92  1.1.1.2  mrg           __gmpfr_flags = oldflags;
     93  1.1.1.2  mrg           inex2 = mpfr_div_ui (a2, b, mpfr_get_ui (c, MPFR_RNDN), r);
     94  1.1.1.2  mrg           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
     95  1.1.1.2  mrg           MPFR_ASSERTN (__gmpfr_flags == newflags);
     96  1.1.1.2  mrg           check_equal (a, a2, "mpfr_div_ui", b, c, r);
     97  1.1.1.2  mrg         }
     98  1.1.1.2  mrg       if (mpfr_fits_slong_p (c, MPFR_RNDA))
     99  1.1.1.2  mrg         {
    100  1.1.1.2  mrg           __gmpfr_flags = oldflags;
    101  1.1.1.2  mrg           inex2 = mpfr_div_si (a2, b, mpfr_get_si (c, MPFR_RNDN), r);
    102  1.1.1.2  mrg           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
    103  1.1.1.2  mrg           MPFR_ASSERTN (__gmpfr_flags == newflags);
    104  1.1.1.2  mrg           check_equal (a, a2, "mpfr_div_si", b, c, r);
    105  1.1.1.2  mrg         }
    106  1.1.1.2  mrg     }
    107  1.1.1.2  mrg 
    108  1.1.1.2  mrg   mpfr_clear (a2);
    109  1.1.1.2  mrg 
    110  1.1.1.2  mrg   return inex;
    111  1.1.1.2  mrg }
    112  1.1.1.2  mrg 
    113      1.1  mrg #ifdef CHECK_EXTERNAL
    114      1.1  mrg static int
    115      1.1  mrg test_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode)
    116      1.1  mrg {
    117      1.1  mrg   int res;
    118      1.1  mrg   int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_number_p (c);
    119      1.1  mrg   if (ok)
    120      1.1  mrg     {
    121      1.1  mrg       mpfr_print_raw (b);
    122      1.1  mrg       printf (" ");
    123      1.1  mrg       mpfr_print_raw (c);
    124      1.1  mrg     }
    125  1.1.1.2  mrg   res = mpfr_all_div (a, b, c, rnd_mode);
    126      1.1  mrg   if (ok)
    127      1.1  mrg     {
    128      1.1  mrg       printf (" ");
    129      1.1  mrg       mpfr_print_raw (a);
    130      1.1  mrg       printf ("\n");
    131      1.1  mrg     }
    132      1.1  mrg   return res;
    133      1.1  mrg }
    134      1.1  mrg #else
    135  1.1.1.2  mrg #define test_div mpfr_all_div
    136      1.1  mrg #endif
    137      1.1  mrg 
    138      1.1  mrg #define check53(n, d, rnd, res) check4(n, d, rnd, 53, res)
    139      1.1  mrg 
    140      1.1  mrg /* return 0 iff a and b are of the same sign */
    141      1.1  mrg static int
    142      1.1  mrg inex_cmp (int a, int b)
    143      1.1  mrg {
    144      1.1  mrg   if (a > 0)
    145      1.1  mrg     return (b > 0) ? 0 : 1;
    146      1.1  mrg   else if (a == 0)
    147      1.1  mrg     return (b == 0) ? 0 : 1;
    148      1.1  mrg   else
    149      1.1  mrg     return (b < 0) ? 0 : 1;
    150      1.1  mrg }
    151      1.1  mrg 
    152      1.1  mrg static void
    153      1.1  mrg check4 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, int p,
    154      1.1  mrg         const char *Qs)
    155      1.1  mrg {
    156      1.1  mrg   mpfr_t q, n, d;
    157      1.1  mrg 
    158      1.1  mrg   mpfr_inits2 (p, q, n, d, (mpfr_ptr) 0);
    159      1.1  mrg   mpfr_set_str1 (n, Ns);
    160      1.1  mrg   mpfr_set_str1 (d, Ds);
    161      1.1  mrg   test_div(q, n, d, rnd_mode);
    162      1.1  mrg   if (mpfr_cmp_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN) )
    163      1.1  mrg     {
    164      1.1  mrg       printf ("mpfr_div failed for n=%s, d=%s, p=%d, rnd_mode=%s\n",
    165      1.1  mrg               Ns, Ds, p, mpfr_print_rnd_mode (rnd_mode));
    166  1.1.1.4  mrg       printf ("got      ");
    167  1.1.1.4  mrg       mpfr_dump (q);
    168      1.1  mrg       mpfr_set_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN);
    169  1.1.1.4  mrg       printf ("expected ");
    170  1.1.1.4  mrg       mpfr_dump (q);
    171      1.1  mrg       exit (1);
    172      1.1  mrg     }
    173      1.1  mrg   mpfr_clears (q, n, d, (mpfr_ptr) 0);
    174      1.1  mrg }
    175      1.1  mrg 
    176      1.1  mrg static void
    177      1.1  mrg check24 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, const char *Qs)
    178      1.1  mrg {
    179      1.1  mrg   mpfr_t q, n, d;
    180      1.1  mrg 
    181      1.1  mrg   mpfr_inits2 (24, q, n, d, (mpfr_ptr) 0);
    182      1.1  mrg 
    183      1.1  mrg   mpfr_set_str1 (n, Ns);
    184      1.1  mrg   mpfr_set_str1 (d, Ds);
    185      1.1  mrg   test_div(q, n, d, rnd_mode);
    186      1.1  mrg   if (mpfr_cmp_str1 (q, Qs) )
    187      1.1  mrg     {
    188      1.1  mrg       printf ("mpfr_div failed for n=%s, d=%s, prec=24, rnd_mode=%s\n",
    189      1.1  mrg              Ns, Ds, mpfr_print_rnd_mode(rnd_mode));
    190      1.1  mrg       printf ("expected quotient is %s, got ", Qs);
    191      1.1  mrg       mpfr_out_str(stdout,10,0,q, MPFR_RNDN); putchar('\n');
    192      1.1  mrg       exit (1);
    193      1.1  mrg     }
    194      1.1  mrg   mpfr_clears (q, n, d, (mpfr_ptr) 0);
    195      1.1  mrg }
    196      1.1  mrg 
    197      1.1  mrg /* the following examples come from the paper "Number-theoretic Test
    198      1.1  mrg    Generation for Directed Rounding" from Michael Parks, Table 2 */
    199      1.1  mrg static void
    200      1.1  mrg check_float(void)
    201      1.1  mrg {
    202      1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDN, "8.388609e6");
    203      1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDN, "8.388609e6");
    204      1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDN, "8.388609e6");
    205      1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDN, "8.38861e6");
    206      1.1  mrg   /* the exponent for the following example was forgotten in
    207      1.1  mrg      the Arith'14 version of Parks' paper */
    208      1.1  mrg   check24 ("12582913.0", "12582910.0", MPFR_RNDN, "1.000000238");
    209      1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDN, "8388610.0");
    210      1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDN, "1.6777213e7");
    211      1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDN, "8.388611e6");
    212      1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDN, "1.2582911e7");
    213      1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDN, "1.258291e7");
    214      1.1  mrg 
    215      1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDZ, "8.388608e6");
    216      1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDZ, "8.388609e6");
    217      1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDZ, "8.388608e6");
    218      1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDZ, "8.38861e6");
    219      1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDZ, "1.000000238");
    220      1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDZ, "8388610.0");
    221      1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDZ, "1.6777213e7");
    222      1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDZ, "8.38861e6");
    223      1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDZ, "1.2582911e7");
    224      1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDZ, "1.258291e7");
    225      1.1  mrg 
    226      1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDU, "8.388609e6");
    227      1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDU, "8.38861e6");
    228      1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDU, "8.388609e6");
    229      1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDU, "8.388611e6");
    230      1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDU, "1.000000357");
    231      1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDU, "8388611.0");
    232      1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDU, "1.6777214e7");
    233      1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDU, "8.388611e6");
    234      1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDU, "1.2582912e7");
    235      1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDU, "1.2582911e7");
    236      1.1  mrg 
    237      1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDD, "8.388608e6");
    238      1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDD, "8.388609e6");
    239      1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDD, "8.388608e6");
    240      1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDD, "8.38861e6");
    241      1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDD, "1.000000238");
    242      1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDD, "8388610.0");
    243      1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDD, "1.6777213e7");
    244      1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDD, "8.38861e6");
    245      1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDD, "1.2582911e7");
    246      1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDD, "1.258291e7");
    247      1.1  mrg 
    248      1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDA, "8.388609e6");
    249      1.1  mrg }
    250      1.1  mrg 
    251      1.1  mrg static void
    252      1.1  mrg check_double(void)
    253      1.1  mrg {
    254      1.1  mrg   check53("0.0", "1.0", MPFR_RNDZ, "0.0");
    255      1.1  mrg   check53("-7.4988969224688591e63", "4.8816866450288732e306", MPFR_RNDD,
    256      1.1  mrg           "-1.5361282826510687291e-243");
    257      1.1  mrg   check53("-1.33225773037748601769e+199", "3.63449540676937123913e+79",
    258      1.1  mrg           MPFR_RNDZ, "-3.6655920045905428978e119");
    259      1.1  mrg   check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDU,
    260      1.1  mrg           "1.6672003992376663654e-67");
    261      1.1  mrg   check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDA,
    262      1.1  mrg           "1.6672003992376663654e-67");
    263      1.1  mrg   check53("9.89438396044940256501e-134", "-5.93472984109987421717e-67",
    264      1.1  mrg           MPFR_RNDU, "-1.6672003992376663654e-67");
    265      1.1  mrg   check53("-4.53063926135729747564e-308", "7.02293374921793516813e-84",
    266      1.1  mrg           MPFR_RNDD, "-6.4512060388748850857e-225");
    267      1.1  mrg   check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
    268      1.1  mrg           MPFR_RNDD, "-2.6540006635008291192e229");
    269      1.1  mrg   check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
    270      1.1  mrg           MPFR_RNDA, "-2.6540006635008291192e229");
    271      1.1  mrg   check53("6.52308934689126e15", "-1.62063546601505417497e273", MPFR_RNDN,
    272      1.1  mrg           "-4.0250194961676020848e-258");
    273      1.1  mrg   check53("1.04636807108079349236e-189", "3.72295730823253012954e-292",
    274      1.1  mrg           MPFR_RNDZ, "2.810583051186143125e102");
    275      1.1  mrg   /* problems found by Kevin under HP-PA */
    276      1.1  mrg   check53 ("2.861044553323177e-136", "-1.1120354257068143e+45", MPFR_RNDZ,
    277      1.1  mrg            "-2.5727998292003016e-181");
    278      1.1  mrg   check53 ("-4.0559157245809205e-127", "-1.1237723844524865e+77", MPFR_RNDN,
    279      1.1  mrg            "3.6091968273068081e-204");
    280      1.1  mrg   check53 ("-1.8177943561493235e-93", "-8.51233984260364e-104", MPFR_RNDU,
    281      1.1  mrg            "2.1354814184595821e+10");
    282      1.1  mrg }
    283      1.1  mrg 
    284      1.1  mrg static void
    285      1.1  mrg check_64(void)
    286      1.1  mrg {
    287      1.1  mrg   mpfr_t x,y,z;
    288      1.1  mrg 
    289      1.1  mrg   mpfr_inits2 (64, x, y, z, (mpfr_ptr) 0);
    290      1.1  mrg 
    291      1.1  mrg   mpfr_set_str_binary(x, "1.00100100110110101001010010101111000001011100100101010000000000E54");
    292      1.1  mrg   mpfr_set_str_binary(y, "1.00000000000000000000000000000000000000000000000000000000000000E584");
    293      1.1  mrg   test_div(z, x, y, MPFR_RNDU);
    294      1.1  mrg   if (mpfr_cmp_str (z, "0.1001001001101101010010100101011110000010111001001010100000000000E-529", 2, MPFR_RNDN))
    295      1.1  mrg     {
    296  1.1.1.4  mrg       printf ("Error for tdiv for MPFR_RNDU and p=64\nx=");
    297  1.1.1.4  mrg       mpfr_dump (x);
    298  1.1.1.4  mrg       printf ("y=");
    299  1.1.1.4  mrg       mpfr_dump (y);
    300  1.1.1.4  mrg       printf ("got      ");
    301  1.1.1.4  mrg       mpfr_dump (z);
    302  1.1.1.4  mrg       printf ("expected 0.1001001001101101010010100101011110000010111001001010100000000000E-529\n");
    303  1.1.1.4  mrg       exit (1);
    304      1.1  mrg     }
    305      1.1  mrg 
    306      1.1  mrg   mpfr_clears (x, y, z, (mpfr_ptr) 0);
    307      1.1  mrg }
    308      1.1  mrg 
    309      1.1  mrg static void
    310      1.1  mrg check_convergence (void)
    311      1.1  mrg {
    312      1.1  mrg   mpfr_t x, y; int i, j;
    313      1.1  mrg 
    314      1.1  mrg   mpfr_init2(x, 130);
    315      1.1  mrg   mpfr_set_str_binary(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944");
    316      1.1  mrg   mpfr_init2(y, 130);
    317      1.1  mrg   mpfr_set_ui(y, 5, MPFR_RNDN);
    318      1.1  mrg   test_div(x, x, y, MPFR_RNDD); /* exact division */
    319      1.1  mrg 
    320      1.1  mrg   mpfr_set_prec(x, 64);
    321      1.1  mrg   mpfr_set_prec(y, 64);
    322      1.1  mrg   mpfr_set_str_binary(x, "0.10010010011011010100101001010111100000101110010010101E55");
    323      1.1  mrg   mpfr_set_str_binary(y, "0.1E585");
    324      1.1  mrg   test_div(x, x, y, MPFR_RNDN);
    325      1.1  mrg   mpfr_set_str_binary(y, "0.10010010011011010100101001010111100000101110010010101E-529");
    326      1.1  mrg   if (mpfr_cmp (x, y))
    327      1.1  mrg     {
    328      1.1  mrg       printf ("Error in mpfr_div for prec=64, rnd=MPFR_RNDN\n");
    329  1.1.1.4  mrg       printf ("got        "); mpfr_dump (x);
    330  1.1.1.4  mrg       printf ("instead of "); mpfr_dump (y);
    331      1.1  mrg       exit(1);
    332      1.1  mrg     }
    333      1.1  mrg 
    334      1.1  mrg   for (i=32; i<=64; i+=32)
    335      1.1  mrg     {
    336      1.1  mrg       mpfr_set_prec(x, i);
    337      1.1  mrg       mpfr_set_prec(y, i);
    338      1.1  mrg       mpfr_set_ui(x, 1, MPFR_RNDN);
    339      1.1  mrg       RND_LOOP(j)
    340      1.1  mrg         {
    341      1.1  mrg           mpfr_set_ui (y, 1, MPFR_RNDN);
    342      1.1  mrg           test_div (y, x, y, (mpfr_rnd_t) j);
    343      1.1  mrg           if (mpfr_cmp_ui (y, 1))
    344      1.1  mrg             {
    345      1.1  mrg               printf ("mpfr_div failed for x=1.0, y=1.0, prec=%d rnd=%s\n",
    346      1.1  mrg                       i, mpfr_print_rnd_mode ((mpfr_rnd_t) j));
    347  1.1.1.4  mrg               printf ("got "); mpfr_dump (y);
    348      1.1  mrg               exit (1);
    349      1.1  mrg             }
    350      1.1  mrg         }
    351      1.1  mrg     }
    352      1.1  mrg 
    353      1.1  mrg   mpfr_clear (x);
    354      1.1  mrg   mpfr_clear (y);
    355      1.1  mrg }
    356      1.1  mrg 
    357      1.1  mrg #define KMAX 10000
    358      1.1  mrg 
    359      1.1  mrg /* given y = o(x/u), x, u, find the inexact flag by
    360      1.1  mrg    multiplying y by u */
    361      1.1  mrg static int
    362      1.1  mrg get_inexact (mpfr_t y, mpfr_t x, mpfr_t u)
    363      1.1  mrg {
    364      1.1  mrg   mpfr_t xx;
    365      1.1  mrg   int inex;
    366      1.1  mrg   mpfr_init2 (xx, mpfr_get_prec (y) + mpfr_get_prec (u));
    367      1.1  mrg   mpfr_mul (xx, y, u, MPFR_RNDN); /* exact */
    368      1.1  mrg   inex = mpfr_cmp (xx, x);
    369      1.1  mrg   mpfr_clear (xx);
    370      1.1  mrg   return inex;
    371      1.1  mrg }
    372      1.1  mrg 
    373      1.1  mrg static void
    374      1.1  mrg check_hard (void)
    375      1.1  mrg {
    376      1.1  mrg   mpfr_t u, v, q, q2;
    377      1.1  mrg   mpfr_prec_t precu, precv, precq;
    378      1.1  mrg   int rnd;
    379      1.1  mrg   int inex, inex2, i, j;
    380      1.1  mrg 
    381      1.1  mrg   mpfr_init (q);
    382      1.1  mrg   mpfr_init (q2);
    383      1.1  mrg   mpfr_init (u);
    384      1.1  mrg   mpfr_init (v);
    385      1.1  mrg 
    386      1.1  mrg   for (precq = MPFR_PREC_MIN; precq <= 64; precq ++)
    387      1.1  mrg     {
    388      1.1  mrg       mpfr_set_prec (q, precq);
    389      1.1  mrg       mpfr_set_prec (q2, precq + 1);
    390      1.1  mrg       for (j = 0; j < 2; j++)
    391      1.1  mrg         {
    392      1.1  mrg           if (j == 0)
    393      1.1  mrg             {
    394      1.1  mrg               do
    395      1.1  mrg                 {
    396      1.1  mrg                   mpfr_urandomb (q2, RANDS);
    397      1.1  mrg                 }
    398      1.1  mrg               while (mpfr_cmp_ui (q2, 0) == 0);
    399      1.1  mrg             }
    400      1.1  mrg           else /* use q2=1 */
    401      1.1  mrg             mpfr_set_ui (q2, 1, MPFR_RNDN);
    402      1.1  mrg       for (precv = precq; precv <= 10 * precq; precv += precq)
    403      1.1  mrg         {
    404      1.1  mrg           mpfr_set_prec (v, precv);
    405      1.1  mrg           do
    406      1.1  mrg             {
    407      1.1  mrg               mpfr_urandomb (v, RANDS);
    408      1.1  mrg             }
    409      1.1  mrg           while (mpfr_cmp_ui (v, 0) == 0);
    410      1.1  mrg           for (precu = precq; precu <= 10 * precq; precu += precq)
    411      1.1  mrg             {
    412      1.1  mrg               mpfr_set_prec (u, precu);
    413      1.1  mrg               mpfr_mul (u, v, q2, MPFR_RNDN);
    414      1.1  mrg               mpfr_nextbelow (u);
    415      1.1  mrg               for (i = 0; i <= 2; i++)
    416      1.1  mrg                 {
    417  1.1.1.4  mrg                   RND_LOOP_NO_RNDF (rnd)
    418      1.1  mrg                     {
    419      1.1  mrg                       inex = test_div (q, u, v, (mpfr_rnd_t) rnd);
    420      1.1  mrg                       inex2 = get_inexact (q, u, v);
    421      1.1  mrg                       if (inex_cmp (inex, inex2))
    422      1.1  mrg                         {
    423      1.1  mrg                           printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n",
    424      1.1  mrg                                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex2, inex);
    425      1.1  mrg                           printf ("u=  "); mpfr_dump (u);
    426      1.1  mrg                           printf ("v=  "); mpfr_dump (v);
    427      1.1  mrg                           printf ("q=  "); mpfr_dump (q);
    428      1.1  mrg                           mpfr_set_prec (q2, precq + precv);
    429      1.1  mrg                           mpfr_mul (q2, q, v, MPFR_RNDN);
    430      1.1  mrg                           printf ("q*v="); mpfr_dump (q2);
    431      1.1  mrg                           exit (1);
    432      1.1  mrg                         }
    433      1.1  mrg                     }
    434      1.1  mrg                   mpfr_nextabove (u);
    435      1.1  mrg                 }
    436      1.1  mrg             }
    437      1.1  mrg         }
    438      1.1  mrg         }
    439      1.1  mrg     }
    440      1.1  mrg 
    441      1.1  mrg   mpfr_clear (q);
    442      1.1  mrg   mpfr_clear (q2);
    443      1.1  mrg   mpfr_clear (u);
    444      1.1  mrg   mpfr_clear (v);
    445      1.1  mrg }
    446      1.1  mrg 
    447      1.1  mrg static void
    448      1.1  mrg check_lowr (void)
    449      1.1  mrg {
    450      1.1  mrg   mpfr_t x, y, z, z2, z3, tmp;
    451      1.1  mrg   int k, c, c2;
    452      1.1  mrg 
    453      1.1  mrg 
    454      1.1  mrg   mpfr_init2 (x, 1000);
    455      1.1  mrg   mpfr_init2 (y, 100);
    456      1.1  mrg   mpfr_init2 (tmp, 850);
    457      1.1  mrg   mpfr_init2 (z, 10);
    458      1.1  mrg   mpfr_init2 (z2, 10);
    459      1.1  mrg   mpfr_init2 (z3, 50);
    460      1.1  mrg 
    461      1.1  mrg   for (k = 1; k < KMAX; k++)
    462      1.1  mrg     {
    463      1.1  mrg       do
    464      1.1  mrg         {
    465      1.1  mrg           mpfr_urandomb (z, RANDS);
    466      1.1  mrg         }
    467      1.1  mrg       while (mpfr_cmp_ui (z, 0) == 0);
    468      1.1  mrg       do
    469      1.1  mrg         {
    470      1.1  mrg           mpfr_urandomb (tmp, RANDS);
    471      1.1  mrg         }
    472      1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    473      1.1  mrg       mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
    474      1.1  mrg       c = test_div (z2, x, tmp, MPFR_RNDN);
    475      1.1  mrg 
    476      1.1  mrg       if (c || mpfr_cmp (z2, z))
    477      1.1  mrg         {
    478      1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
    479  1.1.1.4  mrg           printf ("got        "); mpfr_dump (z2);
    480  1.1.1.4  mrg           printf ("instead of "); mpfr_dump (z);
    481      1.1  mrg           printf ("inex flag = %d, expected 0\n", c);
    482      1.1  mrg           exit (1);
    483      1.1  mrg         }
    484      1.1  mrg     }
    485      1.1  mrg 
    486      1.1  mrg   /* x has still precision 1000, z precision 10, and tmp prec 850 */
    487      1.1  mrg   mpfr_set_prec (z2, 9);
    488      1.1  mrg   for (k = 1; k < KMAX; k++)
    489      1.1  mrg     {
    490      1.1  mrg       mpfr_urandomb (z, RANDS);
    491      1.1  mrg       do
    492      1.1  mrg         {
    493      1.1  mrg           mpfr_urandomb (tmp, RANDS);
    494      1.1  mrg         }
    495      1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    496      1.1  mrg       mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
    497      1.1  mrg       c = test_div (z2, x, tmp, MPFR_RNDN);
    498      1.1  mrg       /* since z2 has one less bit that z, either the division is exact
    499      1.1  mrg          if z is representable on 9 bits, or we have an even round case */
    500      1.1  mrg 
    501      1.1  mrg       c2 = get_inexact (z2, x, tmp);
    502      1.1  mrg       if ((mpfr_cmp (z2, z) == 0 && c) || inex_cmp (c, c2))
    503      1.1  mrg         {
    504      1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
    505  1.1.1.4  mrg           printf ("got        "); mpfr_dump (z2);
    506  1.1.1.4  mrg           printf ("instead of "); mpfr_dump (z);
    507      1.1  mrg           printf ("inex flag = %d, expected %d\n", c, c2);
    508      1.1  mrg           exit (1);
    509      1.1  mrg         }
    510      1.1  mrg       else if (c == 2)
    511      1.1  mrg         {
    512      1.1  mrg           mpfr_nexttoinf (z);
    513      1.1  mrg           if (mpfr_cmp(z2, z))
    514      1.1  mrg             {
    515      1.1  mrg               printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
    516      1.1  mrg               printf ("Dividing ");
    517  1.1.1.4  mrg               printf ("got        "); mpfr_dump (z2);
    518  1.1.1.4  mrg               printf ("instead of "); mpfr_dump (z);
    519      1.1  mrg               printf ("inex flag = %d\n", 1);
    520      1.1  mrg               exit (1);
    521      1.1  mrg             }
    522      1.1  mrg         }
    523      1.1  mrg       else if (c == -2)
    524      1.1  mrg         {
    525      1.1  mrg           mpfr_nexttozero (z);
    526      1.1  mrg           if (mpfr_cmp(z2, z))
    527      1.1  mrg             {
    528      1.1  mrg               printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
    529      1.1  mrg               printf ("Dividing ");
    530  1.1.1.4  mrg               printf ("got        "); mpfr_dump (z2);
    531  1.1.1.4  mrg               printf ("instead of "); mpfr_dump (z);
    532      1.1  mrg               printf ("inex flag = %d\n", 1);
    533      1.1  mrg               exit (1);
    534      1.1  mrg             }
    535      1.1  mrg         }
    536      1.1  mrg     }
    537      1.1  mrg 
    538      1.1  mrg   mpfr_set_prec(x, 1000);
    539      1.1  mrg   mpfr_set_prec(y, 100);
    540      1.1  mrg   mpfr_set_prec(tmp, 850);
    541      1.1  mrg   mpfr_set_prec(z, 10);
    542      1.1  mrg   mpfr_set_prec(z2, 10);
    543      1.1  mrg 
    544      1.1  mrg   /* almost exact divisions */
    545      1.1  mrg   for (k = 1; k < KMAX; k++)
    546      1.1  mrg     {
    547      1.1  mrg       do
    548      1.1  mrg         {
    549      1.1  mrg           mpfr_urandomb (z, RANDS);
    550      1.1  mrg         }
    551      1.1  mrg       while (mpfr_cmp_ui (z, 0) == 0);
    552      1.1  mrg       do
    553      1.1  mrg         {
    554      1.1  mrg           mpfr_urandomb (tmp, RANDS);
    555      1.1  mrg         }
    556      1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    557      1.1  mrg       mpfr_mul(x, z, tmp, MPFR_RNDN);
    558      1.1  mrg       mpfr_set(y, tmp, MPFR_RNDD);
    559      1.1  mrg       mpfr_nexttoinf (x);
    560      1.1  mrg 
    561      1.1  mrg       c = test_div(z2, x, y, MPFR_RNDD);
    562      1.1  mrg       test_div(z3, x, y, MPFR_RNDD);
    563      1.1  mrg       mpfr_set(z, z3, MPFR_RNDD);
    564      1.1  mrg 
    565      1.1  mrg       if (c != -1 || mpfr_cmp(z2, z))
    566      1.1  mrg         {
    567      1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDD\n");
    568  1.1.1.4  mrg           printf ("got        "); mpfr_dump (z2);
    569  1.1.1.4  mrg           printf ("instead of "); mpfr_dump (z);
    570      1.1  mrg           printf ("inex flag = %d\n", c);
    571      1.1  mrg           exit (1);
    572      1.1  mrg         }
    573      1.1  mrg 
    574      1.1  mrg       mpfr_set (y, tmp, MPFR_RNDU);
    575      1.1  mrg       test_div (z3, x, y, MPFR_RNDU);
    576      1.1  mrg       mpfr_set (z, z3, MPFR_RNDU);
    577      1.1  mrg       c = test_div (z2, x, y, MPFR_RNDU);
    578      1.1  mrg       if (c != 1 || mpfr_cmp (z2, z))
    579      1.1  mrg         {
    580      1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDU\n");
    581      1.1  mrg           printf ("u="); mpfr_dump (x);
    582      1.1  mrg           printf ("v="); mpfr_dump (y);
    583  1.1.1.4  mrg           printf ("got        "); mpfr_dump (z2);
    584  1.1.1.4  mrg           printf ("instead of "); mpfr_dump (z);
    585      1.1  mrg           printf ("inex flag = %d\n", c);
    586      1.1  mrg           exit (1);
    587      1.1  mrg         }
    588      1.1  mrg     }
    589      1.1  mrg 
    590      1.1  mrg   mpfr_clear (x);
    591      1.1  mrg   mpfr_clear (y);
    592      1.1  mrg   mpfr_clear (z);
    593      1.1  mrg   mpfr_clear (z2);
    594      1.1  mrg   mpfr_clear (z3);
    595      1.1  mrg   mpfr_clear (tmp);
    596      1.1  mrg }
    597      1.1  mrg 
    598      1.1  mrg #define MAX_PREC 128
    599      1.1  mrg 
    600      1.1  mrg static void
    601      1.1  mrg check_inexact (void)
    602      1.1  mrg {
    603      1.1  mrg   mpfr_t x, y, z, u;
    604      1.1  mrg   mpfr_prec_t px, py, pu;
    605      1.1  mrg   int inexact, cmp;
    606      1.1  mrg   mpfr_rnd_t rnd;
    607      1.1  mrg 
    608      1.1  mrg   mpfr_init (x);
    609      1.1  mrg   mpfr_init (y);
    610      1.1  mrg   mpfr_init (z);
    611      1.1  mrg   mpfr_init (u);
    612      1.1  mrg 
    613      1.1  mrg   mpfr_set_prec (x, 28);
    614      1.1  mrg   mpfr_set_prec (y, 28);
    615      1.1  mrg   mpfr_set_prec (z, 1023);
    616      1.1  mrg   mpfr_set_str_binary (x, "0.1000001001101101111100010011E0");
    617      1.1  mrg   mpfr_set_str (z, "48284762641021308813686974720835219181653367326353400027913400579340343320519877153813133510034402932651132854764198688352364361009429039801248971901380781746767119334993621199563870113045276395603170432175354501451429471578325545278975153148347684600400321033502982713296919861760382863826626093689036010394", 10, MPFR_RNDN);
    618      1.1  mrg   mpfr_div (x, x, z, MPFR_RNDN);
    619      1.1  mrg   mpfr_set_str_binary (y, "0.1111001011001101001001111100E-1023");
    620      1.1  mrg   if (mpfr_cmp (x, y))
    621      1.1  mrg     {
    622      1.1  mrg       printf ("Error in mpfr_div for prec=28, RNDN\n");
    623      1.1  mrg       printf ("Expected "); mpfr_dump (y);
    624      1.1  mrg       printf ("Got      "); mpfr_dump (x);
    625      1.1  mrg       exit (1);
    626      1.1  mrg     }
    627      1.1  mrg 
    628      1.1  mrg   mpfr_set_prec (x, 53);
    629      1.1  mrg   mpfr_set_str_binary (x, "0.11101100110010100011011000000100001111011111110010101E0");
    630      1.1  mrg   mpfr_set_prec (u, 127);
    631      1.1  mrg   mpfr_set_str_binary (u, "0.1000001100110110110101110110101101111000110000001111111110000000011111001010110100110010111111111101000001011011101011101101000E-2");
    632      1.1  mrg   mpfr_set_prec (y, 95);
    633      1.1  mrg   inexact = test_div (y, x, u, MPFR_RNDN);
    634      1.1  mrg   if (inexact != (cmp = get_inexact (y, x, u)))
    635      1.1  mrg     {
    636      1.1  mrg       printf ("Wrong inexact flag (0): expected %d, got %d\n", cmp, inexact);
    637      1.1  mrg       printf ("x="); mpfr_out_str (stdout, 10, 99, x, MPFR_RNDN); printf ("\n");
    638      1.1  mrg       printf ("u="); mpfr_out_str (stdout, 10, 99, u, MPFR_RNDN); printf ("\n");
    639      1.1  mrg       printf ("y="); mpfr_out_str (stdout, 10, 99, y, MPFR_RNDN); printf ("\n");
    640      1.1  mrg       exit (1);
    641      1.1  mrg     }
    642      1.1  mrg 
    643      1.1  mrg   mpfr_set_prec (x, 33);
    644      1.1  mrg   mpfr_set_str_binary (x, "0.101111100011011101010011101100001E0");
    645      1.1  mrg   mpfr_set_prec (u, 2);
    646      1.1  mrg   mpfr_set_str_binary (u, "0.1E0");
    647      1.1  mrg   mpfr_set_prec (y, 28);
    648  1.1.1.3  mrg   inexact = test_div (y, x, u, MPFR_RNDN);
    649  1.1.1.3  mrg   if (inexact >= 0)
    650      1.1  mrg     {
    651      1.1  mrg       printf ("Wrong inexact flag (1): expected -1, got %d\n",
    652      1.1  mrg               inexact);
    653      1.1  mrg       exit (1);
    654      1.1  mrg     }
    655      1.1  mrg 
    656      1.1  mrg   mpfr_set_prec (x, 129);
    657      1.1  mrg   mpfr_set_str_binary (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2");
    658      1.1  mrg   mpfr_set_prec (u, 15);
    659      1.1  mrg   mpfr_set_str_binary (u, "0.101101000001100E-1");
    660      1.1  mrg   mpfr_set_prec (y, 92);
    661  1.1.1.3  mrg   inexact = test_div (y, x, u, MPFR_RNDN);
    662  1.1.1.3  mrg   if (inexact <= 0)
    663      1.1  mrg     {
    664      1.1  mrg       printf ("Wrong inexact flag for rnd=MPFR_RNDN(1): expected 1, got %d\n",
    665      1.1  mrg               inexact);
    666      1.1  mrg       mpfr_dump (x);
    667      1.1  mrg       mpfr_dump (u);
    668      1.1  mrg       mpfr_dump (y);
    669      1.1  mrg       exit (1);
    670      1.1  mrg     }
    671      1.1  mrg 
    672      1.1  mrg   for (px=2; px<MAX_PREC; px++)
    673      1.1  mrg     {
    674      1.1  mrg       mpfr_set_prec (x, px);
    675      1.1  mrg       mpfr_urandomb (x, RANDS);
    676      1.1  mrg       for (pu=2; pu<=MAX_PREC; pu++)
    677      1.1  mrg         {
    678      1.1  mrg           mpfr_set_prec (u, pu);
    679      1.1  mrg           do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0);
    680      1.1  mrg             {
    681      1.1  mrg               py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - MPFR_PREC_MIN));
    682      1.1  mrg               mpfr_set_prec (y, py);
    683      1.1  mrg               mpfr_set_prec (z, py + pu);
    684      1.1  mrg                 {
    685  1.1.1.4  mrg                   /* inexact is undefined for RNDF */
    686  1.1.1.4  mrg                   rnd = RND_RAND_NO_RNDF ();
    687      1.1  mrg                   inexact = test_div (y, x, u, rnd);
    688      1.1  mrg                   if (mpfr_mul (z, y, u, rnd))
    689      1.1  mrg                     {
    690      1.1  mrg                       printf ("z <- y * u should be exact\n");
    691      1.1  mrg                       exit (1);
    692      1.1  mrg                     }
    693      1.1  mrg                   cmp = mpfr_cmp (z, x);
    694      1.1  mrg                   if (((inexact == 0) && (cmp != 0)) ||
    695      1.1  mrg                       ((inexact > 0) && (cmp <= 0)) ||
    696      1.1  mrg                       ((inexact < 0) && (cmp >= 0)))
    697      1.1  mrg                     {
    698      1.1  mrg                       printf ("Wrong inexact flag for rnd=%s\n",
    699      1.1  mrg                               mpfr_print_rnd_mode(rnd));
    700      1.1  mrg                       printf ("expected %d, got %d\n", cmp, inexact);
    701  1.1.1.4  mrg                       printf ("x="); mpfr_dump (x);
    702  1.1.1.4  mrg                       printf ("u="); mpfr_dump (u);
    703  1.1.1.4  mrg                       printf ("y="); mpfr_dump (y);
    704  1.1.1.4  mrg                       printf ("y*u="); mpfr_dump (z);
    705      1.1  mrg                       exit (1);
    706      1.1  mrg                     }
    707      1.1  mrg                 }
    708      1.1  mrg             }
    709      1.1  mrg         }
    710      1.1  mrg     }
    711      1.1  mrg 
    712      1.1  mrg   mpfr_clear (x);
    713      1.1  mrg   mpfr_clear (y);
    714      1.1  mrg   mpfr_clear (z);
    715      1.1  mrg   mpfr_clear (u);
    716      1.1  mrg }
    717      1.1  mrg 
    718      1.1  mrg static void
    719  1.1.1.2  mrg check_special (void)
    720      1.1  mrg {
    721      1.1  mrg   mpfr_t  a, d, q;
    722      1.1  mrg   mpfr_exp_t emax, emin;
    723      1.1  mrg   int i;
    724      1.1  mrg 
    725      1.1  mrg   mpfr_init2 (a, 100L);
    726      1.1  mrg   mpfr_init2 (d, 100L);
    727      1.1  mrg   mpfr_init2 (q, 100L);
    728      1.1  mrg 
    729      1.1  mrg   /* 1/nan == nan */
    730      1.1  mrg   mpfr_set_ui (a, 1L, MPFR_RNDN);
    731      1.1  mrg   MPFR_SET_NAN (d);
    732  1.1.1.2  mrg   mpfr_clear_flags ();
    733      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    734  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    735      1.1  mrg 
    736      1.1  mrg   /* nan/1 == nan */
    737      1.1  mrg   MPFR_SET_NAN (a);
    738      1.1  mrg   mpfr_set_ui (d, 1L, MPFR_RNDN);
    739  1.1.1.2  mrg   mpfr_clear_flags ();
    740      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    741  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    742      1.1  mrg 
    743      1.1  mrg   /* +inf/1 == +inf */
    744      1.1  mrg   MPFR_SET_INF (a);
    745      1.1  mrg   MPFR_SET_POS (a);
    746      1.1  mrg   mpfr_set_ui (d, 1L, MPFR_RNDN);
    747  1.1.1.2  mrg   mpfr_clear_flags ();
    748  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    749  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inf_p (q));
    750  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_sgn (q) > 0);
    751  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    752  1.1.1.2  mrg 
    753  1.1.1.2  mrg   /* +inf/-1 == -inf */
    754  1.1.1.2  mrg   MPFR_SET_INF (a);
    755  1.1.1.2  mrg   MPFR_SET_POS (a);
    756  1.1.1.2  mrg   mpfr_set_si (d, -1, MPFR_RNDN);
    757  1.1.1.2  mrg   mpfr_clear_flags ();
    758  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    759  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inf_p (q));
    760  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_sgn (q) < 0);
    761  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    762  1.1.1.2  mrg 
    763  1.1.1.2  mrg   /* -inf/1 == -inf */
    764  1.1.1.2  mrg   MPFR_SET_INF (a);
    765  1.1.1.2  mrg   MPFR_SET_NEG (a);
    766  1.1.1.2  mrg   mpfr_set_ui (d, 1L, MPFR_RNDN);
    767  1.1.1.2  mrg   mpfr_clear_flags ();
    768  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    769  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inf_p (q));
    770  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_sgn (q) < 0);
    771  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    772  1.1.1.2  mrg 
    773  1.1.1.2  mrg   /* -inf/-1 == +inf */
    774  1.1.1.2  mrg   MPFR_SET_INF (a);
    775  1.1.1.2  mrg   MPFR_SET_NEG (a);
    776  1.1.1.2  mrg   mpfr_set_si (d, -1, MPFR_RNDN);
    777  1.1.1.2  mrg   mpfr_clear_flags ();
    778      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    779      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q));
    780      1.1  mrg   MPFR_ASSERTN (mpfr_sgn (q) > 0);
    781  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    782  1.1.1.2  mrg 
    783  1.1.1.2  mrg   /* 1/+inf == +0 */
    784  1.1.1.2  mrg   mpfr_set_ui (a, 1L, MPFR_RNDN);
    785  1.1.1.2  mrg   MPFR_SET_INF (d);
    786  1.1.1.2  mrg   MPFR_SET_POS (d);
    787  1.1.1.2  mrg   mpfr_clear_flags ();
    788  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    789  1.1.1.4  mrg   MPFR_ASSERTN (MPFR_IS_ZERO (q));
    790  1.1.1.2  mrg   MPFR_ASSERTN (MPFR_IS_POS (q));
    791  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    792      1.1  mrg 
    793  1.1.1.2  mrg   /* 1/-inf == -0 */
    794      1.1  mrg   mpfr_set_ui (a, 1L, MPFR_RNDN);
    795      1.1  mrg   MPFR_SET_INF (d);
    796  1.1.1.2  mrg   MPFR_SET_NEG (d);
    797  1.1.1.2  mrg   mpfr_clear_flags ();
    798  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    799  1.1.1.4  mrg   MPFR_ASSERTN (MPFR_IS_ZERO (q));
    800  1.1.1.2  mrg   MPFR_ASSERTN (MPFR_IS_NEG (q));
    801  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    802  1.1.1.2  mrg 
    803  1.1.1.2  mrg   /* -1/+inf == -0 */
    804  1.1.1.2  mrg   mpfr_set_si (a, -1, MPFR_RNDN);
    805  1.1.1.2  mrg   MPFR_SET_INF (d);
    806      1.1  mrg   MPFR_SET_POS (d);
    807  1.1.1.2  mrg   mpfr_clear_flags ();
    808      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    809  1.1.1.4  mrg   MPFR_ASSERTN (MPFR_IS_ZERO (q));
    810  1.1.1.2  mrg   MPFR_ASSERTN (MPFR_IS_NEG (q));
    811  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    812  1.1.1.2  mrg 
    813  1.1.1.2  mrg   /* -1/-inf == +0 */
    814  1.1.1.2  mrg   mpfr_set_si (a, -1, MPFR_RNDN);
    815  1.1.1.2  mrg   MPFR_SET_INF (d);
    816  1.1.1.2  mrg   MPFR_SET_NEG (d);
    817  1.1.1.2  mrg   mpfr_clear_flags ();
    818  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    819  1.1.1.4  mrg   MPFR_ASSERTN (MPFR_IS_ZERO (q));
    820  1.1.1.2  mrg   MPFR_ASSERTN (MPFR_IS_POS (q));
    821  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    822      1.1  mrg 
    823      1.1  mrg   /* 0/0 == nan */
    824      1.1  mrg   mpfr_set_ui (a, 0L, MPFR_RNDN);
    825      1.1  mrg   mpfr_set_ui (d, 0L, MPFR_RNDN);
    826  1.1.1.2  mrg   mpfr_clear_flags ();
    827      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    828  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    829      1.1  mrg 
    830      1.1  mrg   /* +inf/+inf == nan */
    831      1.1  mrg   MPFR_SET_INF (a);
    832      1.1  mrg   MPFR_SET_POS (a);
    833      1.1  mrg   MPFR_SET_INF (d);
    834      1.1  mrg   MPFR_SET_POS (d);
    835  1.1.1.2  mrg   mpfr_clear_flags ();
    836      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    837  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    838      1.1  mrg 
    839  1.1.1.2  mrg   /* 1/+0 = +inf */
    840      1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    841      1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    842  1.1.1.2  mrg   mpfr_clear_flags ();
    843      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    844      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    845  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    846      1.1  mrg 
    847  1.1.1.2  mrg   /* 1/-0 = -inf */
    848      1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    849      1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    850      1.1  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    851  1.1.1.2  mrg   mpfr_clear_flags ();
    852      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    853      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    854  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    855      1.1  mrg 
    856  1.1.1.2  mrg   /* -1/+0 = -inf */
    857      1.1  mrg   mpfr_set_si (a, -1, MPFR_RNDZ);
    858      1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    859  1.1.1.2  mrg   mpfr_clear_flags ();
    860      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    861      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    862  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    863      1.1  mrg 
    864  1.1.1.2  mrg   /* -1/-0 = +inf */
    865      1.1  mrg   mpfr_set_si (a, -1, MPFR_RNDZ);
    866      1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    867      1.1  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    868  1.1.1.2  mrg   mpfr_clear_flags ();
    869      1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    870      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    871  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    872  1.1.1.2  mrg 
    873  1.1.1.2  mrg   /* +inf/+0 = +inf */
    874  1.1.1.2  mrg   MPFR_SET_INF (a);
    875  1.1.1.2  mrg   MPFR_SET_POS (a);
    876  1.1.1.2  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    877  1.1.1.2  mrg   mpfr_clear_flags ();
    878  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    879  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    880  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    881  1.1.1.2  mrg 
    882  1.1.1.2  mrg   /* +inf/-0 = -inf */
    883  1.1.1.2  mrg   MPFR_SET_INF (a);
    884  1.1.1.2  mrg   MPFR_SET_POS (a);
    885  1.1.1.2  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    886  1.1.1.2  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    887  1.1.1.2  mrg   mpfr_clear_flags ();
    888  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    889  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    890  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    891  1.1.1.2  mrg 
    892  1.1.1.2  mrg   /* -inf/+0 = -inf */
    893  1.1.1.2  mrg   MPFR_SET_INF (a);
    894  1.1.1.2  mrg   MPFR_SET_NEG (a);
    895  1.1.1.2  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    896  1.1.1.2  mrg   mpfr_clear_flags ();
    897  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    898  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    899  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    900  1.1.1.2  mrg 
    901  1.1.1.2  mrg   /* -inf/-0 = +inf */
    902  1.1.1.2  mrg   MPFR_SET_INF (a);
    903  1.1.1.2  mrg   MPFR_SET_NEG (a);
    904  1.1.1.2  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    905  1.1.1.2  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    906  1.1.1.2  mrg   mpfr_clear_flags ();
    907  1.1.1.2  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    908  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    909  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == 0);
    910      1.1  mrg 
    911      1.1  mrg   /* check overflow */
    912      1.1  mrg   emax = mpfr_get_emax ();
    913      1.1  mrg   set_emax (1);
    914      1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    915      1.1  mrg   mpfr_set_ui (d, 1, MPFR_RNDZ);
    916      1.1  mrg   mpfr_div_2exp (d, d, 1, MPFR_RNDZ);
    917  1.1.1.2  mrg   mpfr_clear_flags ();
    918      1.1  mrg   test_div (q, a, d, MPFR_RNDU); /* 1 / 0.5 = 2 -> overflow */
    919      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    920  1.1.1.2  mrg   MPFR_ASSERTN (__gmpfr_flags == (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT));
    921      1.1  mrg   set_emax (emax);
    922      1.1  mrg 
    923      1.1  mrg   /* check underflow */
    924      1.1  mrg   emin = mpfr_get_emin ();
    925      1.1  mrg   set_emin (-1);
    926      1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    927      1.1  mrg   mpfr_div_2exp (a, a, 2, MPFR_RNDZ);
    928      1.1  mrg   mpfr_set_prec (d, mpfr_get_prec (q) + 8);
    929      1.1  mrg   for (i = -1; i <= 1; i++)
    930      1.1  mrg     {
    931      1.1  mrg       int sign;
    932      1.1  mrg 
    933      1.1  mrg       /* Test 2^(-2) / (+/- (2 + eps)), with eps < 0, eps = 0, eps > 0.
    934      1.1  mrg          -> underflow.
    935      1.1  mrg          With div.c r5513, this test fails for eps > 0 in MPFR_RNDN. */
    936      1.1  mrg       mpfr_set_ui (d, 2, MPFR_RNDZ);
    937      1.1  mrg       if (i < 0)
    938      1.1  mrg         mpfr_nextbelow (d);
    939      1.1  mrg       if (i > 0)
    940      1.1  mrg         mpfr_nextabove (d);
    941      1.1  mrg       for (sign = 0; sign <= 1; sign++)
    942      1.1  mrg         {
    943      1.1  mrg           mpfr_clear_flags ();
    944      1.1  mrg           test_div (q, a, d, MPFR_RNDZ); /* result = 0 */
    945  1.1.1.2  mrg           MPFR_ASSERTN (__gmpfr_flags ==
    946  1.1.1.2  mrg                         (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT));
    947      1.1  mrg           MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
    948      1.1  mrg           MPFR_ASSERTN (MPFR_IS_ZERO (q));
    949      1.1  mrg           mpfr_clear_flags ();
    950      1.1  mrg           test_div (q, a, d, MPFR_RNDN); /* result = 0 iff eps >= 0 */
    951  1.1.1.2  mrg           MPFR_ASSERTN (__gmpfr_flags ==
    952  1.1.1.2  mrg                         (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT));
    953      1.1  mrg           MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
    954      1.1  mrg           if (i < 0)
    955      1.1  mrg             mpfr_nexttozero (q);
    956      1.1  mrg           MPFR_ASSERTN (MPFR_IS_ZERO (q));
    957      1.1  mrg           mpfr_neg (d, d, MPFR_RNDN);
    958      1.1  mrg         }
    959      1.1  mrg     }
    960      1.1  mrg   set_emin (emin);
    961      1.1  mrg 
    962      1.1  mrg   mpfr_clear (a);
    963      1.1  mrg   mpfr_clear (d);
    964      1.1  mrg   mpfr_clear (q);
    965      1.1  mrg }
    966      1.1  mrg 
    967      1.1  mrg static void
    968      1.1  mrg consistency (void)
    969      1.1  mrg {
    970      1.1  mrg   mpfr_t x, y, z1, z2;
    971      1.1  mrg   int i;
    972      1.1  mrg 
    973      1.1  mrg   mpfr_inits (x, y, z1, z2, (mpfr_ptr) 0);
    974      1.1  mrg 
    975      1.1  mrg   for (i = 0; i < 10000; i++)
    976      1.1  mrg     {
    977      1.1  mrg       mpfr_rnd_t rnd;
    978      1.1  mrg       mpfr_prec_t px, py, pz, p;
    979      1.1  mrg       int inex1, inex2;
    980      1.1  mrg 
    981  1.1.1.4  mrg       /* inex is undefined for RNDF */
    982  1.1.1.4  mrg       rnd = RND_RAND_NO_RNDF ();
    983      1.1  mrg       px = (randlimb () % 256) + 2;
    984      1.1  mrg       py = (randlimb () % 128) + 2;
    985      1.1  mrg       pz = (randlimb () % 256) + 2;
    986      1.1  mrg       mpfr_set_prec (x, px);
    987      1.1  mrg       mpfr_set_prec (y, py);
    988      1.1  mrg       mpfr_set_prec (z1, pz);
    989      1.1  mrg       mpfr_set_prec (z2, pz);
    990      1.1  mrg       mpfr_urandomb (x, RANDS);
    991      1.1  mrg       do
    992      1.1  mrg         mpfr_urandomb (y, RANDS);
    993      1.1  mrg       while (mpfr_zero_p (y));
    994      1.1  mrg       inex1 = mpfr_div (z1, x, y, rnd);
    995      1.1  mrg       MPFR_ASSERTN (!MPFR_IS_NAN (z1));
    996      1.1  mrg       p = MAX (MAX (px, py), pz);
    997      1.1  mrg       if (mpfr_prec_round (x, p, MPFR_RNDN) != 0 ||
    998      1.1  mrg           mpfr_prec_round (y, p, MPFR_RNDN) != 0)
    999      1.1  mrg         {
   1000      1.1  mrg           printf ("mpfr_prec_round error for i = %d\n", i);
   1001      1.1  mrg           exit (1);
   1002      1.1  mrg         }
   1003      1.1  mrg       inex2 = mpfr_div (z2, x, y, rnd);
   1004      1.1  mrg       MPFR_ASSERTN (!MPFR_IS_NAN (z2));
   1005      1.1  mrg       if (inex1 != inex2 || mpfr_cmp (z1, z2) != 0)
   1006      1.1  mrg         {
   1007  1.1.1.4  mrg           printf ("Consistency error for i = %d, rnd = %s\n", i,
   1008  1.1.1.4  mrg                   mpfr_print_rnd_mode (rnd));
   1009  1.1.1.4  mrg           printf ("inex1=%d inex2=%d\n", inex1, inex2);
   1010  1.1.1.4  mrg           printf ("z1="); mpfr_dump (z1);
   1011  1.1.1.4  mrg           printf ("z2="); mpfr_dump (z2);
   1012      1.1  mrg           exit (1);
   1013      1.1  mrg         }
   1014      1.1  mrg     }
   1015      1.1  mrg 
   1016      1.1  mrg   mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
   1017      1.1  mrg }
   1018      1.1  mrg 
   1019      1.1  mrg /* Reported by Carl Witty on 2007-06-03 */
   1020      1.1  mrg static void
   1021      1.1  mrg test_20070603 (void)
   1022      1.1  mrg {
   1023      1.1  mrg   mpfr_t n, d, q, c;
   1024      1.1  mrg 
   1025      1.1  mrg   mpfr_init2 (n, 128);
   1026      1.1  mrg   mpfr_init2 (d, 128);
   1027      1.1  mrg   mpfr_init2 (q, 31);
   1028      1.1  mrg   mpfr_init2 (c, 31);
   1029      1.1  mrg 
   1030      1.1  mrg   mpfr_set_str (n, "10384593717069655257060992206846485", 10, MPFR_RNDN);
   1031      1.1  mrg   mpfr_set_str (d, "10384593717069655257060992206847132", 10, MPFR_RNDN);
   1032      1.1  mrg   mpfr_div (q, n, d, MPFR_RNDU);
   1033      1.1  mrg 
   1034      1.1  mrg   mpfr_set_ui (c, 1, MPFR_RNDN);
   1035      1.1  mrg   if (mpfr_cmp (q, c) != 0)
   1036      1.1  mrg     {
   1037      1.1  mrg       printf ("Error in test_20070603\nGot        ");
   1038      1.1  mrg       mpfr_dump (q);
   1039      1.1  mrg       printf ("instead of ");
   1040      1.1  mrg       mpfr_dump (c);
   1041      1.1  mrg       exit (1);
   1042      1.1  mrg     }
   1043      1.1  mrg 
   1044      1.1  mrg   /* same for 64-bit machines */
   1045      1.1  mrg   mpfr_set_prec (n, 256);
   1046      1.1  mrg   mpfr_set_prec (d, 256);
   1047      1.1  mrg   mpfr_set_prec (q, 63);
   1048      1.1  mrg   mpfr_set_str (n, "822752278660603021077484591278675252491367930877209729029898240", 10, MPFR_RNDN);
   1049      1.1  mrg   mpfr_set_str (d, "822752278660603021077484591278675252491367930877212507873738752", 10, MPFR_RNDN);
   1050      1.1  mrg   mpfr_div (q, n, d, MPFR_RNDU);
   1051      1.1  mrg   if (mpfr_cmp (q, c) != 0)
   1052      1.1  mrg     {
   1053      1.1  mrg       printf ("Error in test_20070603\nGot        ");
   1054      1.1  mrg       mpfr_dump (q);
   1055      1.1  mrg       printf ("instead of ");
   1056      1.1  mrg       mpfr_dump (c);
   1057      1.1  mrg       exit (1);
   1058      1.1  mrg     }
   1059      1.1  mrg 
   1060      1.1  mrg   mpfr_clear (n);
   1061      1.1  mrg   mpfr_clear (d);
   1062      1.1  mrg   mpfr_clear (q);
   1063      1.1  mrg   mpfr_clear (c);
   1064      1.1  mrg }
   1065      1.1  mrg 
   1066      1.1  mrg /* Bug found while adding tests for mpfr_cot */
   1067      1.1  mrg static void
   1068      1.1  mrg test_20070628 (void)
   1069      1.1  mrg {
   1070      1.1  mrg   mpfr_exp_t old_emax;
   1071      1.1  mrg   mpfr_t x, y;
   1072      1.1  mrg   int inex, err = 0;
   1073      1.1  mrg 
   1074      1.1  mrg   old_emax = mpfr_get_emax ();
   1075      1.1  mrg 
   1076      1.1  mrg   if (mpfr_set_emax (256))
   1077      1.1  mrg     {
   1078      1.1  mrg       printf ("Can't change exponent range\n");
   1079      1.1  mrg       exit (1);
   1080      1.1  mrg     }
   1081      1.1  mrg 
   1082      1.1  mrg   mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
   1083      1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
   1084      1.1  mrg   mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN);
   1085      1.1  mrg   mpfr_clear_flags ();
   1086      1.1  mrg   inex = mpfr_div (x, x, y, MPFR_RNDD);
   1087  1.1.1.4  mrg   if (MPFR_IS_POS (x) || ! mpfr_inf_p (x))
   1088      1.1  mrg     {
   1089      1.1  mrg       printf ("Error in test_20070628: expected -Inf, got\n");
   1090      1.1  mrg       mpfr_dump (x);
   1091      1.1  mrg       err++;
   1092      1.1  mrg     }
   1093      1.1  mrg   if (inex >= 0)
   1094      1.1  mrg     {
   1095      1.1  mrg       printf ("Error in test_20070628: expected inex < 0, got %d\n", inex);
   1096      1.1  mrg       err++;
   1097      1.1  mrg     }
   1098      1.1  mrg   if (! mpfr_overflow_p ())
   1099      1.1  mrg     {
   1100      1.1  mrg       printf ("Error in test_20070628: overflow flag is not set\n");
   1101      1.1  mrg       err++;
   1102      1.1  mrg     }
   1103      1.1  mrg   mpfr_clears (x, y, (mpfr_ptr) 0);
   1104      1.1  mrg   mpfr_set_emax (old_emax);
   1105      1.1  mrg }
   1106      1.1  mrg 
   1107  1.1.1.3  mrg /* Bug in mpfr_divhigh_n_basecase when all limbs of q (except the most
   1108  1.1.1.3  mrg    significant one) are B-1 where B=2^GMP_NUMB_BITS. Since we truncate
   1109  1.1.1.3  mrg    the divisor at each step, it might happen at some point that
   1110  1.1.1.3  mrg    (np[n-1],np[n-2]) > (d1,d0), and not only the equality.
   1111  1.1.1.3  mrg    Reported by Ricky Farr
   1112  1.1.1.3  mrg    <https://sympa.inria.fr/sympa/arc/mpfr/2015-10/msg00023.html>
   1113  1.1.1.3  mrg    To get a failure, a MPFR_DIVHIGH_TAB entry below the MPFR_DIV_THRESHOLD
   1114  1.1.1.4  mrg    limit must have a value 0. With most mparam.h files, this cannot occur. To
   1115  1.1.1.4  mrg    make the bug appear, one can configure MPFR with -DMPFR_TUNE_COVERAGE. */
   1116  1.1.1.3  mrg static void
   1117  1.1.1.3  mrg test_20151023 (void)
   1118  1.1.1.3  mrg {
   1119  1.1.1.3  mrg   mpfr_prec_t p;
   1120  1.1.1.3  mrg   mpfr_t n, d, q, q0;
   1121  1.1.1.3  mrg   int inex, i;
   1122  1.1.1.3  mrg 
   1123  1.1.1.3  mrg   for (p = GMP_NUMB_BITS; p <= 2000; p++)
   1124  1.1.1.3  mrg     {
   1125  1.1.1.3  mrg       mpfr_init2 (n, 2*p);
   1126  1.1.1.3  mrg       mpfr_init2 (d, p);
   1127  1.1.1.3  mrg       mpfr_init2 (q, p);
   1128  1.1.1.3  mrg       mpfr_init2 (q0, GMP_NUMB_BITS);
   1129  1.1.1.3  mrg 
   1130  1.1.1.3  mrg       /* generate a random divisor of p bits */
   1131  1.1.1.3  mrg       mpfr_urandomb (d, RANDS);
   1132  1.1.1.3  mrg       /* generate a random quotient of GMP_NUMB_BITS bits */
   1133  1.1.1.3  mrg       mpfr_urandomb (q0, RANDS);
   1134  1.1.1.3  mrg       /* zero-pad the quotient to p bits */
   1135  1.1.1.3  mrg       inex = mpfr_prec_round (q0, p, MPFR_RNDN);
   1136  1.1.1.3  mrg       MPFR_ASSERTN(inex == 0);
   1137  1.1.1.3  mrg 
   1138  1.1.1.3  mrg       for (i = 0; i < 3; i++)
   1139  1.1.1.3  mrg         {
   1140  1.1.1.3  mrg           /* i=0: try with the original quotient xxx000...000
   1141  1.1.1.3  mrg              i=1: try with the original quotient minus one ulp
   1142  1.1.1.3  mrg              i=2: try with the original quotient plus one ulp */
   1143  1.1.1.3  mrg           if (i == 1)
   1144  1.1.1.3  mrg             mpfr_nextbelow (q0);
   1145  1.1.1.3  mrg           else if (i == 2)
   1146  1.1.1.3  mrg             {
   1147  1.1.1.3  mrg               mpfr_nextabove (q0);
   1148  1.1.1.3  mrg               mpfr_nextabove (q0);
   1149  1.1.1.3  mrg             }
   1150  1.1.1.3  mrg 
   1151  1.1.1.3  mrg           inex = mpfr_mul (n, d, q0, MPFR_RNDN);
   1152  1.1.1.3  mrg           MPFR_ASSERTN(inex == 0);
   1153  1.1.1.3  mrg           mpfr_nextabove (n);
   1154  1.1.1.3  mrg           mpfr_div (q, n, d, MPFR_RNDN);
   1155  1.1.1.3  mrg           MPFR_ASSERTN(mpfr_cmp (q, q0) == 0);
   1156  1.1.1.3  mrg 
   1157  1.1.1.3  mrg           inex = mpfr_mul (n, d, q0, MPFR_RNDN);
   1158  1.1.1.3  mrg           MPFR_ASSERTN(inex == 0);
   1159  1.1.1.3  mrg           mpfr_nextbelow (n);
   1160  1.1.1.3  mrg           mpfr_div (q, n, d, MPFR_RNDN);
   1161  1.1.1.3  mrg           MPFR_ASSERTN(mpfr_cmp (q, q0) == 0);
   1162  1.1.1.3  mrg         }
   1163  1.1.1.3  mrg 
   1164  1.1.1.3  mrg       mpfr_clear (n);
   1165  1.1.1.3  mrg       mpfr_clear (d);
   1166  1.1.1.3  mrg       mpfr_clear (q);
   1167  1.1.1.3  mrg       mpfr_clear (q0);
   1168  1.1.1.3  mrg     }
   1169  1.1.1.3  mrg }
   1170  1.1.1.3  mrg 
   1171  1.1.1.4  mrg /* test a random division of p+extra bits divided by p+extra bits,
   1172  1.1.1.4  mrg    with quotient of p bits only, where the p+extra bit approximation
   1173  1.1.1.4  mrg    of the quotient is very near a rounding frontier. */
   1174  1.1.1.4  mrg static void
   1175  1.1.1.4  mrg test_bad_aux (mpfr_prec_t p, mpfr_prec_t extra)
   1176  1.1.1.4  mrg {
   1177  1.1.1.4  mrg   mpfr_t u, v, w, q0, q;
   1178  1.1.1.4  mrg 
   1179  1.1.1.4  mrg   mpfr_init2 (u, p + extra);
   1180  1.1.1.4  mrg   mpfr_init2 (v, p + extra);
   1181  1.1.1.4  mrg   mpfr_init2 (w, p + extra);
   1182  1.1.1.4  mrg   mpfr_init2 (q0, p);
   1183  1.1.1.4  mrg   mpfr_init2 (q, p);
   1184  1.1.1.4  mrg   do mpfr_urandomb (q0, RANDS); while (mpfr_zero_p (q0));
   1185  1.1.1.4  mrg   do mpfr_urandomb (v, RANDS); while (mpfr_zero_p (v));
   1186  1.1.1.4  mrg 
   1187  1.1.1.4  mrg   mpfr_set (w, q0, MPFR_RNDN); /* exact */
   1188  1.1.1.4  mrg   mpfr_nextabove (w); /* now w > q0 */
   1189  1.1.1.4  mrg   mpfr_mul (u, v, w, MPFR_RNDU); /* thus u > v*q0 */
   1190  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDU); /* should have q > q0 */
   1191  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_cmp (q, q0) > 0);
   1192  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDZ); /* should have q = q0 */
   1193  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_cmp (q, q0) == 0);
   1194  1.1.1.4  mrg 
   1195  1.1.1.4  mrg   mpfr_set (w, q0, MPFR_RNDN); /* exact */
   1196  1.1.1.4  mrg   mpfr_nextbelow (w); /* now w < q0 */
   1197  1.1.1.4  mrg   mpfr_mul (u, v, w, MPFR_RNDZ); /* thus u < v*q0 */
   1198  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDZ); /* should have q < q0 */
   1199  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_cmp (q, q0) < 0);
   1200  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDU); /* should have q = q0 */
   1201  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_cmp (q, q0) == 0);
   1202  1.1.1.4  mrg 
   1203  1.1.1.4  mrg   mpfr_clear (u);
   1204  1.1.1.4  mrg   mpfr_clear (v);
   1205  1.1.1.4  mrg   mpfr_clear (w);
   1206  1.1.1.4  mrg   mpfr_clear (q0);
   1207  1.1.1.4  mrg   mpfr_clear (q);
   1208  1.1.1.4  mrg }
   1209  1.1.1.4  mrg 
   1210  1.1.1.4  mrg static void
   1211  1.1.1.4  mrg test_bad (void)
   1212  1.1.1.4  mrg {
   1213  1.1.1.4  mrg   mpfr_prec_t p, extra;
   1214  1.1.1.4  mrg 
   1215  1.1.1.4  mrg   for (p = MPFR_PREC_MIN; p <= 1024; p += 17)
   1216  1.1.1.4  mrg     for (extra = 2; extra <= 64; extra++)
   1217  1.1.1.4  mrg       test_bad_aux (p, extra);
   1218  1.1.1.4  mrg }
   1219  1.1.1.4  mrg 
   1220      1.1  mrg #define TEST_FUNCTION test_div
   1221      1.1  mrg #define TWO_ARGS
   1222      1.1  mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
   1223      1.1  mrg #include "tgeneric.c"
   1224      1.1  mrg 
   1225  1.1.1.3  mrg static void
   1226  1.1.1.3  mrg test_extreme (void)
   1227  1.1.1.3  mrg {
   1228  1.1.1.3  mrg   mpfr_t x, y, z;
   1229  1.1.1.3  mrg   mpfr_exp_t emin, emax;
   1230  1.1.1.3  mrg   mpfr_prec_t p[4] = { 8, 32, 64, 256 };
   1231  1.1.1.3  mrg   int xi, yi, zi, j, r;
   1232  1.1.1.3  mrg   unsigned int flags, ex_flags;
   1233  1.1.1.3  mrg 
   1234  1.1.1.3  mrg   emin = mpfr_get_emin ();
   1235  1.1.1.3  mrg   emax = mpfr_get_emax ();
   1236  1.1.1.3  mrg 
   1237  1.1.1.3  mrg   mpfr_set_emin (MPFR_EMIN_MIN);
   1238  1.1.1.3  mrg   mpfr_set_emax (MPFR_EMAX_MAX);
   1239  1.1.1.3  mrg 
   1240  1.1.1.3  mrg   for (xi = 0; xi < 4; xi++)
   1241  1.1.1.3  mrg     {
   1242  1.1.1.3  mrg       mpfr_init2 (x, p[xi]);
   1243  1.1.1.3  mrg       mpfr_setmax (x, MPFR_EMAX_MAX);
   1244  1.1.1.3  mrg       MPFR_ASSERTN (mpfr_check (x));
   1245  1.1.1.3  mrg       for (yi = 0; yi < 4; yi++)
   1246  1.1.1.3  mrg         {
   1247  1.1.1.3  mrg           mpfr_init2 (y, p[yi]);
   1248  1.1.1.3  mrg           mpfr_setmin (y, MPFR_EMIN_MIN);
   1249  1.1.1.3  mrg           for (j = 0; j < 2; j++)
   1250  1.1.1.3  mrg             {
   1251  1.1.1.3  mrg               MPFR_ASSERTN (mpfr_check (y));
   1252  1.1.1.3  mrg               for (zi = 0; zi < 4; zi++)
   1253  1.1.1.3  mrg                 {
   1254  1.1.1.3  mrg                   mpfr_init2 (z, p[zi]);
   1255  1.1.1.3  mrg                   RND_LOOP (r)
   1256  1.1.1.3  mrg                     {
   1257  1.1.1.3  mrg                       mpfr_clear_flags ();
   1258  1.1.1.3  mrg                       mpfr_div (z, x, y, (mpfr_rnd_t) r);
   1259  1.1.1.3  mrg                       flags = __gmpfr_flags;
   1260  1.1.1.3  mrg                       MPFR_ASSERTN (mpfr_check (z));
   1261  1.1.1.3  mrg                       ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT;
   1262  1.1.1.3  mrg                       if (flags != ex_flags)
   1263  1.1.1.3  mrg                         {
   1264  1.1.1.3  mrg                           printf ("Bad flags in test_extreme on z = a/b"
   1265  1.1.1.3  mrg                                   " with %s and\n",
   1266  1.1.1.3  mrg                                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
   1267  1.1.1.3  mrg                           printf ("a = ");
   1268  1.1.1.3  mrg                           mpfr_dump (x);
   1269  1.1.1.3  mrg                           printf ("b = ");
   1270  1.1.1.3  mrg                           mpfr_dump (y);
   1271  1.1.1.3  mrg                           printf ("Expected flags:");
   1272  1.1.1.3  mrg                           flags_out (ex_flags);
   1273  1.1.1.3  mrg                           printf ("Got flags:     ");
   1274  1.1.1.3  mrg                           flags_out (flags);
   1275  1.1.1.3  mrg                           printf ("z = ");
   1276  1.1.1.3  mrg                           mpfr_dump (z);
   1277  1.1.1.3  mrg                           exit (1);
   1278  1.1.1.3  mrg                         }
   1279  1.1.1.3  mrg                       mpfr_clear_flags ();
   1280  1.1.1.3  mrg                       mpfr_div (z, y, x, (mpfr_rnd_t) r);
   1281  1.1.1.3  mrg                       flags = __gmpfr_flags;
   1282  1.1.1.3  mrg                       MPFR_ASSERTN (mpfr_check (z));
   1283  1.1.1.3  mrg                       ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT;
   1284  1.1.1.3  mrg                       if (flags != ex_flags)
   1285  1.1.1.3  mrg                         {
   1286  1.1.1.3  mrg                           printf ("Bad flags in test_extreme on z = a/b"
   1287  1.1.1.3  mrg                                   " with %s and\n",
   1288  1.1.1.3  mrg                                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
   1289  1.1.1.3  mrg                           printf ("a = ");
   1290  1.1.1.3  mrg                           mpfr_dump (y);
   1291  1.1.1.3  mrg                           printf ("b = ");
   1292  1.1.1.3  mrg                           mpfr_dump (x);
   1293  1.1.1.3  mrg                           printf ("Expected flags:");
   1294  1.1.1.3  mrg                           flags_out (ex_flags);
   1295  1.1.1.3  mrg                           printf ("Got flags:     ");
   1296  1.1.1.3  mrg                           flags_out (flags);
   1297  1.1.1.3  mrg                           printf ("z = ");
   1298  1.1.1.3  mrg                           mpfr_dump (z);
   1299  1.1.1.3  mrg                           exit (1);
   1300  1.1.1.3  mrg                         }
   1301  1.1.1.3  mrg                     }
   1302  1.1.1.3  mrg                   mpfr_clear (z);
   1303  1.1.1.3  mrg                 }  /* zi */
   1304  1.1.1.3  mrg               mpfr_nextabove (y);
   1305  1.1.1.3  mrg             }  /* j */
   1306  1.1.1.3  mrg           mpfr_clear (y);
   1307  1.1.1.3  mrg         }  /* yi */
   1308  1.1.1.3  mrg       mpfr_clear (x);
   1309  1.1.1.3  mrg     }  /* xi */
   1310  1.1.1.3  mrg 
   1311  1.1.1.3  mrg   set_emin (emin);
   1312  1.1.1.3  mrg   set_emax (emax);
   1313  1.1.1.3  mrg }
   1314  1.1.1.3  mrg 
   1315  1.1.1.4  mrg static void
   1316  1.1.1.4  mrg testall_rndf (mpfr_prec_t pmax)
   1317  1.1.1.4  mrg {
   1318  1.1.1.4  mrg   mpfr_t a, b, c, d;
   1319  1.1.1.4  mrg   mpfr_prec_t pa, pb, pc;
   1320  1.1.1.4  mrg 
   1321  1.1.1.4  mrg   for (pa = MPFR_PREC_MIN; pa <= pmax; pa++)
   1322  1.1.1.4  mrg     {
   1323  1.1.1.4  mrg       mpfr_init2 (a, pa);
   1324  1.1.1.4  mrg       mpfr_init2 (d, pa);
   1325  1.1.1.4  mrg       for (pb = MPFR_PREC_MIN; pb <= pmax; pb++)
   1326  1.1.1.4  mrg         {
   1327  1.1.1.4  mrg           mpfr_init2 (b, pb);
   1328  1.1.1.4  mrg           mpfr_set_ui (b, 1, MPFR_RNDN);
   1329  1.1.1.4  mrg           while (mpfr_cmp_ui (b, 2) < 0)
   1330  1.1.1.4  mrg             {
   1331  1.1.1.4  mrg               for (pc = MPFR_PREC_MIN; pc <= pmax; pc++)
   1332  1.1.1.4  mrg                 {
   1333  1.1.1.4  mrg                   mpfr_init2 (c, pc);
   1334  1.1.1.4  mrg                   mpfr_set_ui (c, 1, MPFR_RNDN);
   1335  1.1.1.4  mrg                   while (mpfr_cmp_ui (c, 2) < 0)
   1336  1.1.1.4  mrg                     {
   1337  1.1.1.4  mrg                       mpfr_div (a, b, c, MPFR_RNDF);
   1338  1.1.1.4  mrg                       mpfr_div (d, b, c, MPFR_RNDD);
   1339  1.1.1.4  mrg                       if (!mpfr_equal_p (a, d))
   1340  1.1.1.4  mrg                         {
   1341  1.1.1.4  mrg                           mpfr_div (d, b, c, MPFR_RNDU);
   1342  1.1.1.4  mrg                           if (!mpfr_equal_p (a, d))
   1343  1.1.1.4  mrg                             {
   1344  1.1.1.4  mrg                               printf ("Error: mpfr_div(a,b,c,RNDF) does not "
   1345  1.1.1.4  mrg                                       "match RNDD/RNDU\n");
   1346  1.1.1.4  mrg                               printf ("b="); mpfr_dump (b);
   1347  1.1.1.4  mrg                               printf ("c="); mpfr_dump (c);
   1348  1.1.1.4  mrg                               printf ("a="); mpfr_dump (a);
   1349  1.1.1.4  mrg                               exit (1);
   1350  1.1.1.4  mrg                             }
   1351  1.1.1.4  mrg                         }
   1352  1.1.1.4  mrg                       mpfr_nextabove (c);
   1353  1.1.1.4  mrg                     }
   1354  1.1.1.4  mrg                   mpfr_clear (c);
   1355  1.1.1.4  mrg                 }
   1356  1.1.1.4  mrg               mpfr_nextabove (b);
   1357  1.1.1.4  mrg             }
   1358  1.1.1.4  mrg           mpfr_clear (b);
   1359  1.1.1.4  mrg         }
   1360  1.1.1.4  mrg       mpfr_clear (a);
   1361  1.1.1.4  mrg       mpfr_clear (d);
   1362  1.1.1.4  mrg     }
   1363  1.1.1.4  mrg }
   1364  1.1.1.4  mrg 
   1365  1.1.1.4  mrg static void
   1366  1.1.1.4  mrg test_mpfr_divsp2 (void)
   1367  1.1.1.4  mrg {
   1368  1.1.1.4  mrg   mpfr_t u, v, q;
   1369  1.1.1.4  mrg 
   1370  1.1.1.4  mrg   /* test to exercise r2 = v1 in mpfr_divsp2 */
   1371  1.1.1.4  mrg   mpfr_init2 (u, 128);
   1372  1.1.1.4  mrg   mpfr_init2 (v, 128);
   1373  1.1.1.4  mrg   mpfr_init2 (q, 83);
   1374  1.1.1.4  mrg 
   1375  1.1.1.4  mrg   mpfr_set_str (u, "286677858044426991425771529092412636160", 10, MPFR_RNDN);
   1376  1.1.1.4  mrg   mpfr_set_str (v, "241810647971575979588130185988987264768", 10, MPFR_RNDN);
   1377  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDN);
   1378  1.1.1.4  mrg   mpfr_set_str (u, "5732952910203749289426944", 10, MPFR_RNDN);
   1379  1.1.1.4  mrg   mpfr_div_2exp (u, u, 82, MPFR_RNDN);
   1380  1.1.1.4  mrg   MPFR_ASSERTN(mpfr_equal_p (q, u));
   1381  1.1.1.4  mrg 
   1382  1.1.1.4  mrg   mpfr_clear (u);
   1383  1.1.1.4  mrg   mpfr_clear (v);
   1384  1.1.1.4  mrg   mpfr_clear (q);
   1385  1.1.1.4  mrg }
   1386  1.1.1.4  mrg 
   1387  1.1.1.4  mrg /* Assertion failure in r10769 with --enable-assert --enable-gmp-internals
   1388  1.1.1.4  mrg    (same failure in tatan on a similar example). */
   1389  1.1.1.4  mrg static void
   1390  1.1.1.4  mrg test_20160831 (void)
   1391  1.1.1.4  mrg {
   1392  1.1.1.4  mrg   mpfr_t u, v, q;
   1393  1.1.1.4  mrg 
   1394  1.1.1.4  mrg   mpfr_inits2 (124, u, v, q, (mpfr_ptr) 0);
   1395  1.1.1.4  mrg 
   1396  1.1.1.4  mrg   mpfr_set_ui (u, 1, MPFR_RNDN);
   1397  1.1.1.4  mrg   mpfr_set_str (v, "0x40000000000000005", 16, MPFR_RNDN);
   1398  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDN);
   1399  1.1.1.4  mrg   mpfr_set_str (u, "0xfffffffffffffffecp-134", 16, MPFR_RNDN);
   1400  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_equal_p (q, u));
   1401  1.1.1.4  mrg 
   1402  1.1.1.4  mrg   mpfr_set_prec (u, 128);
   1403  1.1.1.4  mrg   mpfr_set_prec (v, 128);
   1404  1.1.1.4  mrg   mpfr_set_str (u, "186127091671619245460026015088243485690", 10, MPFR_RNDN);
   1405  1.1.1.4  mrg   mpfr_set_str (v, "205987256581218236405412302590110119580", 10, MPFR_RNDN);
   1406  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDN);
   1407  1.1.1.4  mrg   mpfr_set_str (u, "19217137613667309953639458782352244736", 10, MPFR_RNDN);
   1408  1.1.1.4  mrg   mpfr_div_2exp (u, u, 124, MPFR_RNDN);
   1409  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_equal_p (q, u));
   1410  1.1.1.4  mrg 
   1411  1.1.1.4  mrg   mpfr_clears (u, v, q, (mpfr_ptr) 0);
   1412  1.1.1.4  mrg }
   1413  1.1.1.4  mrg 
   1414  1.1.1.4  mrg /* With r11138, on a 64-bit machine:
   1415  1.1.1.4  mrg    div.c:128: MPFR assertion failed: qx >= __gmpfr_emin
   1416  1.1.1.4  mrg */
   1417  1.1.1.4  mrg static void
   1418  1.1.1.4  mrg test_20170104 (void)
   1419  1.1.1.4  mrg {
   1420  1.1.1.4  mrg   mpfr_t u, v, q;
   1421  1.1.1.4  mrg   mpfr_exp_t emin;
   1422  1.1.1.4  mrg 
   1423  1.1.1.4  mrg   emin = mpfr_get_emin ();
   1424  1.1.1.4  mrg   set_emin (-42);
   1425  1.1.1.4  mrg 
   1426  1.1.1.4  mrg   mpfr_init2 (u, 12);
   1427  1.1.1.4  mrg   mpfr_init2 (v, 12);
   1428  1.1.1.4  mrg   mpfr_init2 (q, 11);
   1429  1.1.1.4  mrg   mpfr_set_str_binary (u, "0.111111111110E-29");
   1430  1.1.1.4  mrg   mpfr_set_str_binary (v, "0.111111111111E14");
   1431  1.1.1.4  mrg   mpfr_div (q, u, v, MPFR_RNDN);
   1432  1.1.1.4  mrg   mpfr_clears (u, v, q, (mpfr_ptr) 0);
   1433  1.1.1.4  mrg 
   1434  1.1.1.4  mrg   set_emin (emin);
   1435  1.1.1.4  mrg }
   1436  1.1.1.4  mrg 
   1437  1.1.1.4  mrg /* With r11140, on a 64-bit machine with GMP_CHECK_RANDOMIZE=1484406128:
   1438  1.1.1.4  mrg    Consistency error for i = 2577
   1439  1.1.1.4  mrg */
   1440  1.1.1.4  mrg static void
   1441  1.1.1.4  mrg test_20170105 (void)
   1442  1.1.1.4  mrg {
   1443  1.1.1.4  mrg   mpfr_t x, y, z, t;
   1444  1.1.1.4  mrg 
   1445  1.1.1.4  mrg   mpfr_init2 (x, 138);
   1446  1.1.1.4  mrg   mpfr_init2 (y, 6);
   1447  1.1.1.4  mrg   mpfr_init2 (z, 128);
   1448  1.1.1.4  mrg   mpfr_init2 (t, 128);
   1449  1.1.1.4  mrg   mpfr_set_str_binary (x, "0.100110111001001000101111010010011101111110111111110001110100000001110111010100111010100011101010110000010100000011100100110101101011000000E-6");
   1450  1.1.1.4  mrg   mpfr_set_str_binary (y, "0.100100E-2");
   1451  1.1.1.4  mrg   /* up to exponents, x/y is exactly 367625553447399614694201910705139062483,
   1452  1.1.1.4  mrg      which has 129 bits, thus we are in the round-to-nearest-even case, and since
   1453  1.1.1.4  mrg      the penultimate bit of x/y is 1, we should round upwards */
   1454  1.1.1.4  mrg   mpfr_set_str_binary (t, "0.10001010010010010000110110010110111111111100011011101010000000000110101000010001011110011011010000111010000000001100101101101010E-3");
   1455  1.1.1.4  mrg   mpfr_div (z, x, y, MPFR_RNDN);
   1456  1.1.1.4  mrg   MPFR_ASSERTN(mpfr_equal_p (z, t));
   1457  1.1.1.4  mrg   mpfr_clears (x, y, z, t, (mpfr_ptr) 0);
   1458  1.1.1.4  mrg }
   1459  1.1.1.4  mrg 
   1460  1.1.1.4  mrg /* The real cause of the mpfr_ttanh failure from the non-regression test
   1461  1.1.1.4  mrg    added in tests/ttanh.c@11993 was actually due to a bug in mpfr_div, as
   1462  1.1.1.4  mrg    this can be seen by comparing the logs of the 3.1 branch and the trunk
   1463  1.1.1.4  mrg    r11992 with MPFR_LOG_ALL=1 MPFR_LOG_PREC=50 on this particular test
   1464  1.1.1.4  mrg    (this was noticed because adding this test to the 3.1 branch did not
   1465  1.1.1.4  mrg    yield a failure like in the trunk, though the mpfr_ttanh code did not
   1466  1.1.1.4  mrg    change until r11993). This was the bug actually fixed in r12002.
   1467  1.1.1.4  mrg */
   1468  1.1.1.4  mrg static void
   1469  1.1.1.4  mrg test_20171219 (void)
   1470  1.1.1.4  mrg {
   1471  1.1.1.4  mrg   mpfr_t x, y, z, t;
   1472  1.1.1.4  mrg 
   1473  1.1.1.4  mrg   mpfr_inits2 (126, x, y, z, t, (mpfr_ptr) 0);
   1474  1.1.1.4  mrg   mpfr_set_str_binary (x, "0.111000000000000111100000000000011110000000000001111000000000000111100000000000011110000000000001111000000000000111100000000000E1");
   1475  1.1.1.4  mrg   /* x = 36347266450315671364380109803814927 / 2^114 */
   1476  1.1.1.4  mrg   mpfr_add_ui (y, x, 2, MPFR_RNDN);
   1477  1.1.1.4  mrg   /* y = 77885641318594292392624080437575695 / 2^114 */
   1478  1.1.1.4  mrg   mpfr_div (z, x, y, MPFR_RNDN);
   1479  1.1.1.4  mrg   mpfr_set_ui_2exp (t, 3823, -13, MPFR_RNDN);
   1480  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_equal_p (z, t));
   1481  1.1.1.4  mrg   mpfr_clears (x, y, z, t, (mpfr_ptr) 0);
   1482  1.1.1.4  mrg }
   1483  1.1.1.4  mrg 
   1484  1.1.1.4  mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64
   1485  1.1.1.4  mrg /* exercise mpfr_div2_approx */
   1486  1.1.1.4  mrg static void
   1487  1.1.1.4  mrg test_mpfr_div2_approx (unsigned long n)
   1488  1.1.1.4  mrg {
   1489  1.1.1.4  mrg   mpfr_t x, y, z;
   1490  1.1.1.4  mrg 
   1491  1.1.1.4  mrg   mpfr_init2 (x, 113);
   1492  1.1.1.4  mrg   mpfr_init2 (y, 113);
   1493  1.1.1.4  mrg   mpfr_init2 (z, 113);
   1494  1.1.1.4  mrg   while (n--)
   1495  1.1.1.4  mrg     {
   1496  1.1.1.4  mrg       mpfr_urandomb (x, RANDS);
   1497  1.1.1.4  mrg       mpfr_urandomb (y, RANDS);
   1498  1.1.1.4  mrg       mpfr_div (z, x, y, MPFR_RNDN);
   1499  1.1.1.4  mrg     }
   1500  1.1.1.4  mrg   mpfr_clear (x);
   1501  1.1.1.4  mrg   mpfr_clear (y);
   1502  1.1.1.4  mrg   mpfr_clear (z);
   1503  1.1.1.4  mrg }
   1504  1.1.1.4  mrg #endif
   1505  1.1.1.4  mrg 
   1506  1.1.1.4  mrg /* bug found in ttan with GMP_CHECK_RANDOMIZE=1514257254 */
   1507  1.1.1.4  mrg static void
   1508  1.1.1.4  mrg bug20171218 (void)
   1509  1.1.1.4  mrg {
   1510  1.1.1.4  mrg   mpfr_t s, c;
   1511  1.1.1.4  mrg   mpfr_init2 (s, 124);
   1512  1.1.1.4  mrg   mpfr_init2 (c, 124);
   1513  1.1.1.4  mrg   mpfr_set_str_binary (s, "-0.1110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110E0");
   1514  1.1.1.4  mrg   mpfr_set_str_binary (c, "0.1111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111E-1");
   1515  1.1.1.4  mrg   mpfr_div (c, s, c, MPFR_RNDN);
   1516  1.1.1.4  mrg   mpfr_set_str_binary (s, "-1.111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
   1517  1.1.1.4  mrg   MPFR_ASSERTN(mpfr_equal_p (c, s));
   1518  1.1.1.4  mrg   mpfr_clear (s);
   1519  1.1.1.4  mrg   mpfr_clear (c);
   1520  1.1.1.4  mrg }
   1521  1.1.1.4  mrg 
   1522  1.1.1.4  mrg /* Extended test based on a bug found with flint-arb test suite with a
   1523  1.1.1.4  mrg    32-bit ABI: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888459
   1524  1.1.1.4  mrg    Division of the form: (1 - 2^(-pa)) / (1 - 2^(-pb)).
   1525  1.1.1.4  mrg    The result is compared to the one obtained by increasing the precision of
   1526  1.1.1.4  mrg    the divisor (without changing its value, so that both results should be
   1527  1.1.1.4  mrg    equal). For all of these tests, a failure may occur in r12126 only with
   1528  1.1.1.4  mrg    pb=GMP_NUMB_BITS and MPFR_RNDN (and some particular values of pa and pc).
   1529  1.1.1.4  mrg    This bug was introduced by r9086, where mpfr_div uses mpfr_div_ui when
   1530  1.1.1.4  mrg    the divisor has only one limb.
   1531  1.1.1.4  mrg */
   1532  1.1.1.4  mrg static void
   1533  1.1.1.4  mrg bug20180126 (void)
   1534  1.1.1.4  mrg {
   1535  1.1.1.4  mrg   mpfr_t a, b1, b2, c1, c2;
   1536  1.1.1.4  mrg   int pa, i, j, pc, sa, sb, r, inex1, inex2;
   1537  1.1.1.4  mrg 
   1538  1.1.1.4  mrg   for (pa = 100; pa < 800; pa += 11)
   1539  1.1.1.4  mrg     for (i = 1; i <= 4; i++)
   1540  1.1.1.4  mrg       for (j = -2; j <= 2; j++)
   1541  1.1.1.4  mrg         {
   1542  1.1.1.4  mrg           int pb = GMP_NUMB_BITS * i + j;
   1543  1.1.1.4  mrg 
   1544  1.1.1.4  mrg           if (pb > pa)
   1545  1.1.1.4  mrg             continue;
   1546  1.1.1.4  mrg 
   1547  1.1.1.4  mrg           mpfr_inits2 (pa, a, b1, (mpfr_ptr) 0);
   1548  1.1.1.4  mrg           mpfr_inits2 (pb, b2, (mpfr_ptr) 0);
   1549  1.1.1.4  mrg 
   1550  1.1.1.4  mrg           mpfr_set_ui (a, 1, MPFR_RNDN);
   1551  1.1.1.4  mrg           mpfr_nextbelow (a);                   /* 1 - 2^(-pa) */
   1552  1.1.1.4  mrg           mpfr_set_ui (b2, 1, MPFR_RNDN);
   1553  1.1.1.4  mrg           mpfr_nextbelow (b2);                  /* 1 - 2^(-pb) */
   1554  1.1.1.4  mrg           inex1 = mpfr_set (b1, b2, MPFR_RNDN);
   1555  1.1.1.4  mrg           MPFR_ASSERTN (inex1 == 0);
   1556  1.1.1.4  mrg 
   1557  1.1.1.4  mrg           for (pc = 32; pc <= 320; pc += 32)
   1558  1.1.1.4  mrg             {
   1559  1.1.1.4  mrg               mpfr_inits2 (pc, c1, c2, (mpfr_ptr) 0);
   1560  1.1.1.4  mrg 
   1561  1.1.1.4  mrg               for (sa = 0; sa < 2; sa++)
   1562  1.1.1.4  mrg                 {
   1563  1.1.1.4  mrg                   for (sb = 0; sb < 2; sb++)
   1564  1.1.1.4  mrg                     {
   1565  1.1.1.4  mrg                       RND_LOOP_NO_RNDF (r)
   1566  1.1.1.4  mrg                         {
   1567  1.1.1.4  mrg                           MPFR_ASSERTN (mpfr_equal_p (b1, b2));
   1568  1.1.1.4  mrg                           inex1 = mpfr_div (c1, a, b1, (mpfr_rnd_t) r);
   1569  1.1.1.4  mrg                           inex2 = mpfr_div (c2, a, b2, (mpfr_rnd_t) r);
   1570  1.1.1.4  mrg 
   1571  1.1.1.4  mrg                           if (! mpfr_equal_p (c1, c2) ||
   1572  1.1.1.4  mrg                               ! SAME_SIGN (inex1, inex2))
   1573  1.1.1.4  mrg                             {
   1574  1.1.1.4  mrg                               printf ("Error in bug20180126 for "
   1575  1.1.1.4  mrg                                       "pa=%d pb=%d pc=%d sa=%d sb=%d %s\n",
   1576  1.1.1.4  mrg                                       pa, pb, pc, sa, sb,
   1577  1.1.1.4  mrg                                       mpfr_print_rnd_mode ((mpfr_rnd_t) r));
   1578  1.1.1.4  mrg                               printf ("inex1 = %d, c1 = ", inex1);
   1579  1.1.1.4  mrg                               mpfr_dump (c1);
   1580  1.1.1.4  mrg                               printf ("inex2 = %d, c2 = ", inex2);
   1581  1.1.1.4  mrg                               mpfr_dump (c2);
   1582  1.1.1.4  mrg                               exit (1);
   1583  1.1.1.4  mrg                             }
   1584  1.1.1.4  mrg                         }
   1585  1.1.1.4  mrg 
   1586  1.1.1.4  mrg                       mpfr_neg (b1, b1, MPFR_RNDN);
   1587  1.1.1.4  mrg                       mpfr_neg (b2, b2, MPFR_RNDN);
   1588  1.1.1.4  mrg                     }  /* sb */
   1589  1.1.1.4  mrg 
   1590  1.1.1.4  mrg                   mpfr_neg (a, a, MPFR_RNDN);
   1591  1.1.1.4  mrg                 }  /* sa */
   1592  1.1.1.4  mrg 
   1593  1.1.1.4  mrg               mpfr_clears (c1, c2, (mpfr_ptr) 0);
   1594  1.1.1.4  mrg             }  /* pc */
   1595  1.1.1.4  mrg 
   1596  1.1.1.4  mrg           mpfr_clears (a, b1, b2, (mpfr_ptr) 0);
   1597  1.1.1.4  mrg         }  /* j */
   1598  1.1.1.4  mrg }
   1599  1.1.1.4  mrg 
   1600      1.1  mrg int
   1601      1.1  mrg main (int argc, char *argv[])
   1602      1.1  mrg {
   1603      1.1  mrg   tests_start_mpfr ();
   1604      1.1  mrg 
   1605  1.1.1.4  mrg   bug20180126 ();
   1606  1.1.1.4  mrg   bug20171218 ();
   1607  1.1.1.4  mrg   testall_rndf (9);
   1608  1.1.1.4  mrg   test_20170105 ();
   1609      1.1  mrg   check_inexact ();
   1610      1.1  mrg   check_hard ();
   1611  1.1.1.2  mrg   check_special ();
   1612      1.1  mrg   check_lowr ();
   1613      1.1  mrg   check_float (); /* checks single precision */
   1614      1.1  mrg   check_double ();
   1615      1.1  mrg   check_convergence ();
   1616      1.1  mrg   check_64 ();
   1617      1.1  mrg 
   1618      1.1  mrg   check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62,
   1619      1.1  mrg    "0.10000000000000000000000000000000000000000000000000000000000000E-49");
   1620      1.1  mrg   check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65,
   1621      1.1  mrg    "0.11010011111001101011111001100111110100000001101001111100111000000E-622");
   1622      1.1  mrg   check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU,
   1623      1.1  mrg          65,
   1624      1.1  mrg   "0.11010011111001101011111001100111110100000001101001111100111000000E-1119");
   1625      1.1  mrg 
   1626      1.1  mrg   consistency ();
   1627      1.1  mrg   test_20070603 ();
   1628      1.1  mrg   test_20070628 ();
   1629  1.1.1.3  mrg   test_20151023 ();
   1630  1.1.1.4  mrg   test_20160831 ();
   1631  1.1.1.4  mrg   test_20170104 ();
   1632  1.1.1.4  mrg   test_20171219 ();
   1633  1.1.1.4  mrg   test_generic (MPFR_PREC_MIN, 800, 50);
   1634  1.1.1.4  mrg   test_bad ();
   1635  1.1.1.3  mrg   test_extreme ();
   1636  1.1.1.4  mrg   test_mpfr_divsp2 ();
   1637  1.1.1.4  mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64
   1638  1.1.1.4  mrg   test_mpfr_div2_approx (1000000);
   1639  1.1.1.4  mrg #endif
   1640      1.1  mrg 
   1641      1.1  mrg   tests_end_mpfr ();
   1642      1.1  mrg   return 0;
   1643      1.1  mrg }
   1644