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