Home | History | Annotate | Line # | Download | only in tests
tcan_round.c revision 1.1.1.1.2.1
      1          1.1   mrg /* Test file for mpfr_can_round.
      2          1.1   mrg 
      3  1.1.1.1.2.1  yamt Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
      4  1.1.1.1.2.1  yamt 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   mrg #define MAX_LIMB_SIZE 100
     29          1.1   mrg 
     30          1.1   mrg static void
     31          1.1   mrg check_round_p (void)
     32          1.1   mrg {
     33          1.1   mrg   mp_limb_t buf[MAX_LIMB_SIZE];
     34          1.1   mrg   mp_size_t n, i;
     35          1.1   mrg   mpfr_prec_t p;
     36          1.1   mrg   mpfr_exp_t err;
     37          1.1   mrg   int r1, r2;
     38          1.1   mrg 
     39          1.1   mrg   for (n = 2 ; n <= MAX_LIMB_SIZE ; n++)
     40          1.1   mrg     {
     41          1.1   mrg       /* avoid mpn_random which leaks memory */
     42          1.1   mrg       for (i = 0; i < n; i++)
     43          1.1   mrg         buf[i] = randlimb ();
     44          1.1   mrg       p = randlimb() % ((n-1) * GMP_NUMB_BITS) + MPFR_PREC_MIN;
     45          1.1   mrg       err = p + randlimb () % GMP_NUMB_BITS;
     46          1.1   mrg       r1 = mpfr_round_p (buf, n, err, p);
     47          1.1   mrg       r2 = mpfr_can_round_raw (buf, n, MPFR_SIGN_POS, err,
     48          1.1   mrg                                MPFR_RNDN, MPFR_RNDZ, p);
     49          1.1   mrg       if (r1 != r2)
     50          1.1   mrg         {
     51          1.1   mrg           printf ("mpfr_round_p(%d) != mpfr_can_round(%d)!\n"
     52          1.1   mrg                   "bn = %ld, err0 = %ld, prec = %lu\nbp = ",
     53  1.1.1.1.2.1  yamt                   r1, r2, n, (long) err, (unsigned long) p);
     54          1.1   mrg           gmp_printf ("%NX\n", buf, n);
     55          1.1   mrg           exit (1);
     56          1.1   mrg         }
     57          1.1   mrg     }
     58          1.1   mrg }
     59          1.1   mrg 
     60          1.1   mrg int
     61          1.1   mrg main (void)
     62          1.1   mrg {
     63          1.1   mrg   mpfr_t x;
     64          1.1   mrg   mpfr_prec_t i, j;
     65          1.1   mrg 
     66          1.1   mrg   tests_start_mpfr ();
     67          1.1   mrg 
     68          1.1   mrg   /* checks that rounds to nearest sets the last
     69          1.1   mrg      bit to zero in case of equal distance */
     70          1.1   mrg   mpfr_init2 (x, 59);
     71          1.1   mrg   mpfr_set_str_binary (x, "-0.10010001010111000011110010111010111110000000111101100111111E663");
     72          1.1   mrg   if (mpfr_can_round (x, 54, MPFR_RNDZ, MPFR_RNDZ, 53) != 0)
     73          1.1   mrg     {
     74          1.1   mrg       printf ("Error (1) in mpfr_can_round\n");
     75          1.1   mrg       exit (1);
     76          1.1   mrg     }
     77          1.1   mrg 
     78          1.1   mrg   mpfr_set_str_binary (x, "-Inf");
     79          1.1   mrg   if (mpfr_can_round (x, 2000, MPFR_RNDZ, MPFR_RNDZ, 2000) != 0)
     80          1.1   mrg     {
     81          1.1   mrg       printf ("Error (2) in mpfr_can_round\n");
     82          1.1   mrg       exit (1);
     83          1.1   mrg     }
     84          1.1   mrg 
     85          1.1   mrg   mpfr_set_prec (x, 64);
     86          1.1   mrg   mpfr_set_str_binary (x, "0.1011001000011110000110000110001111101011000010001110011000000000");
     87          1.1   mrg   if (mpfr_can_round (x, 65, MPFR_RNDN, MPFR_RNDN, 54))
     88          1.1   mrg     {
     89          1.1   mrg       printf ("Error (3) in mpfr_can_round\n");
     90          1.1   mrg       exit (1);
     91          1.1   mrg     }
     92          1.1   mrg 
     93          1.1   mrg   mpfr_set_prec (x, 137);
     94          1.1   mrg   mpfr_set_str_binary (x, "-0.10111001101001010110011000110100111010011101101010010100101100001110000100111111011101010110001010111100100101110111100001000010000000000E-97");
     95          1.1   mrg   if (mpfr_can_round (x, 132, MPFR_RNDU, MPFR_RNDZ, 128) == 0)
     96          1.1   mrg     {
     97          1.1   mrg       printf ("Error (4) in mpfr_can_round\n");
     98          1.1   mrg       exit (1);
     99          1.1   mrg     }
    100          1.1   mrg 
    101          1.1   mrg   /* in the following, we can round but cannot determine the inexact flag */
    102          1.1   mrg   mpfr_set_prec (x, 86);
    103          1.1   mrg   mpfr_set_str_binary (x, "-0.11100100010011001111011010100111101010011000000000000000000000000000000000000000000000E-80");
    104          1.1   mrg   if (mpfr_can_round (x, 81, MPFR_RNDU, MPFR_RNDZ, 44) == 0)
    105          1.1   mrg     {
    106          1.1   mrg       printf ("Error (5) in mpfr_can_round\n");
    107          1.1   mrg       exit (1);
    108          1.1   mrg     }
    109          1.1   mrg 
    110          1.1   mrg   mpfr_set_prec (x, 62);
    111          1.1   mrg   mpfr_set_str (x, "0.ff4ca619c76ba69", 16, MPFR_RNDZ);
    112          1.1   mrg   for (i = 30; i < 99; i++)
    113          1.1   mrg     for (j = 30; j < 99; j++)
    114          1.1   mrg       {
    115          1.1   mrg         int r1, r2;
    116          1.1   mrg         for (r1 = 0; r1 < MPFR_RND_MAX ; r1++)
    117          1.1   mrg           for (r2 = 0; r2 < MPFR_RND_MAX ; r2++)
    118          1.1   mrg             mpfr_can_round (x, i, (mpfr_rnd_t) r1, (mpfr_rnd_t) r2, j); /* test for assertions */
    119          1.1   mrg       }
    120          1.1   mrg 
    121          1.1   mrg   mpfr_clear (x);
    122          1.1   mrg 
    123          1.1   mrg   check_round_p ();
    124          1.1   mrg 
    125          1.1   mrg   tests_end_mpfr ();
    126          1.1   mrg   return 0;
    127          1.1   mrg }
    128