Home | History | Annotate | Line # | Download | only in tests
tsqrt.c revision 1.1.1.4
      1      1.1  mrg /* Test file for mpfr_sqrt.
      2      1.1  mrg 
      3  1.1.1.4  mrg Copyright 1999, 2001-2018 Free Software Foundation, Inc.
      4  1.1.1.3  mrg Contributed by the AriC and Caramba projects, INRIA.
      5      1.1  mrg 
      6      1.1  mrg This file is part of the GNU MPFR Library.
      7      1.1  mrg 
      8      1.1  mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
      9      1.1  mrg it under the terms of the GNU Lesser General Public License as published by
     10      1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     11      1.1  mrg option) any later version.
     12      1.1  mrg 
     13      1.1  mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
     14      1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15      1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     16      1.1  mrg License for more details.
     17      1.1  mrg 
     18      1.1  mrg You should have received a copy of the GNU Lesser General Public License
     19      1.1  mrg along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
     20      1.1  mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
     21      1.1  mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
     22      1.1  mrg 
     23      1.1  mrg #include "mpfr-test.h"
     24      1.1  mrg 
     25      1.1  mrg #ifdef CHECK_EXTERNAL
     26      1.1  mrg static int
     27      1.1  mrg test_sqrt (mpfr_ptr a, mpfr_srcptr b, mpfr_rnd_t rnd_mode)
     28      1.1  mrg {
     29      1.1  mrg   int res;
     30      1.1  mrg   int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b);
     31      1.1  mrg   if (ok)
     32      1.1  mrg     {
     33      1.1  mrg       mpfr_print_raw (b);
     34      1.1  mrg     }
     35      1.1  mrg   res = mpfr_sqrt (a, b, rnd_mode);
     36      1.1  mrg   if (ok)
     37      1.1  mrg     {
     38      1.1  mrg       printf (" ");
     39      1.1  mrg       mpfr_print_raw (a);
     40      1.1  mrg       printf ("\n");
     41      1.1  mrg     }
     42      1.1  mrg   return res;
     43      1.1  mrg }
     44      1.1  mrg #else
     45      1.1  mrg #define test_sqrt mpfr_sqrt
     46      1.1  mrg #endif
     47      1.1  mrg 
     48      1.1  mrg static void
     49      1.1  mrg check3 (const char *as, mpfr_rnd_t rnd_mode, const char *qs)
     50      1.1  mrg {
     51      1.1  mrg   mpfr_t q;
     52      1.1  mrg 
     53      1.1  mrg   mpfr_init2 (q, 53);
     54      1.1  mrg   mpfr_set_str1 (q, as);
     55      1.1  mrg   test_sqrt (q, q, rnd_mode);
     56      1.1  mrg   if (mpfr_cmp_str1 (q, qs) )
     57      1.1  mrg     {
     58      1.1  mrg       printf ("mpfr_sqrt failed for a=%s, rnd_mode=%s\n",
     59      1.1  mrg               as, mpfr_print_rnd_mode (rnd_mode));
     60      1.1  mrg       printf ("expected sqrt is %s, got ",qs);
     61      1.1  mrg       mpfr_out_str (stdout, 10, 0, q, MPFR_RNDN);
     62      1.1  mrg       putchar ('\n');
     63      1.1  mrg       exit (1);
     64      1.1  mrg     }
     65      1.1  mrg   mpfr_clear (q);
     66      1.1  mrg }
     67      1.1  mrg 
     68      1.1  mrg static void
     69  1.1.1.4  mrg check4 (const char *as, mpfr_rnd_t rnd_mode, const char *qs)
     70      1.1  mrg {
     71      1.1  mrg   mpfr_t q;
     72      1.1  mrg 
     73      1.1  mrg   mpfr_init2 (q, 53);
     74      1.1  mrg   mpfr_set_str1 (q, as);
     75      1.1  mrg   test_sqrt (q, q, rnd_mode);
     76  1.1.1.4  mrg   if (mpfr_cmp_str (q, qs, 16, MPFR_RNDN))
     77      1.1  mrg     {
     78      1.1  mrg       printf ("mpfr_sqrt failed for a=%s, rnd_mode=%s\n",
     79  1.1.1.4  mrg               as, mpfr_print_rnd_mode (rnd_mode));
     80  1.1.1.4  mrg       printf ("expected %s\ngot      ", qs);
     81      1.1  mrg       mpfr_out_str (stdout, 16, 0, q, MPFR_RNDN);
     82  1.1.1.4  mrg       printf ("\n");
     83      1.1  mrg       mpfr_clear (q);
     84      1.1  mrg       exit (1);
     85      1.1  mrg     }
     86      1.1  mrg   mpfr_clear (q);
     87      1.1  mrg }
     88      1.1  mrg 
     89      1.1  mrg static void
     90      1.1  mrg check24 (const char *as, mpfr_rnd_t rnd_mode, const char *qs)
     91      1.1  mrg {
     92      1.1  mrg   mpfr_t q;
     93      1.1  mrg 
     94      1.1  mrg   mpfr_init2 (q, 24);
     95      1.1  mrg   mpfr_set_str1 (q, as);
     96      1.1  mrg   test_sqrt (q, q, rnd_mode);
     97      1.1  mrg   if (mpfr_cmp_str1 (q, qs))
     98      1.1  mrg     {
     99      1.1  mrg       printf ("mpfr_sqrt failed for a=%s, prec=24, rnd_mode=%s\n",
    100      1.1  mrg               as, mpfr_print_rnd_mode(rnd_mode));
    101      1.1  mrg       printf ("expected sqrt is %s, got ",qs);
    102      1.1  mrg       mpfr_out_str (stdout, 10, 0, q, MPFR_RNDN);
    103      1.1  mrg       printf ("\n");
    104      1.1  mrg       exit (1);
    105      1.1  mrg     }
    106      1.1  mrg   mpfr_clear (q);
    107      1.1  mrg }
    108      1.1  mrg 
    109      1.1  mrg static void
    110      1.1  mrg check_diverse (const char *as, mpfr_prec_t p, const char *qs)
    111      1.1  mrg {
    112      1.1  mrg   mpfr_t q;
    113      1.1  mrg 
    114      1.1  mrg   mpfr_init2 (q, p);
    115      1.1  mrg   mpfr_set_str1 (q, as);
    116      1.1  mrg   test_sqrt (q, q, MPFR_RNDN);
    117      1.1  mrg   if (mpfr_cmp_str1 (q, qs))
    118      1.1  mrg     {
    119      1.1  mrg       printf ("mpfr_sqrt failed for a=%s, prec=%lu, rnd_mode=%s\n",
    120  1.1.1.2  mrg               as, (unsigned long) p, mpfr_print_rnd_mode (MPFR_RNDN));
    121      1.1  mrg       printf ("expected sqrt is %s, got ", qs);
    122      1.1  mrg       mpfr_out_str (stdout, 10, 0, q, MPFR_RNDN);
    123      1.1  mrg       printf ("\n");
    124      1.1  mrg       exit (1);
    125      1.1  mrg     }
    126      1.1  mrg   mpfr_clear (q);
    127      1.1  mrg }
    128      1.1  mrg 
    129      1.1  mrg /* the following examples come from the paper "Number-theoretic Test
    130      1.1  mrg    Generation for Directed Rounding" from Michael Parks, Table 3 */
    131      1.1  mrg static void
    132      1.1  mrg check_float (void)
    133      1.1  mrg {
    134      1.1  mrg   check24("70368760954880.0", MPFR_RNDN, "8.388609e6");
    135      1.1  mrg   check24("281474943156224.0", MPFR_RNDN, "1.6777215e7");
    136      1.1  mrg   check24("70368777732096.0", MPFR_RNDN, "8.388610e6");
    137      1.1  mrg   check24("281474909601792.0", MPFR_RNDN, "1.6777214e7");
    138      1.1  mrg   check24("100216216748032.0", MPFR_RNDN, "1.0010805e7");
    139      1.1  mrg   check24("120137273311232.0", MPFR_RNDN, "1.0960715e7");
    140      1.1  mrg   check24("229674600890368.0", MPFR_RNDN, "1.5155019e7");
    141      1.1  mrg   check24("70368794509312.0", MPFR_RNDN, "8.388611e6");
    142      1.1  mrg   check24("281474876047360.0", MPFR_RNDN, "1.6777213e7");
    143      1.1  mrg   check24("91214552498176.0", MPFR_RNDN, "9.550631e6");
    144      1.1  mrg 
    145      1.1  mrg   check24("70368760954880.0", MPFR_RNDZ, "8.388608e6");
    146      1.1  mrg   check24("281474943156224.0", MPFR_RNDZ, "1.6777214e7");
    147      1.1  mrg   check24("70368777732096.0", MPFR_RNDZ, "8.388609e6");
    148      1.1  mrg   check24("281474909601792.0", MPFR_RNDZ, "1.6777213e7");
    149      1.1  mrg   check24("100216216748032.0", MPFR_RNDZ, "1.0010805e7");
    150      1.1  mrg   check24("120137273311232.0", MPFR_RNDZ, "1.0960715e7");
    151      1.1  mrg   check24("229674600890368.0", MPFR_RNDZ, "1.5155019e7");
    152      1.1  mrg   check24("70368794509312.0", MPFR_RNDZ, "8.38861e6");
    153      1.1  mrg   check24("281474876047360.0", MPFR_RNDZ, "1.6777212e7");
    154      1.1  mrg   check24("91214552498176.0", MPFR_RNDZ, "9.550631e6");
    155      1.1  mrg 
    156      1.1  mrg   check24("70368760954880.0", MPFR_RNDU, "8.388609e6");
    157      1.1  mrg   check24("281474943156224.0",MPFR_RNDU, "1.6777215e7");
    158      1.1  mrg   check24("70368777732096.0", MPFR_RNDU, "8.388610e6");
    159      1.1  mrg   check24("281474909601792.0", MPFR_RNDU, "1.6777214e7");
    160      1.1  mrg   check24("100216216748032.0", MPFR_RNDU, "1.0010806e7");
    161      1.1  mrg   check24("120137273311232.0", MPFR_RNDU, "1.0960716e7");
    162      1.1  mrg   check24("229674600890368.0", MPFR_RNDU, "1.515502e7");
    163      1.1  mrg   check24("70368794509312.0", MPFR_RNDU, "8.388611e6");
    164      1.1  mrg   check24("281474876047360.0", MPFR_RNDU, "1.6777213e7");
    165      1.1  mrg   check24("91214552498176.0", MPFR_RNDU, "9.550632e6");
    166      1.1  mrg 
    167      1.1  mrg   check24("70368760954880.0", MPFR_RNDD, "8.388608e6");
    168      1.1  mrg   check24("281474943156224.0", MPFR_RNDD, "1.6777214e7");
    169      1.1  mrg   check24("70368777732096.0", MPFR_RNDD, "8.388609e6");
    170      1.1  mrg   check24("281474909601792.0", MPFR_RNDD, "1.6777213e7");
    171      1.1  mrg   check24("100216216748032.0", MPFR_RNDD, "1.0010805e7");
    172      1.1  mrg   check24("120137273311232.0", MPFR_RNDD, "1.0960715e7");
    173      1.1  mrg   check24("229674600890368.0", MPFR_RNDD, "1.5155019e7");
    174      1.1  mrg   check24("70368794509312.0", MPFR_RNDD, "8.38861e6");
    175      1.1  mrg   check24("281474876047360.0", MPFR_RNDD, "1.6777212e7");
    176      1.1  mrg   check24("91214552498176.0", MPFR_RNDD, "9.550631e6");
    177      1.1  mrg 
    178      1.1  mrg   /* check that rounding away is just rounding toward plus infinity */
    179      1.1  mrg   check24("91214552498176.0", MPFR_RNDA, "9.550632e6");
    180      1.1  mrg }
    181      1.1  mrg 
    182      1.1  mrg static void
    183      1.1  mrg special (void)
    184      1.1  mrg {
    185      1.1  mrg   mpfr_t x, y, z;
    186      1.1  mrg   int inexact;
    187      1.1  mrg   mpfr_prec_t p;
    188      1.1  mrg 
    189      1.1  mrg   mpfr_init (x);
    190      1.1  mrg   mpfr_init (y);
    191      1.1  mrg   mpfr_init (z);
    192      1.1  mrg 
    193      1.1  mrg   mpfr_set_prec (x, 64);
    194      1.1  mrg   mpfr_set_str_binary (x, "1010000010100011011001010101010010001100001101011101110001011001E-1");
    195      1.1  mrg   mpfr_set_prec (y, 32);
    196      1.1  mrg   test_sqrt (y, x, MPFR_RNDN);
    197      1.1  mrg   if (mpfr_cmp_ui (y, 2405743844UL))
    198      1.1  mrg     {
    199      1.1  mrg       printf ("Error for n^2+n+1/2 with n=2405743843\n");
    200      1.1  mrg       exit (1);
    201      1.1  mrg     }
    202      1.1  mrg 
    203      1.1  mrg   mpfr_set_prec (x, 65);
    204      1.1  mrg   mpfr_set_str_binary (x, "10100000101000110110010101010100100011000011010111011100010110001E-2");
    205      1.1  mrg   mpfr_set_prec (y, 32);
    206      1.1  mrg   test_sqrt (y, x, MPFR_RNDN);
    207      1.1  mrg   if (mpfr_cmp_ui (y, 2405743844UL))
    208      1.1  mrg     {
    209      1.1  mrg       printf ("Error for n^2+n+1/4 with n=2405743843\n");
    210      1.1  mrg       mpfr_dump (y);
    211      1.1  mrg       exit (1);
    212      1.1  mrg     }
    213      1.1  mrg 
    214      1.1  mrg   mpfr_set_prec (x, 66);
    215      1.1  mrg   mpfr_set_str_binary (x, "101000001010001101100101010101001000110000110101110111000101100011E-3");
    216      1.1  mrg   mpfr_set_prec (y, 32);
    217      1.1  mrg   test_sqrt (y, x, MPFR_RNDN);
    218      1.1  mrg   if (mpfr_cmp_ui (y, 2405743844UL))
    219      1.1  mrg     {
    220      1.1  mrg       printf ("Error for n^2+n+1/4+1/8 with n=2405743843\n");
    221      1.1  mrg       mpfr_dump (y);
    222      1.1  mrg       exit (1);
    223      1.1  mrg     }
    224      1.1  mrg 
    225      1.1  mrg   mpfr_set_prec (x, 66);
    226      1.1  mrg   mpfr_set_str_binary (x, "101000001010001101100101010101001000110000110101110111000101100001E-3");
    227      1.1  mrg   mpfr_set_prec (y, 32);
    228      1.1  mrg   test_sqrt (y, x, MPFR_RNDN);
    229      1.1  mrg   if (mpfr_cmp_ui (y, 2405743843UL))
    230      1.1  mrg     {
    231      1.1  mrg       printf ("Error for n^2+n+1/8 with n=2405743843\n");
    232      1.1  mrg       mpfr_dump (y);
    233      1.1  mrg       exit (1);
    234      1.1  mrg     }
    235      1.1  mrg 
    236      1.1  mrg   mpfr_set_prec (x, 27);
    237      1.1  mrg   mpfr_set_str_binary (x, "0.110100111010101000010001011");
    238      1.1  mrg   if ((inexact = test_sqrt (x, x, MPFR_RNDZ)) >= 0)
    239      1.1  mrg     {
    240      1.1  mrg       printf ("Wrong inexact flag: expected -1, got %d\n", inexact);
    241      1.1  mrg       exit (1);
    242      1.1  mrg     }
    243      1.1  mrg 
    244      1.1  mrg   mpfr_set_prec (x, 2);
    245      1.1  mrg   for (p=2; p<1000; p++)
    246      1.1  mrg     {
    247      1.1  mrg       mpfr_set_prec (z, p);
    248      1.1  mrg       mpfr_set_ui (z, 1, MPFR_RNDN);
    249      1.1  mrg       mpfr_nexttoinf (z);
    250      1.1  mrg       test_sqrt (x, z, MPFR_RNDU);
    251      1.1  mrg       if (mpfr_cmp_ui_2exp(x, 3, -1))
    252      1.1  mrg         {
    253      1.1  mrg           printf ("Error: sqrt(1+ulp(1), up) should give 1.5 (prec=%u)\n",
    254      1.1  mrg                   (unsigned int) p);
    255  1.1.1.4  mrg           printf ("got "); mpfr_dump (x);
    256      1.1  mrg           exit (1);
    257      1.1  mrg         }
    258      1.1  mrg     }
    259      1.1  mrg 
    260      1.1  mrg   /* check inexact flag */
    261      1.1  mrg   mpfr_set_prec (x, 5);
    262      1.1  mrg   mpfr_set_str_binary (x, "1.1001E-2");
    263      1.1  mrg   if ((inexact = test_sqrt (x, x, MPFR_RNDN)))
    264      1.1  mrg     {
    265      1.1  mrg       printf ("Wrong inexact flag: expected 0, got %d\n", inexact);
    266      1.1  mrg       exit (1);
    267      1.1  mrg     }
    268      1.1  mrg 
    269      1.1  mrg   mpfr_set_prec (x, 2);
    270      1.1  mrg   mpfr_set_prec (z, 2);
    271      1.1  mrg 
    272      1.1  mrg   /* checks the sign is correctly set */
    273      1.1  mrg   mpfr_set_si (x, 1,  MPFR_RNDN);
    274      1.1  mrg   mpfr_set_si (z, -1, MPFR_RNDN);
    275      1.1  mrg   test_sqrt (z, x, MPFR_RNDN);
    276      1.1  mrg   if (mpfr_cmp_ui (z, 0) < 0)
    277      1.1  mrg     {
    278      1.1  mrg       printf ("Error: square root of 1 gives ");
    279  1.1.1.4  mrg       mpfr_dump (z);
    280      1.1  mrg       exit (1);
    281      1.1  mrg     }
    282      1.1  mrg 
    283      1.1  mrg   mpfr_set_prec (x, 192);
    284      1.1  mrg   mpfr_set_prec (z, 160);
    285      1.1  mrg   mpfr_set_str_binary (z, "0.1011010100000100100100100110011001011100100100000011000111011001011101101101110000110100001000100001100001011000E1");
    286      1.1  mrg   mpfr_set_prec (x, 160);
    287      1.1  mrg   test_sqrt(x, z, MPFR_RNDN);
    288      1.1  mrg   test_sqrt(z, x, MPFR_RNDN);
    289      1.1  mrg 
    290      1.1  mrg   mpfr_set_prec (x, 53);
    291      1.1  mrg   mpfr_set_str (x, "8093416094703476.0", 10, MPFR_RNDN);
    292      1.1  mrg   mpfr_div_2exp (x, x, 1075, MPFR_RNDN);
    293      1.1  mrg   test_sqrt (x, x, MPFR_RNDN);
    294      1.1  mrg   mpfr_set_str (z, "1e55596835b5ef@-141", 16, MPFR_RNDN);
    295      1.1  mrg   if (mpfr_cmp (x, z))
    296      1.1  mrg     {
    297      1.1  mrg       printf ("Error: square root of 8093416094703476*2^(-1075)\n");
    298      1.1  mrg       printf ("expected "); mpfr_dump (z);
    299      1.1  mrg       printf ("got      "); mpfr_dump (x);
    300      1.1  mrg       exit (1);
    301      1.1  mrg     }
    302      1.1  mrg 
    303      1.1  mrg   mpfr_set_prec (x, 33);
    304      1.1  mrg   mpfr_set_str_binary (x, "0.111011011011110001100111111001000e-10");
    305      1.1  mrg   mpfr_set_prec (z, 157);
    306      1.1  mrg   inexact = test_sqrt (z, x, MPFR_RNDN);
    307      1.1  mrg   mpfr_set_prec (x, 157);
    308      1.1  mrg   mpfr_set_str_binary (x, "0.11110110101100101111001011100011100011100001101010111011010000100111011000111110100001001011110011111100101110010110010110011001011011010110010000011001101E-5");
    309      1.1  mrg   if (mpfr_cmp (x, z))
    310      1.1  mrg     {
    311      1.1  mrg       printf ("Error: square root (1)\n");
    312      1.1  mrg       exit (1);
    313      1.1  mrg     }
    314      1.1  mrg   if (inexact <= 0)
    315      1.1  mrg     {
    316      1.1  mrg       printf ("Error: wrong inexact flag (1)\n");
    317      1.1  mrg       exit (1);
    318      1.1  mrg     }
    319      1.1  mrg 
    320      1.1  mrg   /* case prec(result) << prec(input) */
    321      1.1  mrg   mpfr_set_prec (z, 2);
    322  1.1.1.4  mrg   for (p = mpfr_get_prec (z); p < 1000; p++)
    323      1.1  mrg     {
    324      1.1  mrg       mpfr_set_prec (x, p);
    325      1.1  mrg       mpfr_set_ui (x, 1, MPFR_RNDN);
    326      1.1  mrg       mpfr_nextabove (x);
    327      1.1  mrg       /* 1.0 < x <= 1.5 thus 1 < sqrt(x) <= 1.23 */
    328      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDN);
    329      1.1  mrg       MPFR_ASSERTN(inexact < 0 && mpfr_cmp_ui (z, 1) == 0);
    330      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDZ);
    331      1.1  mrg       MPFR_ASSERTN(inexact < 0 && mpfr_cmp_ui (z, 1) == 0);
    332      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDU);
    333      1.1  mrg       MPFR_ASSERTN(inexact > 0 && mpfr_cmp_ui_2exp (z, 3, -1) == 0);
    334      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDD);
    335      1.1  mrg       MPFR_ASSERTN(inexact < 0 && mpfr_cmp_ui (z, 1) == 0);
    336      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDA);
    337      1.1  mrg       MPFR_ASSERTN(inexact > 0 && mpfr_cmp_ui_2exp (z, 3, -1) == 0);
    338      1.1  mrg     }
    339      1.1  mrg 
    340      1.1  mrg   /* corner case rw = 0 in rounding to nearest */
    341      1.1  mrg   mpfr_set_prec (z, GMP_NUMB_BITS - 1);
    342      1.1  mrg   mpfr_set_prec (y, GMP_NUMB_BITS - 1);
    343      1.1  mrg   mpfr_set_ui (y, 1, MPFR_RNDN);
    344      1.1  mrg   mpfr_mul_2exp (y, y, GMP_NUMB_BITS - 1, MPFR_RNDN);
    345      1.1  mrg   mpfr_nextabove (y);
    346      1.1  mrg   for (p = 2 * GMP_NUMB_BITS - 1; p <= 1000; p++)
    347      1.1  mrg     {
    348      1.1  mrg       mpfr_set_prec (x, p);
    349      1.1  mrg       mpfr_set_ui (x, 1, MPFR_RNDN);
    350      1.1  mrg       mpfr_set_exp (x, GMP_NUMB_BITS);
    351      1.1  mrg       mpfr_add_ui (x, x, 1, MPFR_RNDN);
    352      1.1  mrg       /* now x = 2^(GMP_NUMB_BITS - 1) + 1 (GMP_NUMB_BITS bits) */
    353  1.1.1.4  mrg       inexact = mpfr_mul (x, x, x, MPFR_RNDN);
    354  1.1.1.4  mrg       MPFR_ASSERTN (inexact == 0); /* exact */
    355      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDN);
    356      1.1  mrg       /* even rule: z should be 2^(GMP_NUMB_BITS - 1) */
    357      1.1  mrg       MPFR_ASSERTN (inexact < 0);
    358  1.1.1.4  mrg       inexact = mpfr_cmp_ui_2exp (z, 1, GMP_NUMB_BITS - 1);
    359  1.1.1.4  mrg       MPFR_ASSERTN (inexact == 0);
    360      1.1  mrg       mpfr_nextbelow (x);
    361      1.1  mrg       /* now x is just below [2^(GMP_NUMB_BITS - 1) + 1]^2 */
    362      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDN);
    363      1.1  mrg       MPFR_ASSERTN(inexact < 0 &&
    364      1.1  mrg                    mpfr_cmp_ui_2exp (z, 1, GMP_NUMB_BITS - 1) == 0);
    365      1.1  mrg       mpfr_nextabove (x);
    366      1.1  mrg       mpfr_nextabove (x);
    367      1.1  mrg       /* now x is just above [2^(GMP_NUMB_BITS - 1) + 1]^2 */
    368      1.1  mrg       inexact = test_sqrt (z, x, MPFR_RNDN);
    369      1.1  mrg       if (mpfr_cmp (z, y))
    370      1.1  mrg         {
    371      1.1  mrg           printf ("Error for sqrt(x) in rounding to nearest\n");
    372      1.1  mrg           printf ("x="); mpfr_dump (x);
    373      1.1  mrg           printf ("Expected "); mpfr_dump (y);
    374      1.1  mrg           printf ("Got      "); mpfr_dump (z);
    375      1.1  mrg           exit (1);
    376      1.1  mrg         }
    377      1.1  mrg       if (inexact <= 0)
    378      1.1  mrg         {
    379      1.1  mrg           printf ("Wrong inexact flag in corner case for p = %lu\n", (unsigned long) p);
    380      1.1  mrg           exit (1);
    381      1.1  mrg         }
    382      1.1  mrg     }
    383      1.1  mrg 
    384      1.1  mrg   mpfr_set_prec (x, 1000);
    385      1.1  mrg   mpfr_set_ui (x, 9, MPFR_RNDN);
    386      1.1  mrg   mpfr_set_prec (y, 10);
    387      1.1  mrg   inexact = test_sqrt (y, x, MPFR_RNDN);
    388      1.1  mrg   if (mpfr_cmp_ui (y, 3) || inexact != 0)
    389      1.1  mrg     {
    390      1.1  mrg       printf ("Error in sqrt(9:1000) for prec=10\n");
    391      1.1  mrg       exit (1);
    392      1.1  mrg     }
    393      1.1  mrg   mpfr_set_prec (y, GMP_NUMB_BITS);
    394      1.1  mrg   mpfr_nextabove (x);
    395      1.1  mrg   inexact = test_sqrt (y, x, MPFR_RNDN);
    396      1.1  mrg   if (mpfr_cmp_ui (y, 3) || inexact >= 0)
    397      1.1  mrg     {
    398      1.1  mrg       printf ("Error in sqrt(9:1000) for prec=%d\n", (int) GMP_NUMB_BITS);
    399      1.1  mrg       exit (1);
    400      1.1  mrg     }
    401      1.1  mrg   mpfr_set_prec (x, 2 * GMP_NUMB_BITS);
    402      1.1  mrg   mpfr_set_prec (y, GMP_NUMB_BITS);
    403      1.1  mrg   mpfr_set_ui (y, 1, MPFR_RNDN);
    404      1.1  mrg   mpfr_nextabove (y);
    405      1.1  mrg   mpfr_set (x, y, MPFR_RNDN);
    406      1.1  mrg   inexact = test_sqrt (y, x, MPFR_RNDN);
    407      1.1  mrg   if (mpfr_cmp_ui (y, 1) || inexact >= 0)
    408      1.1  mrg     {
    409      1.1  mrg       printf ("Error in sqrt(1) for prec=%d\n", (int) GMP_NUMB_BITS);
    410      1.1  mrg       mpfr_dump (y);
    411      1.1  mrg       exit (1);
    412      1.1  mrg     }
    413      1.1  mrg 
    414      1.1  mrg   mpfr_clear (x);
    415      1.1  mrg   mpfr_clear (y);
    416      1.1  mrg   mpfr_clear (z);
    417      1.1  mrg }
    418      1.1  mrg 
    419      1.1  mrg static void
    420      1.1  mrg check_inexact (mpfr_prec_t p)
    421      1.1  mrg {
    422      1.1  mrg   mpfr_t x, y, z;
    423      1.1  mrg   mpfr_rnd_t rnd;
    424      1.1  mrg   int inexact, sign;
    425      1.1  mrg 
    426      1.1  mrg   mpfr_init2 (x, p);
    427      1.1  mrg   mpfr_init2 (y, p);
    428      1.1  mrg   mpfr_init2 (z, 2*p);
    429      1.1  mrg   mpfr_urandomb (x, RANDS);
    430  1.1.1.4  mrg   rnd = RND_RAND_NO_RNDF ();
    431      1.1  mrg   inexact = test_sqrt (y, x, rnd);
    432      1.1  mrg   if (mpfr_mul (z, y, y, rnd)) /* exact since prec(z) = 2*prec(y) */
    433      1.1  mrg     {
    434      1.1  mrg       printf ("Error: multiplication should be exact\n");
    435      1.1  mrg       exit (1);
    436      1.1  mrg     }
    437      1.1  mrg   mpfr_sub (z, z, x, rnd); /* exact also */
    438      1.1  mrg   sign = mpfr_cmp_ui (z, 0);
    439      1.1  mrg   if (((inexact == 0) && (sign)) ||
    440      1.1  mrg       ((inexact > 0) && (sign <= 0)) ||
    441      1.1  mrg       ((inexact < 0) && (sign >= 0)))
    442      1.1  mrg     {
    443  1.1.1.4  mrg       printf ("Error with rnd=%s: wrong ternary value, expected %d, got %d\n",
    444  1.1.1.4  mrg               mpfr_print_rnd_mode (rnd), sign, inexact);
    445      1.1  mrg       printf ("x=");
    446  1.1.1.4  mrg       mpfr_dump (x);
    447  1.1.1.4  mrg       printf ("y=");
    448  1.1.1.4  mrg       mpfr_dump (y);
    449      1.1  mrg       exit (1);
    450      1.1  mrg     }
    451      1.1  mrg   mpfr_clear (x);
    452      1.1  mrg   mpfr_clear (y);
    453      1.1  mrg   mpfr_clear (z);
    454      1.1  mrg }
    455      1.1  mrg 
    456      1.1  mrg static void
    457  1.1.1.2  mrg check_singular (void)
    458      1.1  mrg {
    459      1.1  mrg   mpfr_t  x, got;
    460      1.1  mrg 
    461      1.1  mrg   mpfr_init2 (x, 100L);
    462      1.1  mrg   mpfr_init2 (got, 100L);
    463      1.1  mrg 
    464      1.1  mrg   /* sqrt(NaN) == NaN */
    465      1.1  mrg   MPFR_SET_NAN (x);
    466      1.1  mrg   MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
    467      1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (got));
    468      1.1  mrg 
    469      1.1  mrg   /* sqrt(-1) == NaN */
    470      1.1  mrg   mpfr_set_si (x, -1L, MPFR_RNDZ);
    471      1.1  mrg   MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
    472      1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (got));
    473      1.1  mrg 
    474      1.1  mrg   /* sqrt(+inf) == +inf */
    475      1.1  mrg   MPFR_SET_INF (x);
    476      1.1  mrg   MPFR_SET_POS (x);
    477      1.1  mrg   MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
    478      1.1  mrg   MPFR_ASSERTN (mpfr_inf_p (got));
    479      1.1  mrg 
    480      1.1  mrg   /* sqrt(-inf) == NaN */
    481      1.1  mrg   MPFR_SET_INF (x);
    482      1.1  mrg   MPFR_SET_NEG (x);
    483      1.1  mrg   MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
    484      1.1  mrg   MPFR_ASSERTN (mpfr_nan_p (got));
    485      1.1  mrg 
    486  1.1.1.2  mrg   /* sqrt(+0) == +0 */
    487  1.1.1.2  mrg   mpfr_set_si (x, 0L, MPFR_RNDZ);
    488  1.1.1.2  mrg   MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
    489  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_number_p (got));
    490  1.1.1.2  mrg   MPFR_ASSERTN (mpfr_cmp_ui (got, 0L) == 0);
    491  1.1.1.2  mrg   MPFR_ASSERTN (MPFR_IS_POS (got));
    492  1.1.1.2  mrg 
    493  1.1.1.2  mrg   /* sqrt(-0) == -0 */
    494      1.1  mrg   mpfr_set_si (x, 0L, MPFR_RNDZ);
    495      1.1  mrg   MPFR_SET_NEG (x);
    496      1.1  mrg   MPFR_ASSERTN (test_sqrt (got, x, MPFR_RNDZ) == 0); /* exact */
    497      1.1  mrg   MPFR_ASSERTN (mpfr_number_p (got));
    498      1.1  mrg   MPFR_ASSERTN (mpfr_cmp_ui (got, 0L) == 0);
    499  1.1.1.2  mrg   MPFR_ASSERTN (MPFR_IS_NEG (got));
    500      1.1  mrg 
    501      1.1  mrg   mpfr_clear (x);
    502      1.1  mrg   mpfr_clear (got);
    503      1.1  mrg }
    504      1.1  mrg 
    505      1.1  mrg /* check that -1 <= x/sqrt(x^2+s*y^2) <= 1 for rounding to nearest or up
    506      1.1  mrg    with s = 0 and s = 1 */
    507      1.1  mrg static void
    508      1.1  mrg test_property1 (mpfr_prec_t p, mpfr_rnd_t r, int s)
    509      1.1  mrg {
    510      1.1  mrg   mpfr_t x, y, z, t;
    511      1.1  mrg 
    512      1.1  mrg   mpfr_init2 (x, p);
    513      1.1  mrg   mpfr_init2 (y, p);
    514      1.1  mrg   mpfr_init2 (z, p);
    515      1.1  mrg   mpfr_init2 (t, p);
    516      1.1  mrg 
    517      1.1  mrg   mpfr_urandomb (x, RANDS);
    518      1.1  mrg   mpfr_mul (z, x, x, r);
    519      1.1  mrg   if (s)
    520      1.1  mrg     {
    521      1.1  mrg       mpfr_urandomb (y, RANDS);
    522      1.1  mrg       mpfr_mul (t, y, y, r);
    523      1.1  mrg       mpfr_add (z, z, t, r);
    524      1.1  mrg     }
    525      1.1  mrg   mpfr_sqrt (z, z, r);
    526      1.1  mrg   mpfr_div (z, x, z, r);
    527      1.1  mrg   /* Note: if both x and y are 0, z is NAN, but the test below will
    528      1.1  mrg      be false. So, everything is fine. */
    529      1.1  mrg   if (mpfr_cmp_si (z, -1) < 0 || mpfr_cmp_ui (z, 1) > 0)
    530      1.1  mrg     {
    531      1.1  mrg       printf ("Error, -1 <= x/sqrt(x^2+y^2) <= 1 does not hold for r=%s\n",
    532      1.1  mrg               mpfr_print_rnd_mode (r));
    533      1.1  mrg       printf ("x="); mpfr_dump (x);
    534      1.1  mrg       printf ("y="); mpfr_dump (y);
    535      1.1  mrg       printf ("got "); mpfr_dump (z);
    536      1.1  mrg       exit (1);
    537      1.1  mrg     }
    538      1.1  mrg 
    539      1.1  mrg   mpfr_clear (x);
    540      1.1  mrg   mpfr_clear (y);
    541      1.1  mrg   mpfr_clear (z);
    542      1.1  mrg   mpfr_clear (t);
    543      1.1  mrg }
    544      1.1  mrg 
    545      1.1  mrg /* check sqrt(x^2) = x */
    546      1.1  mrg static void
    547      1.1  mrg test_property2 (mpfr_prec_t p, mpfr_rnd_t r)
    548      1.1  mrg {
    549      1.1  mrg   mpfr_t x, y;
    550      1.1  mrg 
    551      1.1  mrg   mpfr_init2 (x, p);
    552      1.1  mrg   mpfr_init2 (y, p);
    553      1.1  mrg 
    554      1.1  mrg   mpfr_urandomb (x, RANDS);
    555      1.1  mrg   mpfr_mul (y, x, x, r);
    556      1.1  mrg   mpfr_sqrt (y, y, r);
    557      1.1  mrg   if (mpfr_cmp (y, x))
    558      1.1  mrg     {
    559      1.1  mrg       printf ("Error, sqrt(x^2) = x does not hold for r=%s\n",
    560      1.1  mrg               mpfr_print_rnd_mode (r));
    561      1.1  mrg       printf ("x="); mpfr_dump (x);
    562      1.1  mrg       printf ("got "); mpfr_dump (y);
    563      1.1  mrg       exit (1);
    564      1.1  mrg     }
    565      1.1  mrg 
    566      1.1  mrg   mpfr_clear (x);
    567      1.1  mrg   mpfr_clear (y);
    568      1.1  mrg }
    569      1.1  mrg 
    570  1.1.1.3  mrg /* Bug reported by Fredrik Johansson, occurring when:
    571  1.1.1.3  mrg    - the precision of the result is a multiple of the number of bits
    572  1.1.1.3  mrg      per word (GMP_NUMB_BITS),
    573  1.1.1.3  mrg    - the rounding mode is to nearest (MPFR_RNDN),
    574  1.1.1.3  mrg    - internally, the result has to be rounded up to a power of 2.
    575  1.1.1.3  mrg */
    576  1.1.1.3  mrg static void
    577  1.1.1.3  mrg bug20160120 (void)
    578  1.1.1.3  mrg {
    579  1.1.1.3  mrg   mpfr_t x, y;
    580  1.1.1.3  mrg 
    581  1.1.1.3  mrg   mpfr_init2 (x, 4 * GMP_NUMB_BITS);
    582  1.1.1.3  mrg   mpfr_init2 (y, GMP_NUMB_BITS);
    583  1.1.1.3  mrg 
    584  1.1.1.3  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    585  1.1.1.3  mrg   mpfr_nextbelow (x);
    586  1.1.1.3  mrg   mpfr_sqrt (y, x, MPFR_RNDN);
    587  1.1.1.3  mrg   MPFR_ASSERTN(mpfr_check (y));
    588  1.1.1.3  mrg   MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0);
    589  1.1.1.3  mrg 
    590  1.1.1.3  mrg   mpfr_set_prec (y, 2 * GMP_NUMB_BITS);
    591  1.1.1.3  mrg   mpfr_sqrt (y, x, MPFR_RNDN);
    592  1.1.1.3  mrg   MPFR_ASSERTN(mpfr_check (y));
    593  1.1.1.3  mrg   MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0);
    594  1.1.1.3  mrg 
    595  1.1.1.3  mrg   mpfr_clear(x);
    596  1.1.1.3  mrg   mpfr_clear(y);
    597  1.1.1.3  mrg }
    598  1.1.1.3  mrg 
    599  1.1.1.4  mrg /* Bug in mpfr_sqrt2 when prec(u) = 2*GMP_NUMB_BITS and the exponent of u is
    600  1.1.1.4  mrg    odd: the last bit of u is lost. */
    601  1.1.1.4  mrg static void
    602  1.1.1.4  mrg bug20160908 (void)
    603  1.1.1.4  mrg {
    604  1.1.1.4  mrg   mpfr_t r, u;
    605  1.1.1.4  mrg   int n = GMP_NUMB_BITS, ret;
    606  1.1.1.4  mrg 
    607  1.1.1.4  mrg   mpfr_init2 (r, 2*n - 1);
    608  1.1.1.4  mrg   mpfr_init2 (u, 2 * n);
    609  1.1.1.4  mrg   mpfr_set_ui_2exp (u, 1, 2*n-2, MPFR_RNDN); /* u=2^(2n-2) with exp(u)=2n-1 */
    610  1.1.1.4  mrg   mpfr_nextabove (u);
    611  1.1.1.4  mrg   /* now u = 2^(2n-2) + 1/2 */
    612  1.1.1.4  mrg   ret = mpfr_sqrt (r, u, MPFR_RNDZ);
    613  1.1.1.4  mrg   MPFR_ASSERTN(ret == -1 && mpfr_cmp_ui_2exp (r, 1, n-1) == 0);
    614  1.1.1.4  mrg   mpfr_clear (r);
    615  1.1.1.4  mrg   mpfr_clear (u);
    616  1.1.1.4  mrg }
    617  1.1.1.4  mrg 
    618  1.1.1.4  mrg static void
    619  1.1.1.4  mrg testall_rndf (mpfr_prec_t pmax)
    620  1.1.1.4  mrg {
    621  1.1.1.4  mrg   mpfr_t a, b, d;
    622  1.1.1.4  mrg   mpfr_prec_t pa, pb;
    623  1.1.1.4  mrg 
    624  1.1.1.4  mrg   for (pa = MPFR_PREC_MIN; pa <= pmax; pa++)
    625  1.1.1.4  mrg     {
    626  1.1.1.4  mrg       mpfr_init2 (a, pa);
    627  1.1.1.4  mrg       mpfr_init2 (d, pa);
    628  1.1.1.4  mrg       for (pb = MPFR_PREC_MIN; pb <= pmax; pb++)
    629  1.1.1.4  mrg         {
    630  1.1.1.4  mrg           mpfr_init2 (b, pb);
    631  1.1.1.4  mrg           mpfr_set_ui (b, 1, MPFR_RNDN);
    632  1.1.1.4  mrg           while (mpfr_cmp_ui (b, 4) < 0)
    633  1.1.1.4  mrg             {
    634  1.1.1.4  mrg               mpfr_sqrt (a, b, MPFR_RNDF);
    635  1.1.1.4  mrg               mpfr_sqrt (d, b, MPFR_RNDD);
    636  1.1.1.4  mrg               if (!mpfr_equal_p (a, d))
    637  1.1.1.4  mrg                 {
    638  1.1.1.4  mrg                   mpfr_sqrt (d, b, MPFR_RNDU);
    639  1.1.1.4  mrg                   if (!mpfr_equal_p (a, d))
    640  1.1.1.4  mrg                     {
    641  1.1.1.4  mrg                       printf ("Error: mpfr_sqrt(a,b,RNDF) does not "
    642  1.1.1.4  mrg                               "match RNDD/RNDU\n");
    643  1.1.1.4  mrg                       printf ("b="); mpfr_dump (b);
    644  1.1.1.4  mrg                       printf ("a="); mpfr_dump (a);
    645  1.1.1.4  mrg                       exit (1);
    646  1.1.1.4  mrg                     }
    647  1.1.1.4  mrg                 }
    648  1.1.1.4  mrg               mpfr_nextabove (b);
    649  1.1.1.4  mrg             }
    650  1.1.1.4  mrg           mpfr_clear (b);
    651  1.1.1.4  mrg         }
    652  1.1.1.4  mrg       mpfr_clear (a);
    653  1.1.1.4  mrg       mpfr_clear (d);
    654  1.1.1.4  mrg     }
    655  1.1.1.4  mrg }
    656  1.1.1.4  mrg 
    657  1.1.1.4  mrg /* test the case prec = GMP_NUMB_BITS */
    658  1.1.1.4  mrg static void
    659  1.1.1.4  mrg test_sqrt1n (void)
    660  1.1.1.4  mrg {
    661  1.1.1.4  mrg   mpfr_t r, u;
    662  1.1.1.4  mrg   int inex;
    663  1.1.1.4  mrg 
    664  1.1.1.4  mrg   mpfr_init2 (r, GMP_NUMB_BITS);
    665  1.1.1.4  mrg   mpfr_init2 (u, GMP_NUMB_BITS);
    666  1.1.1.4  mrg 
    667  1.1.1.4  mrg   inex = mpfr_set_ui_2exp (u, 17 * 17, 2 * GMP_NUMB_BITS - 10, MPFR_RNDN);
    668  1.1.1.4  mrg   MPFR_ASSERTN(inex == 0);
    669  1.1.1.4  mrg   inex = mpfr_sqrt (r, u, MPFR_RNDN);
    670  1.1.1.4  mrg   MPFR_ASSERTN(inex == 0);
    671  1.1.1.4  mrg   MPFR_ASSERTN(mpfr_cmp_ui_2exp (r, 17, GMP_NUMB_BITS - 5) == 0);
    672  1.1.1.4  mrg 
    673  1.1.1.4  mrg   inex = mpfr_set_ui_2exp (u, 1, GMP_NUMB_BITS - 2, MPFR_RNDN);
    674  1.1.1.4  mrg   MPFR_ASSERTN(inex == 0);
    675  1.1.1.4  mrg   inex = mpfr_add_ui (u, u, 1, MPFR_RNDN);
    676  1.1.1.4  mrg   MPFR_ASSERTN(inex == 0);
    677  1.1.1.4  mrg   inex = mpfr_mul_2exp (u, u, GMP_NUMB_BITS, MPFR_RNDN);
    678  1.1.1.4  mrg   MPFR_ASSERTN(inex == 0);
    679  1.1.1.4  mrg   /* u = 2^(2*GMP_NUMB_BITS-2) + 2^GMP_NUMB_BITS, thus
    680  1.1.1.4  mrg      u = r^2 + 2^GMP_NUMB_BITS with r = 2^(GMP_NUMB_BITS-1).
    681  1.1.1.4  mrg      Should round to r+1 to nearest. */
    682  1.1.1.4  mrg   inex = mpfr_sqrt (r, u, MPFR_RNDN);
    683  1.1.1.4  mrg   MPFR_ASSERTN(inex > 0);
    684  1.1.1.4  mrg   inex = mpfr_sub_ui (r, r, 1, MPFR_RNDN);
    685  1.1.1.4  mrg   MPFR_ASSERTN(inex == 0);
    686  1.1.1.4  mrg   MPFR_ASSERTN(mpfr_cmp_ui_2exp (r, 1, GMP_NUMB_BITS - 1) == 0);
    687  1.1.1.4  mrg 
    688  1.1.1.4  mrg   mpfr_clear (r);
    689  1.1.1.4  mrg   mpfr_clear (u);
    690  1.1.1.4  mrg }
    691  1.1.1.4  mrg 
    692      1.1  mrg #define TEST_FUNCTION test_sqrt
    693      1.1  mrg #define TEST_RANDOM_POS 8
    694      1.1  mrg #include "tgeneric.c"
    695      1.1  mrg 
    696      1.1  mrg int
    697      1.1  mrg main (void)
    698      1.1  mrg {
    699      1.1  mrg   mpfr_prec_t p;
    700      1.1  mrg   int k;
    701      1.1  mrg 
    702      1.1  mrg   tests_start_mpfr ();
    703      1.1  mrg 
    704  1.1.1.4  mrg   testall_rndf (16);
    705      1.1  mrg   for (p = MPFR_PREC_MIN; p <= 128; p++)
    706      1.1  mrg     {
    707      1.1  mrg       test_property1 (p, MPFR_RNDN, 0);
    708      1.1  mrg       test_property1 (p, MPFR_RNDU, 0);
    709      1.1  mrg       test_property1 (p, MPFR_RNDA, 0);
    710      1.1  mrg       test_property1 (p, MPFR_RNDN, 1);
    711      1.1  mrg       test_property1 (p, MPFR_RNDU, 1);
    712      1.1  mrg       test_property1 (p, MPFR_RNDA, 1);
    713      1.1  mrg       test_property2 (p, MPFR_RNDN);
    714      1.1  mrg     }
    715      1.1  mrg 
    716      1.1  mrg   check_diverse ("635030154261163106768013773815762607450069292760790610550915652722277604820131530404842415587328", 160, "796887792767063979679855997149887366668464780637");
    717      1.1  mrg   special ();
    718  1.1.1.2  mrg   check_singular ();
    719      1.1  mrg 
    720      1.1  mrg   for (p=2; p<200; p++)
    721      1.1  mrg     for (k=0; k<200; k++)
    722      1.1  mrg       check_inexact (p);
    723      1.1  mrg   check_float();
    724      1.1  mrg 
    725      1.1  mrg   check3 ("-0.0", MPFR_RNDN, "0.0");
    726      1.1  mrg   check4 ("6.37983013646045901440e+32", MPFR_RNDN, "5.9bc5036d09e0c@13");
    727      1.1  mrg   check4 ("1.0", MPFR_RNDN, "1");
    728      1.1  mrg   check4 ("1.0", MPFR_RNDZ, "1");
    729      1.1  mrg   check4 ("3.725290298461914062500000e-9", MPFR_RNDN, "4@-4");
    730      1.1  mrg   check4 ("3.725290298461914062500000e-9", MPFR_RNDZ, "4@-4");
    731      1.1  mrg   check4 ("1190456976439861.0", MPFR_RNDZ, "2.0e7957873529a@6");
    732      1.1  mrg   check4 ("1219027943874417664.0", MPFR_RNDZ, "4.1cf2af0e6a534@7");
    733      1.1  mrg   /* the following examples are bugs in Cygnus compiler/system, found by
    734      1.1  mrg      Fabrice Rouillier while porting mpfr to Windows */
    735      1.1  mrg   check4 ("9.89438396044940256501e-134", MPFR_RNDU, "8.7af7bf0ebbee@-56");
    736      1.1  mrg   check4 ("7.86528588050363751914e+31", MPFR_RNDZ, "1.f81fc40f32062@13");
    737      1.1  mrg   check4 ("0.99999999999999988897", MPFR_RNDN, "f.ffffffffffff8@-1");
    738      1.1  mrg   check4 ("1.00000000000000022204", MPFR_RNDN, "1");
    739      1.1  mrg   /* the following examples come from the paper "Number-theoretic Test
    740      1.1  mrg    Generation for Directed Rounding" from Michael Parks, Table 4 */
    741      1.1  mrg 
    742      1.1  mrg   check4 ("78652858805036375191418371571712.0", MPFR_RNDN,
    743      1.1  mrg           "1.f81fc40f32063@13");
    744      1.1  mrg   check4 ("38510074998589467860312736661504.0", MPFR_RNDN,
    745      1.1  mrg           "1.60c012a92fc65@13");
    746      1.1  mrg   check4 ("35318779685413012908190921129984.0", MPFR_RNDN,
    747      1.1  mrg           "1.51d17526c7161@13");
    748      1.1  mrg   check4 ("26729022595358440976973142425600.0", MPFR_RNDN,
    749      1.1  mrg           "1.25e19302f7e51@13");
    750      1.1  mrg   check4 ("22696567866564242819241453027328.0", MPFR_RNDN,
    751      1.1  mrg           "1.0ecea7dd2ec3d@13");
    752      1.1  mrg   check4 ("22696888073761729132924856434688.0", MPFR_RNDN,
    753      1.1  mrg           "1.0ecf250e8e921@13");
    754      1.1  mrg   check4 ("36055652513981905145251657416704.0", MPFR_RNDN,
    755      1.1  mrg           "1.5552f3eedcf33@13");
    756      1.1  mrg   check4 ("30189856268896404997497182748672.0", MPFR_RNDN,
    757      1.1  mrg           "1.3853ee10c9c99@13");
    758      1.1  mrg   check4 ("36075288240584711210898775080960.0", MPFR_RNDN,
    759      1.1  mrg           "1.556abe212b56f@13");
    760      1.1  mrg   check4 ("72154663483843080704304789585920.0", MPFR_RNDN,
    761      1.1  mrg           "1.e2d9a51977e6e@13");
    762      1.1  mrg 
    763      1.1  mrg   check4 ("78652858805036375191418371571712.0", MPFR_RNDZ,
    764      1.1  mrg           "1.f81fc40f32062@13");
    765      1.1  mrg   check4 ("38510074998589467860312736661504.0", MPFR_RNDZ,
    766      1.1  mrg           "1.60c012a92fc64@13");
    767      1.1  mrg   check4 ("35318779685413012908190921129984.0", MPFR_RNDZ, "1.51d17526c716@13");
    768      1.1  mrg   check4 ("26729022595358440976973142425600.0", MPFR_RNDZ, "1.25e19302f7e5@13");
    769      1.1  mrg   check4 ("22696567866564242819241453027328.0", MPFR_RNDZ,
    770      1.1  mrg           "1.0ecea7dd2ec3c@13");
    771      1.1  mrg   check4 ("22696888073761729132924856434688.0", MPFR_RNDZ, "1.0ecf250e8e92@13");
    772      1.1  mrg   check4 ("36055652513981905145251657416704.0", MPFR_RNDZ,
    773      1.1  mrg           "1.5552f3eedcf32@13");
    774      1.1  mrg   check4 ("30189856268896404997497182748672.0", MPFR_RNDZ,
    775      1.1  mrg           "1.3853ee10c9c98@13");
    776      1.1  mrg   check4 ("36075288240584711210898775080960.0", MPFR_RNDZ,
    777      1.1  mrg           "1.556abe212b56e@13");
    778      1.1  mrg   check4 ("72154663483843080704304789585920.0", MPFR_RNDZ,
    779      1.1  mrg           "1.e2d9a51977e6d@13");
    780      1.1  mrg 
    781      1.1  mrg   check4 ("78652858805036375191418371571712.0", MPFR_RNDU,
    782      1.1  mrg           "1.f81fc40f32063@13");
    783      1.1  mrg   check4 ("38510074998589467860312736661504.0", MPFR_RNDU,
    784      1.1  mrg           "1.60c012a92fc65@13");
    785      1.1  mrg   check4 ("35318779685413012908190921129984.0", MPFR_RNDU,
    786      1.1  mrg           "1.51d17526c7161@13");
    787      1.1  mrg   check4 ("26729022595358440976973142425600.0", MPFR_RNDU,
    788      1.1  mrg           "1.25e19302f7e51@13");
    789      1.1  mrg   check4 ("22696567866564242819241453027328.0", MPFR_RNDU,
    790      1.1  mrg           "1.0ecea7dd2ec3d@13");
    791      1.1  mrg   check4 ("22696888073761729132924856434688.0", MPFR_RNDU,
    792      1.1  mrg           "1.0ecf250e8e921@13");
    793      1.1  mrg   check4 ("36055652513981905145251657416704.0", MPFR_RNDU,
    794      1.1  mrg           "1.5552f3eedcf33@13");
    795      1.1  mrg   check4 ("30189856268896404997497182748672.0", MPFR_RNDU,
    796      1.1  mrg           "1.3853ee10c9c99@13");
    797      1.1  mrg   check4 ("36075288240584711210898775080960.0", MPFR_RNDU,
    798      1.1  mrg           "1.556abe212b56f@13");
    799      1.1  mrg   check4 ("72154663483843080704304789585920.0", MPFR_RNDU,
    800      1.1  mrg           "1.e2d9a51977e6e@13");
    801      1.1  mrg 
    802      1.1  mrg   check4 ("78652858805036375191418371571712.0", MPFR_RNDD,
    803      1.1  mrg           "1.f81fc40f32062@13");
    804      1.1  mrg   check4 ("38510074998589467860312736661504.0", MPFR_RNDD,
    805      1.1  mrg           "1.60c012a92fc64@13");
    806      1.1  mrg   check4 ("35318779685413012908190921129984.0", MPFR_RNDD, "1.51d17526c716@13");
    807      1.1  mrg   check4 ("26729022595358440976973142425600.0", MPFR_RNDD, "1.25e19302f7e5@13");
    808      1.1  mrg   check4 ("22696567866564242819241453027328.0", MPFR_RNDD,
    809      1.1  mrg           "1.0ecea7dd2ec3c@13");
    810      1.1  mrg   check4 ("22696888073761729132924856434688.0", MPFR_RNDD, "1.0ecf250e8e92@13");
    811      1.1  mrg   check4 ("36055652513981905145251657416704.0", MPFR_RNDD,
    812      1.1  mrg           "1.5552f3eedcf32@13");
    813      1.1  mrg   check4 ("30189856268896404997497182748672.0", MPFR_RNDD,
    814      1.1  mrg           "1.3853ee10c9c98@13");
    815      1.1  mrg   check4 ("36075288240584711210898775080960.0", MPFR_RNDD,
    816      1.1  mrg           "1.556abe212b56e@13");
    817      1.1  mrg   check4 ("72154663483843080704304789585920.0", MPFR_RNDD,
    818      1.1  mrg           "1.e2d9a51977e6d@13");
    819      1.1  mrg 
    820      1.1  mrg   /* check that rounding away is just rounding toward plus infinity */
    821      1.1  mrg   check4 ("72154663483843080704304789585920.0", MPFR_RNDA,
    822      1.1  mrg           "1.e2d9a51977e6e@13");
    823      1.1  mrg 
    824  1.1.1.4  mrg   test_generic (MPFR_PREC_MIN, 300, 15);
    825      1.1  mrg   data_check ("data/sqrt", mpfr_sqrt, "mpfr_sqrt");
    826      1.1  mrg   bad_cases (mpfr_sqrt, mpfr_sqr, "mpfr_sqrt", 8, -256, 255, 4, 128, 800, 50);
    827      1.1  mrg 
    828  1.1.1.3  mrg   bug20160120 ();
    829  1.1.1.4  mrg   bug20160908 ();
    830  1.1.1.4  mrg   test_sqrt1n ();
    831  1.1.1.3  mrg 
    832      1.1  mrg   tests_end_mpfr ();
    833      1.1  mrg   return 0;
    834      1.1  mrg }
    835