Home | History | Annotate | Line # | Download | only in tests
tdiv.c revision 1.1.1.1.8.1
      1  1.1.1.1.8.1  tls /* Test file for mpfr_div (and some mpfr_div_ui, etc. tests).
      2          1.1  mrg 
      3  1.1.1.1.8.1  tls Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
      4  1.1.1.1.8.1  tls Contributed by the AriC and Caramel projects, INRIA.
      5          1.1  mrg 
      6          1.1  mrg This file is part of the GNU MPFR Library.
      7          1.1  mrg 
      8          1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
      9          1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     10          1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     11          1.1  mrg option) any later version.
     12          1.1  mrg 
     13          1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     14          1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15          1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     16          1.1  mrg License for more details.
     17          1.1  mrg 
     18          1.1  mrg You should have received a copy of the GNU Lesser General Public License
     19          1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     20          1.1  mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     21          1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     22          1.1  mrg 
     23          1.1  mrg #include <stdio.h>
     24          1.1  mrg #include <stdlib.h>
     25          1.1  mrg 
     26          1.1  mrg #include "mpfr-test.h"
     27          1.1  mrg 
     28  1.1.1.1.8.1  tls static void
     29  1.1.1.1.8.1  tls check_equal (mpfr_srcptr a, mpfr_srcptr a2, char *s,
     30  1.1.1.1.8.1  tls              mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
     31  1.1.1.1.8.1  tls {
     32  1.1.1.1.8.1  tls   if ((MPFR_IS_NAN (a) && MPFR_IS_NAN (a2)) ||
     33  1.1.1.1.8.1  tls       mpfr_equal_p (a, a2))
     34  1.1.1.1.8.1  tls     return;
     35  1.1.1.1.8.1  tls   printf ("Error in %s\n", mpfr_print_rnd_mode (r));
     36  1.1.1.1.8.1  tls   printf ("b  = ");
     37  1.1.1.1.8.1  tls   mpfr_dump (b);
     38  1.1.1.1.8.1  tls   printf ("c  = ");
     39  1.1.1.1.8.1  tls   mpfr_dump (c);
     40  1.1.1.1.8.1  tls   printf ("mpfr_div    result: ");
     41  1.1.1.1.8.1  tls   mpfr_dump (a);
     42  1.1.1.1.8.1  tls   printf ("%s result: ", s);
     43  1.1.1.1.8.1  tls   mpfr_dump (a2);
     44  1.1.1.1.8.1  tls   exit (1);
     45  1.1.1.1.8.1  tls }
     46  1.1.1.1.8.1  tls 
     47  1.1.1.1.8.1  tls static int
     48  1.1.1.1.8.1  tls mpfr_all_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r)
     49  1.1.1.1.8.1  tls {
     50  1.1.1.1.8.1  tls   mpfr_t a2;
     51  1.1.1.1.8.1  tls   unsigned int oldflags, newflags;
     52  1.1.1.1.8.1  tls   int inex, inex2;
     53  1.1.1.1.8.1  tls 
     54  1.1.1.1.8.1  tls   oldflags = __gmpfr_flags;
     55  1.1.1.1.8.1  tls   inex = mpfr_div (a, b, c, r);
     56  1.1.1.1.8.1  tls 
     57  1.1.1.1.8.1  tls   if (a == b || a == c)
     58  1.1.1.1.8.1  tls     return inex;
     59  1.1.1.1.8.1  tls 
     60  1.1.1.1.8.1  tls   newflags = __gmpfr_flags;
     61  1.1.1.1.8.1  tls 
     62  1.1.1.1.8.1  tls   mpfr_init2 (a2, MPFR_PREC (a));
     63  1.1.1.1.8.1  tls 
     64  1.1.1.1.8.1  tls   if (mpfr_integer_p (b) && ! (MPFR_IS_ZERO (b) && MPFR_IS_NEG (b)))
     65  1.1.1.1.8.1  tls     {
     66  1.1.1.1.8.1  tls       /* b is an integer, but not -0 (-0 is rejected as
     67  1.1.1.1.8.1  tls          it becomes +0 when converted to an integer). */
     68  1.1.1.1.8.1  tls       if (mpfr_fits_ulong_p (b, MPFR_RNDA))
     69  1.1.1.1.8.1  tls         {
     70  1.1.1.1.8.1  tls           __gmpfr_flags = oldflags;
     71  1.1.1.1.8.1  tls           inex2 = mpfr_ui_div (a2, mpfr_get_ui (b, MPFR_RNDN), c, r);
     72  1.1.1.1.8.1  tls           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
     73  1.1.1.1.8.1  tls           MPFR_ASSERTN (__gmpfr_flags == newflags);
     74  1.1.1.1.8.1  tls           check_equal (a, a2, "mpfr_ui_div", b, c, r);
     75  1.1.1.1.8.1  tls         }
     76  1.1.1.1.8.1  tls       if (mpfr_fits_slong_p (b, MPFR_RNDA))
     77  1.1.1.1.8.1  tls         {
     78  1.1.1.1.8.1  tls           __gmpfr_flags = oldflags;
     79  1.1.1.1.8.1  tls           inex2 = mpfr_si_div (a2, mpfr_get_si (b, MPFR_RNDN), c, r);
     80  1.1.1.1.8.1  tls           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
     81  1.1.1.1.8.1  tls           MPFR_ASSERTN (__gmpfr_flags == newflags);
     82  1.1.1.1.8.1  tls           check_equal (a, a2, "mpfr_si_div", b, c, r);
     83  1.1.1.1.8.1  tls         }
     84  1.1.1.1.8.1  tls     }
     85  1.1.1.1.8.1  tls 
     86  1.1.1.1.8.1  tls   if (mpfr_integer_p (c) && ! (MPFR_IS_ZERO (c) && MPFR_IS_NEG (c)))
     87  1.1.1.1.8.1  tls     {
     88  1.1.1.1.8.1  tls       /* c is an integer, but not -0 (-0 is rejected as
     89  1.1.1.1.8.1  tls          it becomes +0 when converted to an integer). */
     90  1.1.1.1.8.1  tls       if (mpfr_fits_ulong_p (c, MPFR_RNDA))
     91  1.1.1.1.8.1  tls         {
     92  1.1.1.1.8.1  tls           __gmpfr_flags = oldflags;
     93  1.1.1.1.8.1  tls           inex2 = mpfr_div_ui (a2, b, mpfr_get_ui (c, MPFR_RNDN), r);
     94  1.1.1.1.8.1  tls           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
     95  1.1.1.1.8.1  tls           MPFR_ASSERTN (__gmpfr_flags == newflags);
     96  1.1.1.1.8.1  tls           check_equal (a, a2, "mpfr_div_ui", b, c, r);
     97  1.1.1.1.8.1  tls         }
     98  1.1.1.1.8.1  tls       if (mpfr_fits_slong_p (c, MPFR_RNDA))
     99  1.1.1.1.8.1  tls         {
    100  1.1.1.1.8.1  tls           __gmpfr_flags = oldflags;
    101  1.1.1.1.8.1  tls           inex2 = mpfr_div_si (a2, b, mpfr_get_si (c, MPFR_RNDN), r);
    102  1.1.1.1.8.1  tls           MPFR_ASSERTN (SAME_SIGN (inex2, inex));
    103  1.1.1.1.8.1  tls           MPFR_ASSERTN (__gmpfr_flags == newflags);
    104  1.1.1.1.8.1  tls           check_equal (a, a2, "mpfr_div_si", b, c, r);
    105  1.1.1.1.8.1  tls         }
    106  1.1.1.1.8.1  tls     }
    107  1.1.1.1.8.1  tls 
    108  1.1.1.1.8.1  tls   mpfr_clear (a2);
    109  1.1.1.1.8.1  tls 
    110  1.1.1.1.8.1  tls   return inex;
    111  1.1.1.1.8.1  tls }
    112  1.1.1.1.8.1  tls 
    113          1.1  mrg #ifdef CHECK_EXTERNAL
    114          1.1  mrg static int
    115          1.1  mrg test_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode)
    116          1.1  mrg {
    117          1.1  mrg   int res;
    118          1.1  mrg   int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_number_p (c);
    119          1.1  mrg   if (ok)
    120          1.1  mrg     {
    121          1.1  mrg       mpfr_print_raw (b);
    122          1.1  mrg       printf (" ");
    123          1.1  mrg       mpfr_print_raw (c);
    124          1.1  mrg     }
    125  1.1.1.1.8.1  tls   res = mpfr_all_div (a, b, c, rnd_mode);
    126          1.1  mrg   if (ok)
    127          1.1  mrg     {
    128          1.1  mrg       printf (" ");
    129          1.1  mrg       mpfr_print_raw (a);
    130          1.1  mrg       printf ("\n");
    131          1.1  mrg     }
    132          1.1  mrg   return res;
    133          1.1  mrg }
    134          1.1  mrg #else
    135  1.1.1.1.8.1  tls #define test_div mpfr_all_div
    136          1.1  mrg #endif
    137          1.1  mrg 
    138          1.1  mrg #define check53(n, d, rnd, res) check4(n, d, rnd, 53, res)
    139          1.1  mrg 
    140          1.1  mrg /* return 0 iff a and b are of the same sign */
    141          1.1  mrg static int
    142          1.1  mrg inex_cmp (int a, int b)
    143          1.1  mrg {
    144          1.1  mrg   if (a > 0)
    145          1.1  mrg     return (b > 0) ? 0 : 1;
    146          1.1  mrg   else if (a == 0)
    147          1.1  mrg     return (b == 0) ? 0 : 1;
    148          1.1  mrg   else
    149          1.1  mrg     return (b < 0) ? 0 : 1;
    150          1.1  mrg }
    151          1.1  mrg 
    152          1.1  mrg static void
    153          1.1  mrg check4 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, int p,
    154          1.1  mrg         const char *Qs)
    155          1.1  mrg {
    156          1.1  mrg   mpfr_t q, n, d;
    157          1.1  mrg 
    158          1.1  mrg   mpfr_inits2 (p, q, n, d, (mpfr_ptr) 0);
    159          1.1  mrg   mpfr_set_str1 (n, Ns);
    160          1.1  mrg   mpfr_set_str1 (d, Ds);
    161          1.1  mrg   test_div(q, n, d, rnd_mode);
    162          1.1  mrg   if (mpfr_cmp_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN) )
    163          1.1  mrg     {
    164          1.1  mrg       printf ("mpfr_div failed for n=%s, d=%s, p=%d, rnd_mode=%s\n",
    165          1.1  mrg               Ns, Ds, p, mpfr_print_rnd_mode (rnd_mode));
    166          1.1  mrg       printf ("got      ");mpfr_print_binary(q);
    167          1.1  mrg       mpfr_set_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN);
    168          1.1  mrg       printf("\nexpected "); mpfr_print_binary(q);
    169          1.1  mrg       putchar('\n');
    170          1.1  mrg       exit (1);
    171          1.1  mrg     }
    172          1.1  mrg   mpfr_clears (q, n, d, (mpfr_ptr) 0);
    173          1.1  mrg }
    174          1.1  mrg 
    175          1.1  mrg static void
    176          1.1  mrg check24 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, const char *Qs)
    177          1.1  mrg {
    178          1.1  mrg   mpfr_t q, n, d;
    179          1.1  mrg 
    180          1.1  mrg   mpfr_inits2 (24, q, n, d, (mpfr_ptr) 0);
    181          1.1  mrg 
    182          1.1  mrg   mpfr_set_str1 (n, Ns);
    183          1.1  mrg   mpfr_set_str1 (d, Ds);
    184          1.1  mrg   test_div(q, n, d, rnd_mode);
    185          1.1  mrg   if (mpfr_cmp_str1 (q, Qs) )
    186          1.1  mrg     {
    187          1.1  mrg       printf ("mpfr_div failed for n=%s, d=%s, prec=24, rnd_mode=%s\n",
    188          1.1  mrg              Ns, Ds, mpfr_print_rnd_mode(rnd_mode));
    189          1.1  mrg       printf ("expected quotient is %s, got ", Qs);
    190          1.1  mrg       mpfr_out_str(stdout,10,0,q, MPFR_RNDN); putchar('\n');
    191          1.1  mrg       exit (1);
    192          1.1  mrg     }
    193          1.1  mrg   mpfr_clears (q, n, d, (mpfr_ptr) 0);
    194          1.1  mrg }
    195          1.1  mrg 
    196          1.1  mrg /* the following examples come from the paper "Number-theoretic Test
    197          1.1  mrg    Generation for Directed Rounding" from Michael Parks, Table 2 */
    198          1.1  mrg static void
    199          1.1  mrg check_float(void)
    200          1.1  mrg {
    201          1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDN, "8.388609e6");
    202          1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDN, "8.388609e6");
    203          1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDN, "8.388609e6");
    204          1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDN, "8.38861e6");
    205          1.1  mrg   /* the exponent for the following example was forgotten in
    206          1.1  mrg      the Arith'14 version of Parks' paper */
    207          1.1  mrg   check24 ("12582913.0", "12582910.0", MPFR_RNDN, "1.000000238");
    208          1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDN, "8388610.0");
    209          1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDN, "1.6777213e7");
    210          1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDN, "8.388611e6");
    211          1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDN, "1.2582911e7");
    212          1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDN, "1.258291e7");
    213          1.1  mrg 
    214          1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDZ, "8.388608e6");
    215          1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDZ, "8.388609e6");
    216          1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDZ, "8.388608e6");
    217          1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDZ, "8.38861e6");
    218          1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDZ, "1.000000238");
    219          1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDZ, "8388610.0");
    220          1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDZ, "1.6777213e7");
    221          1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDZ, "8.38861e6");
    222          1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDZ, "1.2582911e7");
    223          1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDZ, "1.258291e7");
    224          1.1  mrg 
    225          1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDU, "8.388609e6");
    226          1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDU, "8.38861e6");
    227          1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDU, "8.388609e6");
    228          1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDU, "8.388611e6");
    229          1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDU, "1.000000357");
    230          1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDU, "8388611.0");
    231          1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDU, "1.6777214e7");
    232          1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDU, "8.388611e6");
    233          1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDU, "1.2582912e7");
    234          1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDU, "1.2582911e7");
    235          1.1  mrg 
    236          1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDD, "8.388608e6");
    237          1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDD, "8.388609e6");
    238          1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDD, "8.388608e6");
    239          1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDD, "8.38861e6");
    240          1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDD, "1.000000238");
    241          1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDD, "8388610.0");
    242          1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDD, "1.6777213e7");
    243          1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDD, "8.38861e6");
    244          1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDD, "1.2582911e7");
    245          1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDD, "1.258291e7");
    246          1.1  mrg 
    247          1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDA, "8.388609e6");
    248          1.1  mrg }
    249          1.1  mrg 
    250          1.1  mrg static void
    251          1.1  mrg check_double(void)
    252          1.1  mrg {
    253          1.1  mrg   check53("0.0", "1.0", MPFR_RNDZ, "0.0");
    254          1.1  mrg   check53("-7.4988969224688591e63", "4.8816866450288732e306", MPFR_RNDD,
    255          1.1  mrg           "-1.5361282826510687291e-243");
    256          1.1  mrg   check53("-1.33225773037748601769e+199", "3.63449540676937123913e+79",
    257          1.1  mrg           MPFR_RNDZ, "-3.6655920045905428978e119");
    258          1.1  mrg   check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDU,
    259          1.1  mrg           "1.6672003992376663654e-67");
    260          1.1  mrg   check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDA,
    261          1.1  mrg           "1.6672003992376663654e-67");
    262          1.1  mrg   check53("9.89438396044940256501e-134", "-5.93472984109987421717e-67",
    263          1.1  mrg           MPFR_RNDU, "-1.6672003992376663654e-67");
    264          1.1  mrg   check53("-4.53063926135729747564e-308", "7.02293374921793516813e-84",
    265          1.1  mrg           MPFR_RNDD, "-6.4512060388748850857e-225");
    266          1.1  mrg   check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
    267          1.1  mrg           MPFR_RNDD, "-2.6540006635008291192e229");
    268          1.1  mrg   check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
    269          1.1  mrg           MPFR_RNDA, "-2.6540006635008291192e229");
    270          1.1  mrg   check53("6.52308934689126e15", "-1.62063546601505417497e273", MPFR_RNDN,
    271          1.1  mrg           "-4.0250194961676020848e-258");
    272          1.1  mrg   check53("1.04636807108079349236e-189", "3.72295730823253012954e-292",
    273          1.1  mrg           MPFR_RNDZ, "2.810583051186143125e102");
    274          1.1  mrg   /* problems found by Kevin under HP-PA */
    275          1.1  mrg   check53 ("2.861044553323177e-136", "-1.1120354257068143e+45", MPFR_RNDZ,
    276          1.1  mrg            "-2.5727998292003016e-181");
    277          1.1  mrg   check53 ("-4.0559157245809205e-127", "-1.1237723844524865e+77", MPFR_RNDN,
    278          1.1  mrg            "3.6091968273068081e-204");
    279          1.1  mrg   check53 ("-1.8177943561493235e-93", "-8.51233984260364e-104", MPFR_RNDU,
    280          1.1  mrg            "2.1354814184595821e+10");
    281          1.1  mrg }
    282          1.1  mrg 
    283          1.1  mrg static void
    284          1.1  mrg check_64(void)
    285          1.1  mrg {
    286          1.1  mrg   mpfr_t x,y,z;
    287          1.1  mrg 
    288          1.1  mrg   mpfr_inits2 (64, x, y, z, (mpfr_ptr) 0);
    289          1.1  mrg 
    290          1.1  mrg   mpfr_set_str_binary(x, "1.00100100110110101001010010101111000001011100100101010000000000E54");
    291          1.1  mrg   mpfr_set_str_binary(y, "1.00000000000000000000000000000000000000000000000000000000000000E584");
    292          1.1  mrg   test_div(z, x, y, MPFR_RNDU);
    293          1.1  mrg   if (mpfr_cmp_str (z, "0.1001001001101101010010100101011110000010111001001010100000000000E-529", 2, MPFR_RNDN))
    294          1.1  mrg     {
    295          1.1  mrg       printf("Error for tdiv for MPFR_RNDU and p=64\nx=");
    296          1.1  mrg       mpfr_print_binary(x);
    297          1.1  mrg       printf("\ny=");
    298          1.1  mrg       mpfr_print_binary(y);
    299          1.1  mrg       printf("\ngot      ");
    300          1.1  mrg       mpfr_print_binary(z);
    301          1.1  mrg       printf("\nexpected 0.1001001001101101010010100101011110000010111001001010100000000000E-529\n");
    302          1.1  mrg       exit(1);
    303          1.1  mrg     }
    304          1.1  mrg 
    305          1.1  mrg   mpfr_clears (x, y, z, (mpfr_ptr) 0);
    306          1.1  mrg }
    307          1.1  mrg 
    308          1.1  mrg static void
    309          1.1  mrg check_convergence (void)
    310          1.1  mrg {
    311          1.1  mrg   mpfr_t x, y; int i, j;
    312          1.1  mrg 
    313          1.1  mrg   mpfr_init2(x, 130);
    314          1.1  mrg   mpfr_set_str_binary(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944");
    315          1.1  mrg   mpfr_init2(y, 130);
    316          1.1  mrg   mpfr_set_ui(y, 5, MPFR_RNDN);
    317          1.1  mrg   test_div(x, x, y, MPFR_RNDD); /* exact division */
    318          1.1  mrg 
    319          1.1  mrg   mpfr_set_prec(x, 64);
    320          1.1  mrg   mpfr_set_prec(y, 64);
    321          1.1  mrg   mpfr_set_str_binary(x, "0.10010010011011010100101001010111100000101110010010101E55");
    322          1.1  mrg   mpfr_set_str_binary(y, "0.1E585");
    323          1.1  mrg   test_div(x, x, y, MPFR_RNDN);
    324          1.1  mrg   mpfr_set_str_binary(y, "0.10010010011011010100101001010111100000101110010010101E-529");
    325          1.1  mrg   if (mpfr_cmp (x, y))
    326          1.1  mrg     {
    327          1.1  mrg       printf ("Error in mpfr_div for prec=64, rnd=MPFR_RNDN\n");
    328          1.1  mrg       printf ("got        "); mpfr_print_binary(x); puts ("");
    329          1.1  mrg       printf ("instead of "); mpfr_print_binary(y); puts ("");
    330          1.1  mrg       exit(1);
    331          1.1  mrg     }
    332          1.1  mrg 
    333          1.1  mrg   for (i=32; i<=64; i+=32)
    334          1.1  mrg     {
    335          1.1  mrg       mpfr_set_prec(x, i);
    336          1.1  mrg       mpfr_set_prec(y, i);
    337          1.1  mrg       mpfr_set_ui(x, 1, MPFR_RNDN);
    338          1.1  mrg       RND_LOOP(j)
    339          1.1  mrg         {
    340          1.1  mrg           mpfr_set_ui (y, 1, MPFR_RNDN);
    341          1.1  mrg           test_div (y, x, y, (mpfr_rnd_t) j);
    342          1.1  mrg           if (mpfr_cmp_ui (y, 1))
    343          1.1  mrg             {
    344          1.1  mrg               printf ("mpfr_div failed for x=1.0, y=1.0, prec=%d rnd=%s\n",
    345          1.1  mrg                       i, mpfr_print_rnd_mode ((mpfr_rnd_t) j));
    346          1.1  mrg               printf ("got "); mpfr_print_binary(y); puts ("");
    347          1.1  mrg               exit (1);
    348          1.1  mrg             }
    349          1.1  mrg         }
    350          1.1  mrg     }
    351          1.1  mrg 
    352          1.1  mrg   mpfr_clear (x);
    353          1.1  mrg   mpfr_clear (y);
    354          1.1  mrg }
    355          1.1  mrg 
    356          1.1  mrg #define KMAX 10000
    357          1.1  mrg 
    358          1.1  mrg /* given y = o(x/u), x, u, find the inexact flag by
    359          1.1  mrg    multiplying y by u */
    360          1.1  mrg static int
    361          1.1  mrg get_inexact (mpfr_t y, mpfr_t x, mpfr_t u)
    362          1.1  mrg {
    363          1.1  mrg   mpfr_t xx;
    364          1.1  mrg   int inex;
    365          1.1  mrg   mpfr_init2 (xx, mpfr_get_prec (y) + mpfr_get_prec (u));
    366          1.1  mrg   mpfr_mul (xx, y, u, MPFR_RNDN); /* exact */
    367          1.1  mrg   inex = mpfr_cmp (xx, x);
    368          1.1  mrg   mpfr_clear (xx);
    369          1.1  mrg   return inex;
    370          1.1  mrg }
    371          1.1  mrg 
    372          1.1  mrg static void
    373          1.1  mrg check_hard (void)
    374          1.1  mrg {
    375          1.1  mrg   mpfr_t u, v, q, q2;
    376          1.1  mrg   mpfr_prec_t precu, precv, precq;
    377          1.1  mrg   int rnd;
    378          1.1  mrg   int inex, inex2, i, j;
    379          1.1  mrg 
    380          1.1  mrg   mpfr_init (q);
    381          1.1  mrg   mpfr_init (q2);
    382          1.1  mrg   mpfr_init (u);
    383          1.1  mrg   mpfr_init (v);
    384          1.1  mrg 
    385          1.1  mrg   for (precq = MPFR_PREC_MIN; precq <= 64; precq ++)
    386          1.1  mrg     {
    387          1.1  mrg       mpfr_set_prec (q, precq);
    388          1.1  mrg       mpfr_set_prec (q2, precq + 1);
    389          1.1  mrg       for (j = 0; j < 2; j++)
    390          1.1  mrg         {
    391          1.1  mrg           if (j == 0)
    392          1.1  mrg             {
    393          1.1  mrg               do
    394          1.1  mrg                 {
    395          1.1  mrg                   mpfr_urandomb (q2, RANDS);
    396          1.1  mrg                 }
    397          1.1  mrg               while (mpfr_cmp_ui (q2, 0) == 0);
    398          1.1  mrg             }
    399          1.1  mrg           else /* use q2=1 */
    400          1.1  mrg             mpfr_set_ui (q2, 1, MPFR_RNDN);
    401          1.1  mrg       for (precv = precq; precv <= 10 * precq; precv += precq)
    402          1.1  mrg         {
    403          1.1  mrg           mpfr_set_prec (v, precv);
    404          1.1  mrg           do
    405          1.1  mrg             {
    406          1.1  mrg               mpfr_urandomb (v, RANDS);
    407          1.1  mrg             }
    408          1.1  mrg           while (mpfr_cmp_ui (v, 0) == 0);
    409          1.1  mrg           for (precu = precq; precu <= 10 * precq; precu += precq)
    410          1.1  mrg             {
    411          1.1  mrg               mpfr_set_prec (u, precu);
    412          1.1  mrg               mpfr_mul (u, v, q2, MPFR_RNDN);
    413          1.1  mrg               mpfr_nextbelow (u);
    414          1.1  mrg               for (i = 0; i <= 2; i++)
    415          1.1  mrg                 {
    416          1.1  mrg                   RND_LOOP(rnd)
    417          1.1  mrg                     {
    418          1.1  mrg                       inex = test_div (q, u, v, (mpfr_rnd_t) rnd);
    419          1.1  mrg                       inex2 = get_inexact (q, u, v);
    420          1.1  mrg                       if (inex_cmp (inex, inex2))
    421          1.1  mrg                         {
    422          1.1  mrg                           printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n",
    423          1.1  mrg                                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex2, inex);
    424          1.1  mrg                           printf ("u=  "); mpfr_dump (u);
    425          1.1  mrg                           printf ("v=  "); mpfr_dump (v);
    426          1.1  mrg                           printf ("q=  "); mpfr_dump (q);
    427          1.1  mrg                           mpfr_set_prec (q2, precq + precv);
    428          1.1  mrg                           mpfr_mul (q2, q, v, MPFR_RNDN);
    429          1.1  mrg                           printf ("q*v="); mpfr_dump (q2);
    430          1.1  mrg                           exit (1);
    431          1.1  mrg                         }
    432          1.1  mrg                     }
    433          1.1  mrg                   mpfr_nextabove (u);
    434          1.1  mrg                 }
    435          1.1  mrg             }
    436          1.1  mrg         }
    437          1.1  mrg         }
    438          1.1  mrg     }
    439          1.1  mrg 
    440          1.1  mrg   mpfr_clear (q);
    441          1.1  mrg   mpfr_clear (q2);
    442          1.1  mrg   mpfr_clear (u);
    443          1.1  mrg   mpfr_clear (v);
    444          1.1  mrg }
    445          1.1  mrg 
    446          1.1  mrg static void
    447          1.1  mrg check_lowr (void)
    448          1.1  mrg {
    449          1.1  mrg   mpfr_t x, y, z, z2, z3, tmp;
    450          1.1  mrg   int k, c, c2;
    451          1.1  mrg 
    452          1.1  mrg 
    453          1.1  mrg   mpfr_init2 (x, 1000);
    454          1.1  mrg   mpfr_init2 (y, 100);
    455          1.1  mrg   mpfr_init2 (tmp, 850);
    456          1.1  mrg   mpfr_init2 (z, 10);
    457          1.1  mrg   mpfr_init2 (z2, 10);
    458          1.1  mrg   mpfr_init2 (z3, 50);
    459          1.1  mrg 
    460          1.1  mrg   for (k = 1; k < KMAX; k++)
    461          1.1  mrg     {
    462          1.1  mrg       do
    463          1.1  mrg         {
    464          1.1  mrg           mpfr_urandomb (z, RANDS);
    465          1.1  mrg         }
    466          1.1  mrg       while (mpfr_cmp_ui (z, 0) == 0);
    467          1.1  mrg       do
    468          1.1  mrg         {
    469          1.1  mrg           mpfr_urandomb (tmp, RANDS);
    470          1.1  mrg         }
    471          1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    472          1.1  mrg       mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
    473          1.1  mrg       c = test_div (z2, x, tmp, MPFR_RNDN);
    474          1.1  mrg 
    475          1.1  mrg       if (c || mpfr_cmp (z2, z))
    476          1.1  mrg         {
    477          1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
    478          1.1  mrg           printf ("got        "); mpfr_print_binary(z2); puts ("");
    479          1.1  mrg           printf ("instead of "); mpfr_print_binary(z); puts ("");
    480          1.1  mrg           printf ("inex flag = %d, expected 0\n", c);
    481          1.1  mrg           exit (1);
    482          1.1  mrg         }
    483          1.1  mrg     }
    484          1.1  mrg 
    485          1.1  mrg   /* x has still precision 1000, z precision 10, and tmp prec 850 */
    486          1.1  mrg   mpfr_set_prec (z2, 9);
    487          1.1  mrg   for (k = 1; k < KMAX; k++)
    488          1.1  mrg     {
    489          1.1  mrg       mpfr_urandomb (z, RANDS);
    490          1.1  mrg       do
    491          1.1  mrg         {
    492          1.1  mrg           mpfr_urandomb (tmp, RANDS);
    493          1.1  mrg         }
    494          1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    495          1.1  mrg       mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
    496          1.1  mrg       c = test_div (z2, x, tmp, MPFR_RNDN);
    497          1.1  mrg       /* since z2 has one less bit that z, either the division is exact
    498          1.1  mrg          if z is representable on 9 bits, or we have an even round case */
    499          1.1  mrg 
    500          1.1  mrg       c2 = get_inexact (z2, x, tmp);
    501          1.1  mrg       if ((mpfr_cmp (z2, z) == 0 && c) || inex_cmp (c, c2))
    502          1.1  mrg         {
    503          1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
    504          1.1  mrg           printf ("got        "); mpfr_print_binary(z2); puts ("");
    505          1.1  mrg           printf ("instead of "); mpfr_print_binary(z); puts ("");
    506          1.1  mrg           printf ("inex flag = %d, expected %d\n", c, c2);
    507          1.1  mrg           exit (1);
    508          1.1  mrg         }
    509          1.1  mrg       else if (c == 2)
    510          1.1  mrg         {
    511          1.1  mrg           mpfr_nexttoinf (z);
    512          1.1  mrg           if (mpfr_cmp(z2, z))
    513          1.1  mrg             {
    514          1.1  mrg               printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
    515          1.1  mrg               printf ("Dividing ");
    516          1.1  mrg               printf ("got        "); mpfr_print_binary(z2); puts ("");
    517          1.1  mrg               printf ("instead of "); mpfr_print_binary(z); puts ("");
    518          1.1  mrg               printf ("inex flag = %d\n", 1);
    519          1.1  mrg               exit (1);
    520          1.1  mrg             }
    521          1.1  mrg         }
    522          1.1  mrg       else if (c == -2)
    523          1.1  mrg         {
    524          1.1  mrg           mpfr_nexttozero (z);
    525          1.1  mrg           if (mpfr_cmp(z2, z))
    526          1.1  mrg             {
    527          1.1  mrg               printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
    528          1.1  mrg               printf ("Dividing ");
    529          1.1  mrg               printf ("got        "); mpfr_print_binary(z2); puts ("");
    530          1.1  mrg               printf ("instead of "); mpfr_print_binary(z); puts ("");
    531          1.1  mrg               printf ("inex flag = %d\n", 1);
    532          1.1  mrg               exit (1);
    533          1.1  mrg             }
    534          1.1  mrg         }
    535          1.1  mrg     }
    536          1.1  mrg 
    537          1.1  mrg   mpfr_set_prec(x, 1000);
    538          1.1  mrg   mpfr_set_prec(y, 100);
    539          1.1  mrg   mpfr_set_prec(tmp, 850);
    540          1.1  mrg   mpfr_set_prec(z, 10);
    541          1.1  mrg   mpfr_set_prec(z2, 10);
    542          1.1  mrg 
    543          1.1  mrg   /* almost exact divisions */
    544          1.1  mrg   for (k = 1; k < KMAX; k++)
    545          1.1  mrg     {
    546          1.1  mrg       do
    547          1.1  mrg         {
    548          1.1  mrg           mpfr_urandomb (z, RANDS);
    549          1.1  mrg         }
    550          1.1  mrg       while (mpfr_cmp_ui (z, 0) == 0);
    551          1.1  mrg       do
    552          1.1  mrg         {
    553          1.1  mrg           mpfr_urandomb (tmp, RANDS);
    554          1.1  mrg         }
    555          1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    556          1.1  mrg       mpfr_mul(x, z, tmp, MPFR_RNDN);
    557          1.1  mrg       mpfr_set(y, tmp, MPFR_RNDD);
    558          1.1  mrg       mpfr_nexttoinf (x);
    559          1.1  mrg 
    560          1.1  mrg       c = test_div(z2, x, y, MPFR_RNDD);
    561          1.1  mrg       test_div(z3, x, y, MPFR_RNDD);
    562          1.1  mrg       mpfr_set(z, z3, MPFR_RNDD);
    563          1.1  mrg 
    564          1.1  mrg       if (c != -1 || mpfr_cmp(z2, z))
    565          1.1  mrg         {
    566          1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDD\n");
    567          1.1  mrg           printf ("got        "); mpfr_print_binary(z2); puts ("");
    568          1.1  mrg           printf ("instead of "); mpfr_print_binary(z); puts ("");
    569          1.1  mrg           printf ("inex flag = %d\n", c);
    570          1.1  mrg           exit (1);
    571          1.1  mrg         }
    572          1.1  mrg 
    573          1.1  mrg       mpfr_set (y, tmp, MPFR_RNDU);
    574          1.1  mrg       test_div (z3, x, y, MPFR_RNDU);
    575          1.1  mrg       mpfr_set (z, z3, MPFR_RNDU);
    576          1.1  mrg       c = test_div (z2, x, y, MPFR_RNDU);
    577          1.1  mrg       if (c != 1 || mpfr_cmp (z2, z))
    578          1.1  mrg         {
    579          1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDU\n");
    580          1.1  mrg           printf ("u="); mpfr_dump (x);
    581          1.1  mrg           printf ("v="); mpfr_dump (y);
    582          1.1  mrg           printf ("got        "); mpfr_print_binary (z2); puts ("");
    583          1.1  mrg           printf ("instead of "); mpfr_print_binary (z); puts ("");
    584          1.1  mrg           printf ("inex flag = %d\n", c);
    585          1.1  mrg           exit (1);
    586          1.1  mrg         }
    587          1.1  mrg     }
    588          1.1  mrg 
    589          1.1  mrg   mpfr_clear (x);
    590          1.1  mrg   mpfr_clear (y);
    591          1.1  mrg   mpfr_clear (z);
    592          1.1  mrg   mpfr_clear (z2);
    593          1.1  mrg   mpfr_clear (z3);
    594          1.1  mrg   mpfr_clear (tmp);
    595          1.1  mrg }
    596          1.1  mrg 
    597          1.1  mrg #define MAX_PREC 128
    598          1.1  mrg 
    599          1.1  mrg static void
    600          1.1  mrg check_inexact (void)
    601          1.1  mrg {
    602          1.1  mrg   mpfr_t x, y, z, u;
    603          1.1  mrg   mpfr_prec_t px, py, pu;
    604          1.1  mrg   int inexact, cmp;
    605          1.1  mrg   mpfr_rnd_t rnd;
    606          1.1  mrg 
    607          1.1  mrg   mpfr_init (x);
    608          1.1  mrg   mpfr_init (y);
    609          1.1  mrg   mpfr_init (z);
    610          1.1  mrg   mpfr_init (u);
    611          1.1  mrg 
    612          1.1  mrg   mpfr_set_prec (x, 28);
    613          1.1  mrg   mpfr_set_prec (y, 28);
    614          1.1  mrg   mpfr_set_prec (z, 1023);
    615          1.1  mrg   mpfr_set_str_binary (x, "0.1000001001101101111100010011E0");
    616          1.1  mrg   mpfr_set_str (z, "48284762641021308813686974720835219181653367326353400027913400579340343320519877153813133510034402932651132854764198688352364361009429039801248971901380781746767119334993621199563870113045276395603170432175354501451429471578325545278975153148347684600400321033502982713296919861760382863826626093689036010394", 10, MPFR_RNDN);
    617          1.1  mrg   mpfr_div (x, x, z, MPFR_RNDN);
    618          1.1  mrg   mpfr_set_str_binary (y, "0.1111001011001101001001111100E-1023");
    619          1.1  mrg   if (mpfr_cmp (x, y))
    620          1.1  mrg     {
    621          1.1  mrg       printf ("Error in mpfr_div for prec=28, RNDN\n");
    622          1.1  mrg       printf ("Expected "); mpfr_dump (y);
    623          1.1  mrg       printf ("Got      "); mpfr_dump (x);
    624          1.1  mrg       exit (1);
    625          1.1  mrg     }
    626          1.1  mrg 
    627          1.1  mrg   mpfr_set_prec (x, 53);
    628          1.1  mrg   mpfr_set_str_binary (x, "0.11101100110010100011011000000100001111011111110010101E0");
    629          1.1  mrg   mpfr_set_prec (u, 127);
    630          1.1  mrg   mpfr_set_str_binary (u, "0.1000001100110110110101110110101101111000110000001111111110000000011111001010110100110010111111111101000001011011101011101101000E-2");
    631          1.1  mrg   mpfr_set_prec (y, 95);
    632          1.1  mrg   inexact = test_div (y, x, u, MPFR_RNDN);
    633          1.1  mrg   if (inexact != (cmp = get_inexact (y, x, u)))
    634          1.1  mrg     {
    635          1.1  mrg       printf ("Wrong inexact flag (0): expected %d, got %d\n", cmp, inexact);
    636          1.1  mrg       printf ("x="); mpfr_out_str (stdout, 10, 99, x, MPFR_RNDN); printf ("\n");
    637          1.1  mrg       printf ("u="); mpfr_out_str (stdout, 10, 99, u, MPFR_RNDN); printf ("\n");
    638          1.1  mrg       printf ("y="); mpfr_out_str (stdout, 10, 99, y, MPFR_RNDN); printf ("\n");
    639          1.1  mrg       exit (1);
    640          1.1  mrg     }
    641          1.1  mrg 
    642          1.1  mrg   mpfr_set_prec (x, 33);
    643          1.1  mrg   mpfr_set_str_binary (x, "0.101111100011011101010011101100001E0");
    644          1.1  mrg   mpfr_set_prec (u, 2);
    645          1.1  mrg   mpfr_set_str_binary (u, "0.1E0");
    646          1.1  mrg   mpfr_set_prec (y, 28);
    647          1.1  mrg   if ((inexact = test_div (y, x, u, MPFR_RNDN) >= 0))
    648          1.1  mrg     {
    649          1.1  mrg       printf ("Wrong inexact flag (1): expected -1, got %d\n",
    650          1.1  mrg               inexact);
    651          1.1  mrg       exit (1);
    652          1.1  mrg     }
    653          1.1  mrg 
    654          1.1  mrg   mpfr_set_prec (x, 129);
    655          1.1  mrg   mpfr_set_str_binary (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2");
    656          1.1  mrg   mpfr_set_prec (u, 15);
    657          1.1  mrg   mpfr_set_str_binary (u, "0.101101000001100E-1");
    658          1.1  mrg   mpfr_set_prec (y, 92);
    659          1.1  mrg   if ((inexact = test_div (y, x, u, MPFR_RNDN)) <= 0)
    660          1.1  mrg     {
    661          1.1  mrg       printf ("Wrong inexact flag for rnd=MPFR_RNDN(1): expected 1, got %d\n",
    662          1.1  mrg               inexact);
    663          1.1  mrg       mpfr_dump (x);
    664          1.1  mrg       mpfr_dump (u);
    665          1.1  mrg       mpfr_dump (y);
    666          1.1  mrg       exit (1);
    667          1.1  mrg     }
    668          1.1  mrg 
    669          1.1  mrg   for (px=2; px<MAX_PREC; px++)
    670          1.1  mrg     {
    671          1.1  mrg       mpfr_set_prec (x, px);
    672          1.1  mrg       mpfr_urandomb (x, RANDS);
    673          1.1  mrg       for (pu=2; pu<=MAX_PREC; pu++)
    674          1.1  mrg         {
    675          1.1  mrg           mpfr_set_prec (u, pu);
    676          1.1  mrg           do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0);
    677          1.1  mrg             {
    678          1.1  mrg               py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - MPFR_PREC_MIN));
    679          1.1  mrg               mpfr_set_prec (y, py);
    680          1.1  mrg               mpfr_set_prec (z, py + pu);
    681          1.1  mrg                 {
    682          1.1  mrg                   rnd = RND_RAND ();
    683          1.1  mrg                   inexact = test_div (y, x, u, rnd);
    684          1.1  mrg                   if (mpfr_mul (z, y, u, rnd))
    685          1.1  mrg                     {
    686          1.1  mrg                       printf ("z <- y * u should be exact\n");
    687          1.1  mrg                       exit (1);
    688          1.1  mrg                     }
    689          1.1  mrg                   cmp = mpfr_cmp (z, x);
    690          1.1  mrg                   if (((inexact == 0) && (cmp != 0)) ||
    691          1.1  mrg                       ((inexact > 0) && (cmp <= 0)) ||
    692          1.1  mrg                       ((inexact < 0) && (cmp >= 0)))
    693          1.1  mrg                     {
    694          1.1  mrg                       printf ("Wrong inexact flag for rnd=%s\n",
    695          1.1  mrg                               mpfr_print_rnd_mode(rnd));
    696          1.1  mrg                       printf ("expected %d, got %d\n", cmp, inexact);
    697          1.1  mrg                       printf ("x="); mpfr_print_binary (x); puts ("");
    698          1.1  mrg                       printf ("u="); mpfr_print_binary (u); puts ("");
    699          1.1  mrg                       printf ("y="); mpfr_print_binary (y); puts ("");
    700          1.1  mrg                       printf ("y*u="); mpfr_print_binary (z); puts ("");
    701          1.1  mrg                       exit (1);
    702          1.1  mrg                     }
    703          1.1  mrg                 }
    704          1.1  mrg             }
    705          1.1  mrg         }
    706          1.1  mrg     }
    707          1.1  mrg 
    708          1.1  mrg   mpfr_clear (x);
    709          1.1  mrg   mpfr_clear (y);
    710          1.1  mrg   mpfr_clear (z);
    711          1.1  mrg   mpfr_clear (u);
    712          1.1  mrg }
    713          1.1  mrg 
    714          1.1  mrg static void
    715  1.1.1.1.8.1  tls check_special (void)
    716          1.1  mrg {
    717          1.1  mrg   mpfr_t  a, d, q;
    718          1.1  mrg   mpfr_exp_t emax, emin;
    719          1.1  mrg   int i;
    720          1.1  mrg 
    721          1.1  mrg   mpfr_init2 (a, 100L);
    722          1.1  mrg   mpfr_init2 (d, 100L);
    723          1.1  mrg   mpfr_init2 (q, 100L);
    724          1.1  mrg 
    725          1.1  mrg   /* 1/nan == nan */
    726          1.1  mrg   mpfr_set_ui (a, 1L, MPFR_RNDN);
    727          1.1  mrg   MPFR_SET_NAN (d);
    728  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    729          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    730  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    731          1.1  mrg 
    732          1.1  mrg   /* nan/1 == nan */
    733          1.1  mrg   MPFR_SET_NAN (a);
    734          1.1  mrg   mpfr_set_ui (d, 1L, MPFR_RNDN);
    735  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    736          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    737  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    738          1.1  mrg 
    739          1.1  mrg   /* +inf/1 == +inf */
    740          1.1  mrg   MPFR_SET_INF (a);
    741          1.1  mrg   MPFR_SET_POS (a);
    742          1.1  mrg   mpfr_set_ui (d, 1L, MPFR_RNDN);
    743  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    744  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    745  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_inf_p (q));
    746  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_sgn (q) > 0);
    747  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    748  1.1.1.1.8.1  tls 
    749  1.1.1.1.8.1  tls   /* +inf/-1 == -inf */
    750  1.1.1.1.8.1  tls   MPFR_SET_INF (a);
    751  1.1.1.1.8.1  tls   MPFR_SET_POS (a);
    752  1.1.1.1.8.1  tls   mpfr_set_si (d, -1, MPFR_RNDN);
    753  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    754  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    755  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_inf_p (q));
    756  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_sgn (q) < 0);
    757  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    758  1.1.1.1.8.1  tls 
    759  1.1.1.1.8.1  tls   /* -inf/1 == -inf */
    760  1.1.1.1.8.1  tls   MPFR_SET_INF (a);
    761  1.1.1.1.8.1  tls   MPFR_SET_NEG (a);
    762  1.1.1.1.8.1  tls   mpfr_set_ui (d, 1L, MPFR_RNDN);
    763  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    764  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    765  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_inf_p (q));
    766  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_sgn (q) < 0);
    767  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    768  1.1.1.1.8.1  tls 
    769  1.1.1.1.8.1  tls   /* -inf/-1 == +inf */
    770  1.1.1.1.8.1  tls   MPFR_SET_INF (a);
    771  1.1.1.1.8.1  tls   MPFR_SET_NEG (a);
    772  1.1.1.1.8.1  tls   mpfr_set_si (d, -1, MPFR_RNDN);
    773  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    774          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    775          1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q));
    776          1.1  mrg   MPFR_ASSERTN (mpfr_sgn (q) > 0);
    777  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    778  1.1.1.1.8.1  tls 
    779  1.1.1.1.8.1  tls   /* 1/+inf == +0 */
    780  1.1.1.1.8.1  tls   mpfr_set_ui (a, 1L, MPFR_RNDN);
    781  1.1.1.1.8.1  tls   MPFR_SET_INF (d);
    782  1.1.1.1.8.1  tls   MPFR_SET_POS (d);
    783  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    784  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    785  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_number_p (q));
    786  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_sgn (q) == 0);
    787  1.1.1.1.8.1  tls   MPFR_ASSERTN (MPFR_IS_POS (q));
    788  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    789          1.1  mrg 
    790  1.1.1.1.8.1  tls   /* 1/-inf == -0 */
    791          1.1  mrg   mpfr_set_ui (a, 1L, MPFR_RNDN);
    792          1.1  mrg   MPFR_SET_INF (d);
    793  1.1.1.1.8.1  tls   MPFR_SET_NEG (d);
    794  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    795  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    796  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_number_p (q));
    797  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_sgn (q) == 0);
    798  1.1.1.1.8.1  tls   MPFR_ASSERTN (MPFR_IS_NEG (q));
    799  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    800  1.1.1.1.8.1  tls 
    801  1.1.1.1.8.1  tls   /* -1/+inf == -0 */
    802  1.1.1.1.8.1  tls   mpfr_set_si (a, -1, MPFR_RNDN);
    803  1.1.1.1.8.1  tls   MPFR_SET_INF (d);
    804          1.1  mrg   MPFR_SET_POS (d);
    805  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    806          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    807          1.1  mrg   MPFR_ASSERTN (mpfr_number_p (q));
    808          1.1  mrg   MPFR_ASSERTN (mpfr_sgn (q) == 0);
    809  1.1.1.1.8.1  tls   MPFR_ASSERTN (MPFR_IS_NEG (q));
    810  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    811  1.1.1.1.8.1  tls 
    812  1.1.1.1.8.1  tls   /* -1/-inf == +0 */
    813  1.1.1.1.8.1  tls   mpfr_set_si (a, -1, MPFR_RNDN);
    814  1.1.1.1.8.1  tls   MPFR_SET_INF (d);
    815  1.1.1.1.8.1  tls   MPFR_SET_NEG (d);
    816  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    817  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    818  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_number_p (q));
    819  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_sgn (q) == 0);
    820  1.1.1.1.8.1  tls   MPFR_ASSERTN (MPFR_IS_POS (q));
    821  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    822          1.1  mrg 
    823          1.1  mrg   /* 0/0 == nan */
    824          1.1  mrg   mpfr_set_ui (a, 0L, MPFR_RNDN);
    825          1.1  mrg   mpfr_set_ui (d, 0L, MPFR_RNDN);
    826  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    827          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    828  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    829          1.1  mrg 
    830          1.1  mrg   /* +inf/+inf == nan */
    831          1.1  mrg   MPFR_SET_INF (a);
    832          1.1  mrg   MPFR_SET_POS (a);
    833          1.1  mrg   MPFR_SET_INF (d);
    834          1.1  mrg   MPFR_SET_POS (d);
    835  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    836          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    837  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN);
    838          1.1  mrg 
    839  1.1.1.1.8.1  tls   /* 1/+0 = +inf */
    840          1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    841          1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    842  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    843          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    844          1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    845  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    846          1.1  mrg 
    847  1.1.1.1.8.1  tls   /* 1/-0 = -inf */
    848          1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    849          1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    850          1.1  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    851  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    852          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    853          1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    854  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    855          1.1  mrg 
    856  1.1.1.1.8.1  tls   /* -1/+0 = -inf */
    857          1.1  mrg   mpfr_set_si (a, -1, MPFR_RNDZ);
    858          1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    859  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    860          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    861          1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    862  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    863          1.1  mrg 
    864  1.1.1.1.8.1  tls   /* -1/-0 = +inf */
    865          1.1  mrg   mpfr_set_si (a, -1, MPFR_RNDZ);
    866          1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    867          1.1  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    868  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    869          1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    870          1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    871  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0);
    872  1.1.1.1.8.1  tls 
    873  1.1.1.1.8.1  tls   /* +inf/+0 = +inf */
    874  1.1.1.1.8.1  tls   MPFR_SET_INF (a);
    875  1.1.1.1.8.1  tls   MPFR_SET_POS (a);
    876  1.1.1.1.8.1  tls   mpfr_set_ui (d, 0, MPFR_RNDZ);
    877  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    878  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    879  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    880  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    881  1.1.1.1.8.1  tls 
    882  1.1.1.1.8.1  tls   /* +inf/-0 = -inf */
    883  1.1.1.1.8.1  tls   MPFR_SET_INF (a);
    884  1.1.1.1.8.1  tls   MPFR_SET_POS (a);
    885  1.1.1.1.8.1  tls   mpfr_set_ui (d, 0, MPFR_RNDZ);
    886  1.1.1.1.8.1  tls   mpfr_neg (d, d, MPFR_RNDZ);
    887  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    888  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    889  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    890  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    891  1.1.1.1.8.1  tls 
    892  1.1.1.1.8.1  tls   /* -inf/+0 = -inf */
    893  1.1.1.1.8.1  tls   MPFR_SET_INF (a);
    894  1.1.1.1.8.1  tls   MPFR_SET_NEG (a);
    895  1.1.1.1.8.1  tls   mpfr_set_ui (d, 0, MPFR_RNDZ);
    896  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    897  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    898  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    899  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    900  1.1.1.1.8.1  tls 
    901  1.1.1.1.8.1  tls   /* -inf/-0 = +inf */
    902  1.1.1.1.8.1  tls   MPFR_SET_INF (a);
    903  1.1.1.1.8.1  tls   MPFR_SET_NEG (a);
    904  1.1.1.1.8.1  tls   mpfr_set_ui (d, 0, MPFR_RNDZ);
    905  1.1.1.1.8.1  tls   mpfr_neg (d, d, MPFR_RNDZ);
    906  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    907  1.1.1.1.8.1  tls   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    908  1.1.1.1.8.1  tls   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    909  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == 0);
    910          1.1  mrg 
    911          1.1  mrg   /* check overflow */
    912          1.1  mrg   emax = mpfr_get_emax ();
    913          1.1  mrg   set_emax (1);
    914          1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    915          1.1  mrg   mpfr_set_ui (d, 1, MPFR_RNDZ);
    916          1.1  mrg   mpfr_div_2exp (d, d, 1, MPFR_RNDZ);
    917  1.1.1.1.8.1  tls   mpfr_clear_flags ();
    918          1.1  mrg   test_div (q, a, d, MPFR_RNDU); /* 1 / 0.5 = 2 -> overflow */
    919          1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    920  1.1.1.1.8.1  tls   MPFR_ASSERTN (__gmpfr_flags == (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT));
    921          1.1  mrg   set_emax (emax);
    922          1.1  mrg 
    923          1.1  mrg   /* check underflow */
    924          1.1  mrg   emin = mpfr_get_emin ();
    925          1.1  mrg   set_emin (-1);
    926          1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    927          1.1  mrg   mpfr_div_2exp (a, a, 2, MPFR_RNDZ);
    928          1.1  mrg   mpfr_set_prec (d, mpfr_get_prec (q) + 8);
    929          1.1  mrg   for (i = -1; i <= 1; i++)
    930          1.1  mrg     {
    931          1.1  mrg       int sign;
    932          1.1  mrg 
    933          1.1  mrg       /* Test 2^(-2) / (+/- (2 + eps)), with eps < 0, eps = 0, eps > 0.
    934          1.1  mrg          -> underflow.
    935          1.1  mrg          With div.c r5513, this test fails for eps > 0 in MPFR_RNDN. */
    936          1.1  mrg       mpfr_set_ui (d, 2, MPFR_RNDZ);
    937          1.1  mrg       if (i < 0)
    938          1.1  mrg         mpfr_nextbelow (d);
    939          1.1  mrg       if (i > 0)
    940          1.1  mrg         mpfr_nextabove (d);
    941          1.1  mrg       for (sign = 0; sign <= 1; sign++)
    942          1.1  mrg         {
    943          1.1  mrg           mpfr_clear_flags ();
    944          1.1  mrg           test_div (q, a, d, MPFR_RNDZ); /* result = 0 */
    945  1.1.1.1.8.1  tls           MPFR_ASSERTN (__gmpfr_flags ==
    946  1.1.1.1.8.1  tls                         (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT));
    947          1.1  mrg           MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
    948          1.1  mrg           MPFR_ASSERTN (MPFR_IS_ZERO (q));
    949          1.1  mrg           mpfr_clear_flags ();
    950          1.1  mrg           test_div (q, a, d, MPFR_RNDN); /* result = 0 iff eps >= 0 */
    951  1.1.1.1.8.1  tls           MPFR_ASSERTN (__gmpfr_flags ==
    952  1.1.1.1.8.1  tls                         (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT));
    953          1.1  mrg           MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
    954          1.1  mrg           if (i < 0)
    955          1.1  mrg             mpfr_nexttozero (q);
    956          1.1  mrg           MPFR_ASSERTN (MPFR_IS_ZERO (q));
    957          1.1  mrg           mpfr_neg (d, d, MPFR_RNDN);
    958          1.1  mrg         }
    959          1.1  mrg     }
    960          1.1  mrg   set_emin (emin);
    961          1.1  mrg 
    962          1.1  mrg   mpfr_clear (a);
    963          1.1  mrg   mpfr_clear (d);
    964          1.1  mrg   mpfr_clear (q);
    965          1.1  mrg }
    966          1.1  mrg 
    967          1.1  mrg static void
    968          1.1  mrg consistency (void)
    969          1.1  mrg {
    970          1.1  mrg   mpfr_t x, y, z1, z2;
    971          1.1  mrg   int i;
    972          1.1  mrg 
    973          1.1  mrg   mpfr_inits (x, y, z1, z2, (mpfr_ptr) 0);
    974          1.1  mrg 
    975          1.1  mrg   for (i = 0; i < 10000; i++)
    976          1.1  mrg     {
    977          1.1  mrg       mpfr_rnd_t rnd;
    978          1.1  mrg       mpfr_prec_t px, py, pz, p;
    979          1.1  mrg       int inex1, inex2;
    980          1.1  mrg 
    981          1.1  mrg       rnd = RND_RAND ();
    982          1.1  mrg       px = (randlimb () % 256) + 2;
    983          1.1  mrg       py = (randlimb () % 128) + 2;
    984          1.1  mrg       pz = (randlimb () % 256) + 2;
    985          1.1  mrg       mpfr_set_prec (x, px);
    986          1.1  mrg       mpfr_set_prec (y, py);
    987          1.1  mrg       mpfr_set_prec (z1, pz);
    988          1.1  mrg       mpfr_set_prec (z2, pz);
    989          1.1  mrg       mpfr_urandomb (x, RANDS);
    990          1.1  mrg       do
    991          1.1  mrg         mpfr_urandomb (y, RANDS);
    992          1.1  mrg       while (mpfr_zero_p (y));
    993          1.1  mrg       inex1 = mpfr_div (z1, x, y, rnd);
    994          1.1  mrg       MPFR_ASSERTN (!MPFR_IS_NAN (z1));
    995          1.1  mrg       p = MAX (MAX (px, py), pz);
    996          1.1  mrg       if (mpfr_prec_round (x, p, MPFR_RNDN) != 0 ||
    997          1.1  mrg           mpfr_prec_round (y, p, MPFR_RNDN) != 0)
    998          1.1  mrg         {
    999          1.1  mrg           printf ("mpfr_prec_round error for i = %d\n", i);
   1000          1.1  mrg           exit (1);
   1001          1.1  mrg         }
   1002          1.1  mrg       inex2 = mpfr_div (z2, x, y, rnd);
   1003          1.1  mrg       MPFR_ASSERTN (!MPFR_IS_NAN (z2));
   1004          1.1  mrg       if (inex1 != inex2 || mpfr_cmp (z1, z2) != 0)
   1005          1.1  mrg         {
   1006          1.1  mrg           printf ("Consistency error for i = %d\n", i);
   1007          1.1  mrg           exit (1);
   1008          1.1  mrg         }
   1009          1.1  mrg     }
   1010          1.1  mrg 
   1011          1.1  mrg   mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
   1012          1.1  mrg }
   1013          1.1  mrg 
   1014          1.1  mrg /* Reported by Carl Witty on 2007-06-03 */
   1015          1.1  mrg static void
   1016          1.1  mrg test_20070603 (void)
   1017          1.1  mrg {
   1018          1.1  mrg   mpfr_t n, d, q, c;
   1019          1.1  mrg 
   1020          1.1  mrg   mpfr_init2 (n, 128);
   1021          1.1  mrg   mpfr_init2 (d, 128);
   1022          1.1  mrg   mpfr_init2 (q, 31);
   1023          1.1  mrg   mpfr_init2 (c, 31);
   1024          1.1  mrg 
   1025          1.1  mrg   mpfr_set_str (n, "10384593717069655257060992206846485", 10, MPFR_RNDN);
   1026          1.1  mrg   mpfr_set_str (d, "10384593717069655257060992206847132", 10, MPFR_RNDN);
   1027          1.1  mrg   mpfr_div (q, n, d, MPFR_RNDU);
   1028          1.1  mrg 
   1029          1.1  mrg   mpfr_set_ui (c, 1, MPFR_RNDN);
   1030          1.1  mrg   if (mpfr_cmp (q, c) != 0)
   1031          1.1  mrg     {
   1032          1.1  mrg       printf ("Error in test_20070603\nGot        ");
   1033          1.1  mrg       mpfr_dump (q);
   1034          1.1  mrg       printf ("instead of ");
   1035          1.1  mrg       mpfr_dump (c);
   1036          1.1  mrg       exit (1);
   1037          1.1  mrg     }
   1038          1.1  mrg 
   1039          1.1  mrg   /* same for 64-bit machines */
   1040          1.1  mrg   mpfr_set_prec (n, 256);
   1041          1.1  mrg   mpfr_set_prec (d, 256);
   1042          1.1  mrg   mpfr_set_prec (q, 63);
   1043          1.1  mrg   mpfr_set_str (n, "822752278660603021077484591278675252491367930877209729029898240", 10, MPFR_RNDN);
   1044          1.1  mrg   mpfr_set_str (d, "822752278660603021077484591278675252491367930877212507873738752", 10, MPFR_RNDN);
   1045          1.1  mrg   mpfr_div (q, n, d, MPFR_RNDU);
   1046          1.1  mrg   if (mpfr_cmp (q, c) != 0)
   1047          1.1  mrg     {
   1048          1.1  mrg       printf ("Error in test_20070603\nGot        ");
   1049          1.1  mrg       mpfr_dump (q);
   1050          1.1  mrg       printf ("instead of ");
   1051          1.1  mrg       mpfr_dump (c);
   1052          1.1  mrg       exit (1);
   1053          1.1  mrg     }
   1054          1.1  mrg 
   1055          1.1  mrg   mpfr_clear (n);
   1056          1.1  mrg   mpfr_clear (d);
   1057          1.1  mrg   mpfr_clear (q);
   1058          1.1  mrg   mpfr_clear (c);
   1059          1.1  mrg }
   1060          1.1  mrg 
   1061          1.1  mrg /* Bug found while adding tests for mpfr_cot */
   1062          1.1  mrg static void
   1063          1.1  mrg test_20070628 (void)
   1064          1.1  mrg {
   1065          1.1  mrg   mpfr_exp_t old_emax;
   1066          1.1  mrg   mpfr_t x, y;
   1067          1.1  mrg   int inex, err = 0;
   1068          1.1  mrg 
   1069          1.1  mrg   old_emax = mpfr_get_emax ();
   1070          1.1  mrg 
   1071          1.1  mrg   if (mpfr_set_emax (256))
   1072          1.1  mrg     {
   1073          1.1  mrg       printf ("Can't change exponent range\n");
   1074          1.1  mrg       exit (1);
   1075          1.1  mrg     }
   1076          1.1  mrg 
   1077          1.1  mrg   mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
   1078          1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
   1079          1.1  mrg   mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN);
   1080          1.1  mrg   mpfr_clear_flags ();
   1081          1.1  mrg   inex = mpfr_div (x, x, y, MPFR_RNDD);
   1082          1.1  mrg   if (MPFR_SIGN (x) >= 0 || ! mpfr_inf_p (x))
   1083          1.1  mrg     {
   1084          1.1  mrg       printf ("Error in test_20070628: expected -Inf, got\n");
   1085          1.1  mrg       mpfr_dump (x);
   1086          1.1  mrg       err++;
   1087          1.1  mrg     }
   1088          1.1  mrg   if (inex >= 0)
   1089          1.1  mrg     {
   1090          1.1  mrg       printf ("Error in test_20070628: expected inex < 0, got %d\n", inex);
   1091          1.1  mrg       err++;
   1092          1.1  mrg     }
   1093          1.1  mrg   if (! mpfr_overflow_p ())
   1094          1.1  mrg     {
   1095          1.1  mrg       printf ("Error in test_20070628: overflow flag is not set\n");
   1096          1.1  mrg       err++;
   1097          1.1  mrg     }
   1098          1.1  mrg   mpfr_clears (x, y, (mpfr_ptr) 0);
   1099          1.1  mrg   mpfr_set_emax (old_emax);
   1100          1.1  mrg }
   1101          1.1  mrg 
   1102          1.1  mrg #define TEST_FUNCTION test_div
   1103          1.1  mrg #define TWO_ARGS
   1104          1.1  mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
   1105          1.1  mrg #include "tgeneric.c"
   1106          1.1  mrg 
   1107          1.1  mrg int
   1108          1.1  mrg main (int argc, char *argv[])
   1109          1.1  mrg {
   1110          1.1  mrg   tests_start_mpfr ();
   1111          1.1  mrg 
   1112          1.1  mrg   check_inexact ();
   1113          1.1  mrg   check_hard ();
   1114  1.1.1.1.8.1  tls   check_special ();
   1115          1.1  mrg   check_lowr ();
   1116          1.1  mrg   check_float (); /* checks single precision */
   1117          1.1  mrg   check_double ();
   1118          1.1  mrg   check_convergence ();
   1119          1.1  mrg   check_64 ();
   1120          1.1  mrg 
   1121          1.1  mrg   check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62,
   1122          1.1  mrg    "0.10000000000000000000000000000000000000000000000000000000000000E-49");
   1123          1.1  mrg   check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65,
   1124          1.1  mrg    "0.11010011111001101011111001100111110100000001101001111100111000000E-622");
   1125          1.1  mrg   check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU,
   1126          1.1  mrg          65,
   1127          1.1  mrg   "0.11010011111001101011111001100111110100000001101001111100111000000E-1119");
   1128          1.1  mrg 
   1129          1.1  mrg   consistency ();
   1130          1.1  mrg   test_20070603 ();
   1131          1.1  mrg   test_20070628 ();
   1132          1.1  mrg   test_generic (2, 800, 50);
   1133          1.1  mrg 
   1134          1.1  mrg   tests_end_mpfr ();
   1135          1.1  mrg   return 0;
   1136          1.1  mrg }
   1137