Home | History | Annotate | Line # | Download | only in tests
tdiv.c revision 1.1
      1  1.1  mrg /* Test file for mpfr_div.
      2  1.1  mrg 
      3  1.1  mrg Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
      4  1.1  mrg Contributed by the Arenaire and Cacao 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  mrg #ifdef CHECK_EXTERNAL
     29  1.1  mrg static int
     30  1.1  mrg test_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode)
     31  1.1  mrg {
     32  1.1  mrg   int res;
     33  1.1  mrg   int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_number_p (c);
     34  1.1  mrg   if (ok)
     35  1.1  mrg     {
     36  1.1  mrg       mpfr_print_raw (b);
     37  1.1  mrg       printf (" ");
     38  1.1  mrg       mpfr_print_raw (c);
     39  1.1  mrg     }
     40  1.1  mrg   res = mpfr_div (a, b, c, rnd_mode);
     41  1.1  mrg   if (ok)
     42  1.1  mrg     {
     43  1.1  mrg       printf (" ");
     44  1.1  mrg       mpfr_print_raw (a);
     45  1.1  mrg       printf ("\n");
     46  1.1  mrg     }
     47  1.1  mrg   return res;
     48  1.1  mrg }
     49  1.1  mrg #else
     50  1.1  mrg #define test_div mpfr_div
     51  1.1  mrg #endif
     52  1.1  mrg 
     53  1.1  mrg #define check53(n, d, rnd, res) check4(n, d, rnd, 53, res)
     54  1.1  mrg 
     55  1.1  mrg /* return 0 iff a and b are of the same sign */
     56  1.1  mrg static int
     57  1.1  mrg inex_cmp (int a, int b)
     58  1.1  mrg {
     59  1.1  mrg   if (a > 0)
     60  1.1  mrg     return (b > 0) ? 0 : 1;
     61  1.1  mrg   else if (a == 0)
     62  1.1  mrg     return (b == 0) ? 0 : 1;
     63  1.1  mrg   else
     64  1.1  mrg     return (b < 0) ? 0 : 1;
     65  1.1  mrg }
     66  1.1  mrg 
     67  1.1  mrg static void
     68  1.1  mrg check4 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, int p,
     69  1.1  mrg         const char *Qs)
     70  1.1  mrg {
     71  1.1  mrg   mpfr_t q, n, d;
     72  1.1  mrg 
     73  1.1  mrg   mpfr_inits2 (p, q, n, d, (mpfr_ptr) 0);
     74  1.1  mrg   mpfr_set_str1 (n, Ns);
     75  1.1  mrg   mpfr_set_str1 (d, Ds);
     76  1.1  mrg   test_div(q, n, d, rnd_mode);
     77  1.1  mrg   if (mpfr_cmp_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN) )
     78  1.1  mrg     {
     79  1.1  mrg       printf ("mpfr_div failed for n=%s, d=%s, p=%d, rnd_mode=%s\n",
     80  1.1  mrg               Ns, Ds, p, mpfr_print_rnd_mode (rnd_mode));
     81  1.1  mrg       printf ("got      ");mpfr_print_binary(q);
     82  1.1  mrg       mpfr_set_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN);
     83  1.1  mrg       printf("\nexpected "); mpfr_print_binary(q);
     84  1.1  mrg       putchar('\n');
     85  1.1  mrg       exit (1);
     86  1.1  mrg     }
     87  1.1  mrg   mpfr_clears (q, n, d, (mpfr_ptr) 0);
     88  1.1  mrg }
     89  1.1  mrg 
     90  1.1  mrg static void
     91  1.1  mrg check24 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, const char *Qs)
     92  1.1  mrg {
     93  1.1  mrg   mpfr_t q, n, d;
     94  1.1  mrg 
     95  1.1  mrg   mpfr_inits2 (24, q, n, d, (mpfr_ptr) 0);
     96  1.1  mrg 
     97  1.1  mrg   mpfr_set_str1 (n, Ns);
     98  1.1  mrg   mpfr_set_str1 (d, Ds);
     99  1.1  mrg   test_div(q, n, d, rnd_mode);
    100  1.1  mrg   if (mpfr_cmp_str1 (q, Qs) )
    101  1.1  mrg     {
    102  1.1  mrg       printf ("mpfr_div failed for n=%s, d=%s, prec=24, rnd_mode=%s\n",
    103  1.1  mrg              Ns, Ds, mpfr_print_rnd_mode(rnd_mode));
    104  1.1  mrg       printf ("expected quotient is %s, got ", Qs);
    105  1.1  mrg       mpfr_out_str(stdout,10,0,q, MPFR_RNDN); putchar('\n');
    106  1.1  mrg       exit (1);
    107  1.1  mrg     }
    108  1.1  mrg   mpfr_clears (q, n, d, (mpfr_ptr) 0);
    109  1.1  mrg }
    110  1.1  mrg 
    111  1.1  mrg /* the following examples come from the paper "Number-theoretic Test
    112  1.1  mrg    Generation for Directed Rounding" from Michael Parks, Table 2 */
    113  1.1  mrg static void
    114  1.1  mrg check_float(void)
    115  1.1  mrg {
    116  1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDN, "8.388609e6");
    117  1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDN, "8.388609e6");
    118  1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDN, "8.388609e6");
    119  1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDN, "8.38861e6");
    120  1.1  mrg   /* the exponent for the following example was forgotten in
    121  1.1  mrg      the Arith'14 version of Parks' paper */
    122  1.1  mrg   check24 ("12582913.0", "12582910.0", MPFR_RNDN, "1.000000238");
    123  1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDN, "8388610.0");
    124  1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDN, "1.6777213e7");
    125  1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDN, "8.388611e6");
    126  1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDN, "1.2582911e7");
    127  1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDN, "1.258291e7");
    128  1.1  mrg 
    129  1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDZ, "8.388608e6");
    130  1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDZ, "8.388609e6");
    131  1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDZ, "8.388608e6");
    132  1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDZ, "8.38861e6");
    133  1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDZ, "1.000000238");
    134  1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDZ, "8388610.0");
    135  1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDZ, "1.6777213e7");
    136  1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDZ, "8.38861e6");
    137  1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDZ, "1.2582911e7");
    138  1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDZ, "1.258291e7");
    139  1.1  mrg 
    140  1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDU, "8.388609e6");
    141  1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDU, "8.38861e6");
    142  1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDU, "8.388609e6");
    143  1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDU, "8.388611e6");
    144  1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDU, "1.000000357");
    145  1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDU, "8388611.0");
    146  1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDU, "1.6777214e7");
    147  1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDU, "8.388611e6");
    148  1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDU, "1.2582912e7");
    149  1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDU, "1.2582911e7");
    150  1.1  mrg 
    151  1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDD, "8.388608e6");
    152  1.1  mrg   check24("140737479966720.0", "16777213.0", MPFR_RNDD, "8.388609e6");
    153  1.1  mrg   check24("70368777732096.0", "8388611.0", MPFR_RNDD, "8.388608e6");
    154  1.1  mrg   check24("105553133043712.0", "12582911.0", MPFR_RNDD, "8.38861e6");
    155  1.1  mrg   check24("12582913.0", "12582910.0", MPFR_RNDD, "1.000000238");
    156  1.1  mrg   check24 ("105553124655104.0", "12582910.0", MPFR_RNDD, "8388610.0");
    157  1.1  mrg   check24("140737479966720.0", "8388609.0", MPFR_RNDD, "1.6777213e7");
    158  1.1  mrg   check24("70368777732096.0", "8388609.0", MPFR_RNDD, "8.38861e6");
    159  1.1  mrg   check24("105553133043712.0", "8388610.0", MPFR_RNDD, "1.2582911e7");
    160  1.1  mrg   check24("105553124655104.0", "8388610.0", MPFR_RNDD, "1.258291e7");
    161  1.1  mrg 
    162  1.1  mrg   check24("70368760954880.0", "8388609.0", MPFR_RNDA, "8.388609e6");
    163  1.1  mrg }
    164  1.1  mrg 
    165  1.1  mrg static void
    166  1.1  mrg check_double(void)
    167  1.1  mrg {
    168  1.1  mrg   check53("0.0", "1.0", MPFR_RNDZ, "0.0");
    169  1.1  mrg   check53("-7.4988969224688591e63", "4.8816866450288732e306", MPFR_RNDD,
    170  1.1  mrg           "-1.5361282826510687291e-243");
    171  1.1  mrg   check53("-1.33225773037748601769e+199", "3.63449540676937123913e+79",
    172  1.1  mrg           MPFR_RNDZ, "-3.6655920045905428978e119");
    173  1.1  mrg   check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDU,
    174  1.1  mrg           "1.6672003992376663654e-67");
    175  1.1  mrg   check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDA,
    176  1.1  mrg           "1.6672003992376663654e-67");
    177  1.1  mrg   check53("9.89438396044940256501e-134", "-5.93472984109987421717e-67",
    178  1.1  mrg           MPFR_RNDU, "-1.6672003992376663654e-67");
    179  1.1  mrg   check53("-4.53063926135729747564e-308", "7.02293374921793516813e-84",
    180  1.1  mrg           MPFR_RNDD, "-6.4512060388748850857e-225");
    181  1.1  mrg   check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
    182  1.1  mrg           MPFR_RNDD, "-2.6540006635008291192e229");
    183  1.1  mrg   check53("6.25089225176473806123e-01","-2.35527154824420243364e-230",
    184  1.1  mrg           MPFR_RNDA, "-2.6540006635008291192e229");
    185  1.1  mrg   check53("6.52308934689126e15", "-1.62063546601505417497e273", MPFR_RNDN,
    186  1.1  mrg           "-4.0250194961676020848e-258");
    187  1.1  mrg   check53("1.04636807108079349236e-189", "3.72295730823253012954e-292",
    188  1.1  mrg           MPFR_RNDZ, "2.810583051186143125e102");
    189  1.1  mrg   /* problems found by Kevin under HP-PA */
    190  1.1  mrg   check53 ("2.861044553323177e-136", "-1.1120354257068143e+45", MPFR_RNDZ,
    191  1.1  mrg            "-2.5727998292003016e-181");
    192  1.1  mrg   check53 ("-4.0559157245809205e-127", "-1.1237723844524865e+77", MPFR_RNDN,
    193  1.1  mrg            "3.6091968273068081e-204");
    194  1.1  mrg   check53 ("-1.8177943561493235e-93", "-8.51233984260364e-104", MPFR_RNDU,
    195  1.1  mrg            "2.1354814184595821e+10");
    196  1.1  mrg }
    197  1.1  mrg 
    198  1.1  mrg static void
    199  1.1  mrg check_64(void)
    200  1.1  mrg {
    201  1.1  mrg   mpfr_t x,y,z;
    202  1.1  mrg 
    203  1.1  mrg   mpfr_inits2 (64, x, y, z, (mpfr_ptr) 0);
    204  1.1  mrg 
    205  1.1  mrg   mpfr_set_str_binary(x, "1.00100100110110101001010010101111000001011100100101010000000000E54");
    206  1.1  mrg   mpfr_set_str_binary(y, "1.00000000000000000000000000000000000000000000000000000000000000E584");
    207  1.1  mrg   test_div(z, x, y, MPFR_RNDU);
    208  1.1  mrg   if (mpfr_cmp_str (z, "0.1001001001101101010010100101011110000010111001001010100000000000E-529", 2, MPFR_RNDN))
    209  1.1  mrg     {
    210  1.1  mrg       printf("Error for tdiv for MPFR_RNDU and p=64\nx=");
    211  1.1  mrg       mpfr_print_binary(x);
    212  1.1  mrg       printf("\ny=");
    213  1.1  mrg       mpfr_print_binary(y);
    214  1.1  mrg       printf("\ngot      ");
    215  1.1  mrg       mpfr_print_binary(z);
    216  1.1  mrg       printf("\nexpected 0.1001001001101101010010100101011110000010111001001010100000000000E-529\n");
    217  1.1  mrg       exit(1);
    218  1.1  mrg     }
    219  1.1  mrg 
    220  1.1  mrg   mpfr_clears (x, y, z, (mpfr_ptr) 0);
    221  1.1  mrg }
    222  1.1  mrg 
    223  1.1  mrg static void
    224  1.1  mrg check_convergence (void)
    225  1.1  mrg {
    226  1.1  mrg   mpfr_t x, y; int i, j;
    227  1.1  mrg 
    228  1.1  mrg   mpfr_init2(x, 130);
    229  1.1  mrg   mpfr_set_str_binary(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944");
    230  1.1  mrg   mpfr_init2(y, 130);
    231  1.1  mrg   mpfr_set_ui(y, 5, MPFR_RNDN);
    232  1.1  mrg   test_div(x, x, y, MPFR_RNDD); /* exact division */
    233  1.1  mrg 
    234  1.1  mrg   mpfr_set_prec(x, 64);
    235  1.1  mrg   mpfr_set_prec(y, 64);
    236  1.1  mrg   mpfr_set_str_binary(x, "0.10010010011011010100101001010111100000101110010010101E55");
    237  1.1  mrg   mpfr_set_str_binary(y, "0.1E585");
    238  1.1  mrg   test_div(x, x, y, MPFR_RNDN);
    239  1.1  mrg   mpfr_set_str_binary(y, "0.10010010011011010100101001010111100000101110010010101E-529");
    240  1.1  mrg   if (mpfr_cmp (x, y))
    241  1.1  mrg     {
    242  1.1  mrg       printf ("Error in mpfr_div for prec=64, rnd=MPFR_RNDN\n");
    243  1.1  mrg       printf ("got        "); mpfr_print_binary(x); puts ("");
    244  1.1  mrg       printf ("instead of "); mpfr_print_binary(y); puts ("");
    245  1.1  mrg       exit(1);
    246  1.1  mrg     }
    247  1.1  mrg 
    248  1.1  mrg   for (i=32; i<=64; i+=32)
    249  1.1  mrg     {
    250  1.1  mrg       mpfr_set_prec(x, i);
    251  1.1  mrg       mpfr_set_prec(y, i);
    252  1.1  mrg       mpfr_set_ui(x, 1, MPFR_RNDN);
    253  1.1  mrg       RND_LOOP(j)
    254  1.1  mrg         {
    255  1.1  mrg           mpfr_set_ui (y, 1, MPFR_RNDN);
    256  1.1  mrg           test_div (y, x, y, (mpfr_rnd_t) j);
    257  1.1  mrg           if (mpfr_cmp_ui (y, 1))
    258  1.1  mrg             {
    259  1.1  mrg               printf ("mpfr_div failed for x=1.0, y=1.0, prec=%d rnd=%s\n",
    260  1.1  mrg                       i, mpfr_print_rnd_mode ((mpfr_rnd_t) j));
    261  1.1  mrg               printf ("got "); mpfr_print_binary(y); puts ("");
    262  1.1  mrg               exit (1);
    263  1.1  mrg             }
    264  1.1  mrg         }
    265  1.1  mrg     }
    266  1.1  mrg 
    267  1.1  mrg   mpfr_clear (x);
    268  1.1  mrg   mpfr_clear (y);
    269  1.1  mrg }
    270  1.1  mrg 
    271  1.1  mrg #define KMAX 10000
    272  1.1  mrg 
    273  1.1  mrg /* given y = o(x/u), x, u, find the inexact flag by
    274  1.1  mrg    multiplying y by u */
    275  1.1  mrg static int
    276  1.1  mrg get_inexact (mpfr_t y, mpfr_t x, mpfr_t u)
    277  1.1  mrg {
    278  1.1  mrg   mpfr_t xx;
    279  1.1  mrg   int inex;
    280  1.1  mrg   mpfr_init2 (xx, mpfr_get_prec (y) + mpfr_get_prec (u));
    281  1.1  mrg   mpfr_mul (xx, y, u, MPFR_RNDN); /* exact */
    282  1.1  mrg   inex = mpfr_cmp (xx, x);
    283  1.1  mrg   mpfr_clear (xx);
    284  1.1  mrg   return inex;
    285  1.1  mrg }
    286  1.1  mrg 
    287  1.1  mrg static void
    288  1.1  mrg check_hard (void)
    289  1.1  mrg {
    290  1.1  mrg   mpfr_t u, v, q, q2;
    291  1.1  mrg   mpfr_prec_t precu, precv, precq;
    292  1.1  mrg   int rnd;
    293  1.1  mrg   int inex, inex2, i, j;
    294  1.1  mrg 
    295  1.1  mrg   mpfr_init (q);
    296  1.1  mrg   mpfr_init (q2);
    297  1.1  mrg   mpfr_init (u);
    298  1.1  mrg   mpfr_init (v);
    299  1.1  mrg 
    300  1.1  mrg   for (precq = MPFR_PREC_MIN; precq <= 64; precq ++)
    301  1.1  mrg     {
    302  1.1  mrg       mpfr_set_prec (q, precq);
    303  1.1  mrg       mpfr_set_prec (q2, precq + 1);
    304  1.1  mrg       for (j = 0; j < 2; j++)
    305  1.1  mrg         {
    306  1.1  mrg           if (j == 0)
    307  1.1  mrg             {
    308  1.1  mrg               do
    309  1.1  mrg                 {
    310  1.1  mrg                   mpfr_urandomb (q2, RANDS);
    311  1.1  mrg                 }
    312  1.1  mrg               while (mpfr_cmp_ui (q2, 0) == 0);
    313  1.1  mrg             }
    314  1.1  mrg           else /* use q2=1 */
    315  1.1  mrg             mpfr_set_ui (q2, 1, MPFR_RNDN);
    316  1.1  mrg       for (precv = precq; precv <= 10 * precq; precv += precq)
    317  1.1  mrg         {
    318  1.1  mrg           mpfr_set_prec (v, precv);
    319  1.1  mrg           do
    320  1.1  mrg             {
    321  1.1  mrg               mpfr_urandomb (v, RANDS);
    322  1.1  mrg             }
    323  1.1  mrg           while (mpfr_cmp_ui (v, 0) == 0);
    324  1.1  mrg           for (precu = precq; precu <= 10 * precq; precu += precq)
    325  1.1  mrg             {
    326  1.1  mrg               mpfr_set_prec (u, precu);
    327  1.1  mrg               mpfr_mul (u, v, q2, MPFR_RNDN);
    328  1.1  mrg               mpfr_nextbelow (u);
    329  1.1  mrg               for (i = 0; i <= 2; i++)
    330  1.1  mrg                 {
    331  1.1  mrg                   RND_LOOP(rnd)
    332  1.1  mrg                     {
    333  1.1  mrg                       inex = test_div (q, u, v, (mpfr_rnd_t) rnd);
    334  1.1  mrg                       inex2 = get_inexact (q, u, v);
    335  1.1  mrg                       if (inex_cmp (inex, inex2))
    336  1.1  mrg                         {
    337  1.1  mrg                           printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n",
    338  1.1  mrg                                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex2, inex);
    339  1.1  mrg                           printf ("u=  "); mpfr_dump (u);
    340  1.1  mrg                           printf ("v=  "); mpfr_dump (v);
    341  1.1  mrg                           printf ("q=  "); mpfr_dump (q);
    342  1.1  mrg                           mpfr_set_prec (q2, precq + precv);
    343  1.1  mrg                           mpfr_mul (q2, q, v, MPFR_RNDN);
    344  1.1  mrg                           printf ("q*v="); mpfr_dump (q2);
    345  1.1  mrg                           exit (1);
    346  1.1  mrg                         }
    347  1.1  mrg                     }
    348  1.1  mrg                   mpfr_nextabove (u);
    349  1.1  mrg                 }
    350  1.1  mrg             }
    351  1.1  mrg         }
    352  1.1  mrg         }
    353  1.1  mrg     }
    354  1.1  mrg 
    355  1.1  mrg   mpfr_clear (q);
    356  1.1  mrg   mpfr_clear (q2);
    357  1.1  mrg   mpfr_clear (u);
    358  1.1  mrg   mpfr_clear (v);
    359  1.1  mrg }
    360  1.1  mrg 
    361  1.1  mrg static void
    362  1.1  mrg check_lowr (void)
    363  1.1  mrg {
    364  1.1  mrg   mpfr_t x, y, z, z2, z3, tmp;
    365  1.1  mrg   int k, c, c2;
    366  1.1  mrg 
    367  1.1  mrg 
    368  1.1  mrg   mpfr_init2 (x, 1000);
    369  1.1  mrg   mpfr_init2 (y, 100);
    370  1.1  mrg   mpfr_init2 (tmp, 850);
    371  1.1  mrg   mpfr_init2 (z, 10);
    372  1.1  mrg   mpfr_init2 (z2, 10);
    373  1.1  mrg   mpfr_init2 (z3, 50);
    374  1.1  mrg 
    375  1.1  mrg   for (k = 1; k < KMAX; k++)
    376  1.1  mrg     {
    377  1.1  mrg       do
    378  1.1  mrg         {
    379  1.1  mrg           mpfr_urandomb (z, RANDS);
    380  1.1  mrg         }
    381  1.1  mrg       while (mpfr_cmp_ui (z, 0) == 0);
    382  1.1  mrg       do
    383  1.1  mrg         {
    384  1.1  mrg           mpfr_urandomb (tmp, RANDS);
    385  1.1  mrg         }
    386  1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    387  1.1  mrg       mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
    388  1.1  mrg       c = test_div (z2, x, tmp, MPFR_RNDN);
    389  1.1  mrg 
    390  1.1  mrg       if (c || mpfr_cmp (z2, z))
    391  1.1  mrg         {
    392  1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
    393  1.1  mrg           printf ("got        "); mpfr_print_binary(z2); puts ("");
    394  1.1  mrg           printf ("instead of "); mpfr_print_binary(z); puts ("");
    395  1.1  mrg           printf ("inex flag = %d, expected 0\n", c);
    396  1.1  mrg           exit (1);
    397  1.1  mrg         }
    398  1.1  mrg     }
    399  1.1  mrg 
    400  1.1  mrg   /* x has still precision 1000, z precision 10, and tmp prec 850 */
    401  1.1  mrg   mpfr_set_prec (z2, 9);
    402  1.1  mrg   for (k = 1; k < KMAX; k++)
    403  1.1  mrg     {
    404  1.1  mrg       mpfr_urandomb (z, RANDS);
    405  1.1  mrg       do
    406  1.1  mrg         {
    407  1.1  mrg           mpfr_urandomb (tmp, RANDS);
    408  1.1  mrg         }
    409  1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    410  1.1  mrg       mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */
    411  1.1  mrg       c = test_div (z2, x, tmp, MPFR_RNDN);
    412  1.1  mrg       /* since z2 has one less bit that z, either the division is exact
    413  1.1  mrg          if z is representable on 9 bits, or we have an even round case */
    414  1.1  mrg 
    415  1.1  mrg       c2 = get_inexact (z2, x, tmp);
    416  1.1  mrg       if ((mpfr_cmp (z2, z) == 0 && c) || inex_cmp (c, c2))
    417  1.1  mrg         {
    418  1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDN\n");
    419  1.1  mrg           printf ("got        "); mpfr_print_binary(z2); puts ("");
    420  1.1  mrg           printf ("instead of "); mpfr_print_binary(z); puts ("");
    421  1.1  mrg           printf ("inex flag = %d, expected %d\n", c, c2);
    422  1.1  mrg           exit (1);
    423  1.1  mrg         }
    424  1.1  mrg       else if (c == 2)
    425  1.1  mrg         {
    426  1.1  mrg           mpfr_nexttoinf (z);
    427  1.1  mrg           if (mpfr_cmp(z2, z))
    428  1.1  mrg             {
    429  1.1  mrg               printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
    430  1.1  mrg               printf ("Dividing ");
    431  1.1  mrg               printf ("got        "); mpfr_print_binary(z2); puts ("");
    432  1.1  mrg               printf ("instead of "); mpfr_print_binary(z); puts ("");
    433  1.1  mrg               printf ("inex flag = %d\n", 1);
    434  1.1  mrg               exit (1);
    435  1.1  mrg             }
    436  1.1  mrg         }
    437  1.1  mrg       else if (c == -2)
    438  1.1  mrg         {
    439  1.1  mrg           mpfr_nexttozero (z);
    440  1.1  mrg           if (mpfr_cmp(z2, z))
    441  1.1  mrg             {
    442  1.1  mrg               printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n");
    443  1.1  mrg               printf ("Dividing ");
    444  1.1  mrg               printf ("got        "); mpfr_print_binary(z2); puts ("");
    445  1.1  mrg               printf ("instead of "); mpfr_print_binary(z); puts ("");
    446  1.1  mrg               printf ("inex flag = %d\n", 1);
    447  1.1  mrg               exit (1);
    448  1.1  mrg             }
    449  1.1  mrg         }
    450  1.1  mrg     }
    451  1.1  mrg 
    452  1.1  mrg   mpfr_set_prec(x, 1000);
    453  1.1  mrg   mpfr_set_prec(y, 100);
    454  1.1  mrg   mpfr_set_prec(tmp, 850);
    455  1.1  mrg   mpfr_set_prec(z, 10);
    456  1.1  mrg   mpfr_set_prec(z2, 10);
    457  1.1  mrg 
    458  1.1  mrg   /* almost exact divisions */
    459  1.1  mrg   for (k = 1; k < KMAX; k++)
    460  1.1  mrg     {
    461  1.1  mrg       do
    462  1.1  mrg         {
    463  1.1  mrg           mpfr_urandomb (z, RANDS);
    464  1.1  mrg         }
    465  1.1  mrg       while (mpfr_cmp_ui (z, 0) == 0);
    466  1.1  mrg       do
    467  1.1  mrg         {
    468  1.1  mrg           mpfr_urandomb (tmp, RANDS);
    469  1.1  mrg         }
    470  1.1  mrg       while (mpfr_cmp_ui (tmp, 0) == 0);
    471  1.1  mrg       mpfr_mul(x, z, tmp, MPFR_RNDN);
    472  1.1  mrg       mpfr_set(y, tmp, MPFR_RNDD);
    473  1.1  mrg       mpfr_nexttoinf (x);
    474  1.1  mrg 
    475  1.1  mrg       c = test_div(z2, x, y, MPFR_RNDD);
    476  1.1  mrg       test_div(z3, x, y, MPFR_RNDD);
    477  1.1  mrg       mpfr_set(z, z3, MPFR_RNDD);
    478  1.1  mrg 
    479  1.1  mrg       if (c != -1 || mpfr_cmp(z2, z))
    480  1.1  mrg         {
    481  1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDD\n");
    482  1.1  mrg           printf ("got        "); mpfr_print_binary(z2); puts ("");
    483  1.1  mrg           printf ("instead of "); mpfr_print_binary(z); puts ("");
    484  1.1  mrg           printf ("inex flag = %d\n", c);
    485  1.1  mrg           exit (1);
    486  1.1  mrg         }
    487  1.1  mrg 
    488  1.1  mrg       mpfr_set (y, tmp, MPFR_RNDU);
    489  1.1  mrg       test_div (z3, x, y, MPFR_RNDU);
    490  1.1  mrg       mpfr_set (z, z3, MPFR_RNDU);
    491  1.1  mrg       c = test_div (z2, x, y, MPFR_RNDU);
    492  1.1  mrg       if (c != 1 || mpfr_cmp (z2, z))
    493  1.1  mrg         {
    494  1.1  mrg           printf ("Error in mpfr_div rnd=MPFR_RNDU\n");
    495  1.1  mrg           printf ("u="); mpfr_dump (x);
    496  1.1  mrg           printf ("v="); mpfr_dump (y);
    497  1.1  mrg           printf ("got        "); mpfr_print_binary (z2); puts ("");
    498  1.1  mrg           printf ("instead of "); mpfr_print_binary (z); puts ("");
    499  1.1  mrg           printf ("inex flag = %d\n", c);
    500  1.1  mrg           exit (1);
    501  1.1  mrg         }
    502  1.1  mrg     }
    503  1.1  mrg 
    504  1.1  mrg   mpfr_clear (x);
    505  1.1  mrg   mpfr_clear (y);
    506  1.1  mrg   mpfr_clear (z);
    507  1.1  mrg   mpfr_clear (z2);
    508  1.1  mrg   mpfr_clear (z3);
    509  1.1  mrg   mpfr_clear (tmp);
    510  1.1  mrg }
    511  1.1  mrg 
    512  1.1  mrg #define MAX_PREC 128
    513  1.1  mrg 
    514  1.1  mrg static void
    515  1.1  mrg check_inexact (void)
    516  1.1  mrg {
    517  1.1  mrg   mpfr_t x, y, z, u;
    518  1.1  mrg   mpfr_prec_t px, py, pu;
    519  1.1  mrg   int inexact, cmp;
    520  1.1  mrg   mpfr_rnd_t rnd;
    521  1.1  mrg 
    522  1.1  mrg   mpfr_init (x);
    523  1.1  mrg   mpfr_init (y);
    524  1.1  mrg   mpfr_init (z);
    525  1.1  mrg   mpfr_init (u);
    526  1.1  mrg 
    527  1.1  mrg   mpfr_set_prec (x, 28);
    528  1.1  mrg   mpfr_set_prec (y, 28);
    529  1.1  mrg   mpfr_set_prec (z, 1023);
    530  1.1  mrg   mpfr_set_str_binary (x, "0.1000001001101101111100010011E0");
    531  1.1  mrg   mpfr_set_str (z, "48284762641021308813686974720835219181653367326353400027913400579340343320519877153813133510034402932651132854764198688352364361009429039801248971901380781746767119334993621199563870113045276395603170432175354501451429471578325545278975153148347684600400321033502982713296919861760382863826626093689036010394", 10, MPFR_RNDN);
    532  1.1  mrg   mpfr_div (x, x, z, MPFR_RNDN);
    533  1.1  mrg   mpfr_set_str_binary (y, "0.1111001011001101001001111100E-1023");
    534  1.1  mrg   if (mpfr_cmp (x, y))
    535  1.1  mrg     {
    536  1.1  mrg       printf ("Error in mpfr_div for prec=28, RNDN\n");
    537  1.1  mrg       printf ("Expected "); mpfr_dump (y);
    538  1.1  mrg       printf ("Got      "); mpfr_dump (x);
    539  1.1  mrg       exit (1);
    540  1.1  mrg     }
    541  1.1  mrg 
    542  1.1  mrg   mpfr_set_prec (x, 53);
    543  1.1  mrg   mpfr_set_str_binary (x, "0.11101100110010100011011000000100001111011111110010101E0");
    544  1.1  mrg   mpfr_set_prec (u, 127);
    545  1.1  mrg   mpfr_set_str_binary (u, "0.1000001100110110110101110110101101111000110000001111111110000000011111001010110100110010111111111101000001011011101011101101000E-2");
    546  1.1  mrg   mpfr_set_prec (y, 95);
    547  1.1  mrg   inexact = test_div (y, x, u, MPFR_RNDN);
    548  1.1  mrg   if (inexact != (cmp = get_inexact (y, x, u)))
    549  1.1  mrg     {
    550  1.1  mrg       printf ("Wrong inexact flag (0): expected %d, got %d\n", cmp, inexact);
    551  1.1  mrg       printf ("x="); mpfr_out_str (stdout, 10, 99, x, MPFR_RNDN); printf ("\n");
    552  1.1  mrg       printf ("u="); mpfr_out_str (stdout, 10, 99, u, MPFR_RNDN); printf ("\n");
    553  1.1  mrg       printf ("y="); mpfr_out_str (stdout, 10, 99, y, MPFR_RNDN); printf ("\n");
    554  1.1  mrg       exit (1);
    555  1.1  mrg     }
    556  1.1  mrg 
    557  1.1  mrg   mpfr_set_prec (x, 33);
    558  1.1  mrg   mpfr_set_str_binary (x, "0.101111100011011101010011101100001E0");
    559  1.1  mrg   mpfr_set_prec (u, 2);
    560  1.1  mrg   mpfr_set_str_binary (u, "0.1E0");
    561  1.1  mrg   mpfr_set_prec (y, 28);
    562  1.1  mrg   if ((inexact = test_div (y, x, u, MPFR_RNDN) >= 0))
    563  1.1  mrg     {
    564  1.1  mrg       printf ("Wrong inexact flag (1): expected -1, got %d\n",
    565  1.1  mrg               inexact);
    566  1.1  mrg       exit (1);
    567  1.1  mrg     }
    568  1.1  mrg 
    569  1.1  mrg   mpfr_set_prec (x, 129);
    570  1.1  mrg   mpfr_set_str_binary (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2");
    571  1.1  mrg   mpfr_set_prec (u, 15);
    572  1.1  mrg   mpfr_set_str_binary (u, "0.101101000001100E-1");
    573  1.1  mrg   mpfr_set_prec (y, 92);
    574  1.1  mrg   if ((inexact = test_div (y, x, u, MPFR_RNDN)) <= 0)
    575  1.1  mrg     {
    576  1.1  mrg       printf ("Wrong inexact flag for rnd=MPFR_RNDN(1): expected 1, got %d\n",
    577  1.1  mrg               inexact);
    578  1.1  mrg       mpfr_dump (x);
    579  1.1  mrg       mpfr_dump (u);
    580  1.1  mrg       mpfr_dump (y);
    581  1.1  mrg       exit (1);
    582  1.1  mrg     }
    583  1.1  mrg 
    584  1.1  mrg   for (px=2; px<MAX_PREC; px++)
    585  1.1  mrg     {
    586  1.1  mrg       mpfr_set_prec (x, px);
    587  1.1  mrg       mpfr_urandomb (x, RANDS);
    588  1.1  mrg       for (pu=2; pu<=MAX_PREC; pu++)
    589  1.1  mrg         {
    590  1.1  mrg           mpfr_set_prec (u, pu);
    591  1.1  mrg           do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0);
    592  1.1  mrg             {
    593  1.1  mrg               py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - MPFR_PREC_MIN));
    594  1.1  mrg               mpfr_set_prec (y, py);
    595  1.1  mrg               mpfr_set_prec (z, py + pu);
    596  1.1  mrg                 {
    597  1.1  mrg                   rnd = RND_RAND ();
    598  1.1  mrg                   inexact = test_div (y, x, u, rnd);
    599  1.1  mrg                   if (mpfr_mul (z, y, u, rnd))
    600  1.1  mrg                     {
    601  1.1  mrg                       printf ("z <- y * u should be exact\n");
    602  1.1  mrg                       exit (1);
    603  1.1  mrg                     }
    604  1.1  mrg                   cmp = mpfr_cmp (z, x);
    605  1.1  mrg                   if (((inexact == 0) && (cmp != 0)) ||
    606  1.1  mrg                       ((inexact > 0) && (cmp <= 0)) ||
    607  1.1  mrg                       ((inexact < 0) && (cmp >= 0)))
    608  1.1  mrg                     {
    609  1.1  mrg                       printf ("Wrong inexact flag for rnd=%s\n",
    610  1.1  mrg                               mpfr_print_rnd_mode(rnd));
    611  1.1  mrg                       printf ("expected %d, got %d\n", cmp, inexact);
    612  1.1  mrg                       printf ("x="); mpfr_print_binary (x); puts ("");
    613  1.1  mrg                       printf ("u="); mpfr_print_binary (u); puts ("");
    614  1.1  mrg                       printf ("y="); mpfr_print_binary (y); puts ("");
    615  1.1  mrg                       printf ("y*u="); mpfr_print_binary (z); puts ("");
    616  1.1  mrg                       exit (1);
    617  1.1  mrg                     }
    618  1.1  mrg                 }
    619  1.1  mrg             }
    620  1.1  mrg         }
    621  1.1  mrg     }
    622  1.1  mrg 
    623  1.1  mrg   mpfr_clear (x);
    624  1.1  mrg   mpfr_clear (y);
    625  1.1  mrg   mpfr_clear (z);
    626  1.1  mrg   mpfr_clear (u);
    627  1.1  mrg }
    628  1.1  mrg 
    629  1.1  mrg static void
    630  1.1  mrg check_nan (void)
    631  1.1  mrg {
    632  1.1  mrg   mpfr_t  a, d, q;
    633  1.1  mrg   mpfr_exp_t emax, emin;
    634  1.1  mrg   int i;
    635  1.1  mrg 
    636  1.1  mrg   mpfr_init2 (a, 100L);
    637  1.1  mrg   mpfr_init2 (d, 100L);
    638  1.1  mrg   mpfr_init2 (q, 100L);
    639  1.1  mrg 
    640  1.1  mrg   /* 1/nan == nan */
    641  1.1  mrg   mpfr_set_ui (a, 1L, MPFR_RNDN);
    642  1.1  mrg   MPFR_SET_NAN (d);
    643  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    644  1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (q));
    645  1.1  mrg 
    646  1.1  mrg   /* nan/1 == nan */
    647  1.1  mrg   MPFR_SET_NAN (a);
    648  1.1  mrg   mpfr_set_ui (d, 1L, MPFR_RNDN);
    649  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    650  1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (q));
    651  1.1  mrg 
    652  1.1  mrg   /* +inf/1 == +inf */
    653  1.1  mrg   MPFR_SET_INF (a);
    654  1.1  mrg   MPFR_SET_POS (a);
    655  1.1  mrg   mpfr_set_ui (d, 1L, MPFR_RNDN);
    656  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    657  1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q));
    658  1.1  mrg   MPFR_ASSERTN (mpfr_sgn (q) > 0);
    659  1.1  mrg 
    660  1.1  mrg   /* 1/+inf == 0 */
    661  1.1  mrg   mpfr_set_ui (a, 1L, MPFR_RNDN);
    662  1.1  mrg   MPFR_SET_INF (d);
    663  1.1  mrg   MPFR_SET_POS (d);
    664  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    665  1.1  mrg   MPFR_ASSERTN (mpfr_number_p (q));
    666  1.1  mrg   MPFR_ASSERTN (mpfr_sgn (q) == 0);
    667  1.1  mrg 
    668  1.1  mrg   /* 0/0 == nan */
    669  1.1  mrg   mpfr_set_ui (a, 0L, MPFR_RNDN);
    670  1.1  mrg   mpfr_set_ui (d, 0L, MPFR_RNDN);
    671  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    672  1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (q));
    673  1.1  mrg 
    674  1.1  mrg   /* +inf/+inf == nan */
    675  1.1  mrg   MPFR_SET_INF (a);
    676  1.1  mrg   MPFR_SET_POS (a);
    677  1.1  mrg   MPFR_SET_INF (d);
    678  1.1  mrg   MPFR_SET_POS (d);
    679  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    680  1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (q));
    681  1.1  mrg 
    682  1.1  mrg   /* 1/+0 = +Inf */
    683  1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    684  1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    685  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    686  1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    687  1.1  mrg 
    688  1.1  mrg   /* 1/-0 = -Inf */
    689  1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    690  1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    691  1.1  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    692  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    693  1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    694  1.1  mrg 
    695  1.1  mrg   /* -1/+0 = -Inf */
    696  1.1  mrg   mpfr_set_si (a, -1, MPFR_RNDZ);
    697  1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    698  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    699  1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0);
    700  1.1  mrg 
    701  1.1  mrg   /* -1/-0 = +Inf */
    702  1.1  mrg   mpfr_set_si (a, -1, MPFR_RNDZ);
    703  1.1  mrg   mpfr_set_ui (d, 0, MPFR_RNDZ);
    704  1.1  mrg   mpfr_neg (d, d, MPFR_RNDZ);
    705  1.1  mrg   MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */
    706  1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    707  1.1  mrg 
    708  1.1  mrg   /* check overflow */
    709  1.1  mrg   emax = mpfr_get_emax ();
    710  1.1  mrg   set_emax (1);
    711  1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    712  1.1  mrg   mpfr_set_ui (d, 1, MPFR_RNDZ);
    713  1.1  mrg   mpfr_div_2exp (d, d, 1, MPFR_RNDZ);
    714  1.1  mrg   test_div (q, a, d, MPFR_RNDU); /* 1 / 0.5 = 2 -> overflow */
    715  1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0);
    716  1.1  mrg   set_emax (emax);
    717  1.1  mrg 
    718  1.1  mrg   /* check underflow */
    719  1.1  mrg   emin = mpfr_get_emin ();
    720  1.1  mrg   set_emin (-1);
    721  1.1  mrg   mpfr_set_ui (a, 1, MPFR_RNDZ);
    722  1.1  mrg   mpfr_div_2exp (a, a, 2, MPFR_RNDZ);
    723  1.1  mrg   mpfr_set_prec (d, mpfr_get_prec (q) + 8);
    724  1.1  mrg   for (i = -1; i <= 1; i++)
    725  1.1  mrg     {
    726  1.1  mrg       int sign;
    727  1.1  mrg 
    728  1.1  mrg       /* Test 2^(-2) / (+/- (2 + eps)), with eps < 0, eps = 0, eps > 0.
    729  1.1  mrg          -> underflow.
    730  1.1  mrg          With div.c r5513, this test fails for eps > 0 in MPFR_RNDN. */
    731  1.1  mrg       mpfr_set_ui (d, 2, MPFR_RNDZ);
    732  1.1  mrg       if (i < 0)
    733  1.1  mrg         mpfr_nextbelow (d);
    734  1.1  mrg       if (i > 0)
    735  1.1  mrg         mpfr_nextabove (d);
    736  1.1  mrg       for (sign = 0; sign <= 1; sign++)
    737  1.1  mrg         {
    738  1.1  mrg           mpfr_clear_flags ();
    739  1.1  mrg           test_div (q, a, d, MPFR_RNDZ); /* result = 0 */
    740  1.1  mrg           MPFR_ASSERTN (mpfr_underflow_p ());
    741  1.1  mrg           MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
    742  1.1  mrg           MPFR_ASSERTN (MPFR_IS_ZERO (q));
    743  1.1  mrg           mpfr_clear_flags ();
    744  1.1  mrg           test_div (q, a, d, MPFR_RNDN); /* result = 0 iff eps >= 0 */
    745  1.1  mrg           MPFR_ASSERTN (mpfr_underflow_p ());
    746  1.1  mrg           MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q));
    747  1.1  mrg           if (i < 0)
    748  1.1  mrg             mpfr_nexttozero (q);
    749  1.1  mrg           MPFR_ASSERTN (MPFR_IS_ZERO (q));
    750  1.1  mrg           mpfr_neg (d, d, MPFR_RNDN);
    751  1.1  mrg         }
    752  1.1  mrg     }
    753  1.1  mrg   set_emin (emin);
    754  1.1  mrg 
    755  1.1  mrg   mpfr_clear (a);
    756  1.1  mrg   mpfr_clear (d);
    757  1.1  mrg   mpfr_clear (q);
    758  1.1  mrg }
    759  1.1  mrg 
    760  1.1  mrg static void
    761  1.1  mrg consistency (void)
    762  1.1  mrg {
    763  1.1  mrg   mpfr_t x, y, z1, z2;
    764  1.1  mrg   int i;
    765  1.1  mrg 
    766  1.1  mrg   mpfr_inits (x, y, z1, z2, (mpfr_ptr) 0);
    767  1.1  mrg 
    768  1.1  mrg   for (i = 0; i < 10000; i++)
    769  1.1  mrg     {
    770  1.1  mrg       mpfr_rnd_t rnd;
    771  1.1  mrg       mpfr_prec_t px, py, pz, p;
    772  1.1  mrg       int inex1, inex2;
    773  1.1  mrg 
    774  1.1  mrg       rnd = RND_RAND ();
    775  1.1  mrg       px = (randlimb () % 256) + 2;
    776  1.1  mrg       py = (randlimb () % 128) + 2;
    777  1.1  mrg       pz = (randlimb () % 256) + 2;
    778  1.1  mrg       mpfr_set_prec (x, px);
    779  1.1  mrg       mpfr_set_prec (y, py);
    780  1.1  mrg       mpfr_set_prec (z1, pz);
    781  1.1  mrg       mpfr_set_prec (z2, pz);
    782  1.1  mrg       mpfr_urandomb (x, RANDS);
    783  1.1  mrg       do
    784  1.1  mrg         mpfr_urandomb (y, RANDS);
    785  1.1  mrg       while (mpfr_zero_p (y));
    786  1.1  mrg       inex1 = mpfr_div (z1, x, y, rnd);
    787  1.1  mrg       MPFR_ASSERTN (!MPFR_IS_NAN (z1));
    788  1.1  mrg       p = MAX (MAX (px, py), pz);
    789  1.1  mrg       if (mpfr_prec_round (x, p, MPFR_RNDN) != 0 ||
    790  1.1  mrg           mpfr_prec_round (y, p, MPFR_RNDN) != 0)
    791  1.1  mrg         {
    792  1.1  mrg           printf ("mpfr_prec_round error for i = %d\n", i);
    793  1.1  mrg           exit (1);
    794  1.1  mrg         }
    795  1.1  mrg       inex2 = mpfr_div (z2, x, y, rnd);
    796  1.1  mrg       MPFR_ASSERTN (!MPFR_IS_NAN (z2));
    797  1.1  mrg       if (inex1 != inex2 || mpfr_cmp (z1, z2) != 0)
    798  1.1  mrg         {
    799  1.1  mrg           printf ("Consistency error for i = %d\n", i);
    800  1.1  mrg           exit (1);
    801  1.1  mrg         }
    802  1.1  mrg     }
    803  1.1  mrg 
    804  1.1  mrg   mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
    805  1.1  mrg }
    806  1.1  mrg 
    807  1.1  mrg /* Reported by Carl Witty on 2007-06-03 */
    808  1.1  mrg static void
    809  1.1  mrg test_20070603 (void)
    810  1.1  mrg {
    811  1.1  mrg   mpfr_t n, d, q, c;
    812  1.1  mrg 
    813  1.1  mrg   mpfr_init2 (n, 128);
    814  1.1  mrg   mpfr_init2 (d, 128);
    815  1.1  mrg   mpfr_init2 (q, 31);
    816  1.1  mrg   mpfr_init2 (c, 31);
    817  1.1  mrg 
    818  1.1  mrg   mpfr_set_str (n, "10384593717069655257060992206846485", 10, MPFR_RNDN);
    819  1.1  mrg   mpfr_set_str (d, "10384593717069655257060992206847132", 10, MPFR_RNDN);
    820  1.1  mrg   mpfr_div (q, n, d, MPFR_RNDU);
    821  1.1  mrg 
    822  1.1  mrg   mpfr_set_ui (c, 1, MPFR_RNDN);
    823  1.1  mrg   if (mpfr_cmp (q, c) != 0)
    824  1.1  mrg     {
    825  1.1  mrg       printf ("Error in test_20070603\nGot        ");
    826  1.1  mrg       mpfr_dump (q);
    827  1.1  mrg       printf ("instead of ");
    828  1.1  mrg       mpfr_dump (c);
    829  1.1  mrg       exit (1);
    830  1.1  mrg     }
    831  1.1  mrg 
    832  1.1  mrg   /* same for 64-bit machines */
    833  1.1  mrg   mpfr_set_prec (n, 256);
    834  1.1  mrg   mpfr_set_prec (d, 256);
    835  1.1  mrg   mpfr_set_prec (q, 63);
    836  1.1  mrg   mpfr_set_str (n, "822752278660603021077484591278675252491367930877209729029898240", 10, MPFR_RNDN);
    837  1.1  mrg   mpfr_set_str (d, "822752278660603021077484591278675252491367930877212507873738752", 10, MPFR_RNDN);
    838  1.1  mrg   mpfr_div (q, n, d, MPFR_RNDU);
    839  1.1  mrg   if (mpfr_cmp (q, c) != 0)
    840  1.1  mrg     {
    841  1.1  mrg       printf ("Error in test_20070603\nGot        ");
    842  1.1  mrg       mpfr_dump (q);
    843  1.1  mrg       printf ("instead of ");
    844  1.1  mrg       mpfr_dump (c);
    845  1.1  mrg       exit (1);
    846  1.1  mrg     }
    847  1.1  mrg 
    848  1.1  mrg   mpfr_clear (n);
    849  1.1  mrg   mpfr_clear (d);
    850  1.1  mrg   mpfr_clear (q);
    851  1.1  mrg   mpfr_clear (c);
    852  1.1  mrg }
    853  1.1  mrg 
    854  1.1  mrg /* Bug found while adding tests for mpfr_cot */
    855  1.1  mrg static void
    856  1.1  mrg test_20070628 (void)
    857  1.1  mrg {
    858  1.1  mrg   mpfr_exp_t old_emax;
    859  1.1  mrg   mpfr_t x, y;
    860  1.1  mrg   int inex, err = 0;
    861  1.1  mrg 
    862  1.1  mrg   old_emax = mpfr_get_emax ();
    863  1.1  mrg 
    864  1.1  mrg   if (mpfr_set_emax (256))
    865  1.1  mrg     {
    866  1.1  mrg       printf ("Can't change exponent range\n");
    867  1.1  mrg       exit (1);
    868  1.1  mrg     }
    869  1.1  mrg 
    870  1.1  mrg   mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
    871  1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
    872  1.1  mrg   mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN);
    873  1.1  mrg   mpfr_clear_flags ();
    874  1.1  mrg   inex = mpfr_div (x, x, y, MPFR_RNDD);
    875  1.1  mrg   if (MPFR_SIGN (x) >= 0 || ! mpfr_inf_p (x))
    876  1.1  mrg     {
    877  1.1  mrg       printf ("Error in test_20070628: expected -Inf, got\n");
    878  1.1  mrg       mpfr_dump (x);
    879  1.1  mrg       err++;
    880  1.1  mrg     }
    881  1.1  mrg   if (inex >= 0)
    882  1.1  mrg     {
    883  1.1  mrg       printf ("Error in test_20070628: expected inex < 0, got %d\n", inex);
    884  1.1  mrg       err++;
    885  1.1  mrg     }
    886  1.1  mrg   if (! mpfr_overflow_p ())
    887  1.1  mrg     {
    888  1.1  mrg       printf ("Error in test_20070628: overflow flag is not set\n");
    889  1.1  mrg       err++;
    890  1.1  mrg     }
    891  1.1  mrg   mpfr_clears (x, y, (mpfr_ptr) 0);
    892  1.1  mrg   mpfr_set_emax (old_emax);
    893  1.1  mrg }
    894  1.1  mrg 
    895  1.1  mrg #define TEST_FUNCTION test_div
    896  1.1  mrg #define TWO_ARGS
    897  1.1  mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS)
    898  1.1  mrg #include "tgeneric.c"
    899  1.1  mrg 
    900  1.1  mrg int
    901  1.1  mrg main (int argc, char *argv[])
    902  1.1  mrg {
    903  1.1  mrg   tests_start_mpfr ();
    904  1.1  mrg 
    905  1.1  mrg   check_inexact ();
    906  1.1  mrg   check_hard ();
    907  1.1  mrg   check_nan ();
    908  1.1  mrg   check_lowr ();
    909  1.1  mrg   check_float (); /* checks single precision */
    910  1.1  mrg   check_double ();
    911  1.1  mrg   check_convergence ();
    912  1.1  mrg   check_64 ();
    913  1.1  mrg 
    914  1.1  mrg   check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62,
    915  1.1  mrg    "0.10000000000000000000000000000000000000000000000000000000000000E-49");
    916  1.1  mrg   check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65,
    917  1.1  mrg    "0.11010011111001101011111001100111110100000001101001111100111000000E-622");
    918  1.1  mrg   check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU,
    919  1.1  mrg          65,
    920  1.1  mrg   "0.11010011111001101011111001100111110100000001101001111100111000000E-1119");
    921  1.1  mrg 
    922  1.1  mrg   consistency ();
    923  1.1  mrg   test_20070603 ();
    924  1.1  mrg   test_20070628 ();
    925  1.1  mrg   test_generic (2, 800, 50);
    926  1.1  mrg 
    927  1.1  mrg   tests_end_mpfr ();
    928  1.1  mrg   return 0;
    929  1.1  mrg }
    930