Home | History | Annotate | Line # | Download | only in tests
tget_z.c revision 1.1
      1  1.1  mrg /* Test file for mpz_set_fr / mpfr_get_z.
      2  1.1  mrg 
      3  1.1  mrg Copyright 2004, 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 static void
     29  1.1  mrg check_diff (void)
     30  1.1  mrg {
     31  1.1  mrg   int inex;
     32  1.1  mrg   mpfr_t x;
     33  1.1  mrg   mpz_t  z;
     34  1.1  mrg   mpfr_exp_t emin;
     35  1.1  mrg 
     36  1.1  mrg   mpz_init   (z);
     37  1.1  mrg   mpfr_init2 (x, 2);
     38  1.1  mrg 
     39  1.1  mrg   mpfr_set_ui (x, 2047, MPFR_RNDU);
     40  1.1  mrg   mpz_set_fr (z, x, MPFR_RNDN);
     41  1.1  mrg   if (mpz_cmp_ui (z, 2048) != 0)
     42  1.1  mrg     {
     43  1.1  mrg       printf ("get_z RU 2048 failed\n");
     44  1.1  mrg       exit (1);
     45  1.1  mrg     }
     46  1.1  mrg 
     47  1.1  mrg   mpfr_set_prec (x, 6);
     48  1.1  mrg   mpfr_set_str (x, "17.5", 10, MPFR_RNDN);
     49  1.1  mrg   inex = mpfr_get_z (z, x, MPFR_RNDN);
     50  1.1  mrg   if (inex <= 0 || mpz_cmp_ui (z, 18) != 0)
     51  1.1  mrg     {
     52  1.1  mrg       printf ("get_z RN 17.5 failed\n");
     53  1.1  mrg       exit (1);
     54  1.1  mrg     }
     55  1.1  mrg 
     56  1.1  mrg   /* save default emin */
     57  1.1  mrg   emin = mpfr_get_emin ();;
     58  1.1  mrg 
     59  1.1  mrg   mpfr_set_emin (17);
     60  1.1  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
     61  1.1  mrg   inex = mpfr_get_z (z, x, MPFR_RNDN);
     62  1.1  mrg   if (inex != 0 || mpz_cmp_ui (z, 0) != 0)
     63  1.1  mrg     {
     64  1.1  mrg       printf ("get_z 0 failed\n");
     65  1.1  mrg       exit (1);
     66  1.1  mrg     }
     67  1.1  mrg 
     68  1.1  mrg   /* restore default emin */
     69  1.1  mrg   mpfr_set_emin (emin);
     70  1.1  mrg 
     71  1.1  mrg   mpfr_clear (x);
     72  1.1  mrg   mpz_clear  (z);
     73  1.1  mrg }
     74  1.1  mrg 
     75  1.1  mrg static void
     76  1.1  mrg check_one (mpz_ptr z)
     77  1.1  mrg {
     78  1.1  mrg   int    inex;
     79  1.1  mrg   int    sh, neg;
     80  1.1  mrg   mpfr_t f;
     81  1.1  mrg   mpz_t  got;
     82  1.1  mrg 
     83  1.1  mrg   mpfr_init2 (f, MAX( mpz_sizeinbase (z, 2), MPFR_PREC_MIN) );
     84  1.1  mrg   mpz_init (got);
     85  1.1  mrg 
     86  1.1  mrg   for (sh = -2*GMP_NUMB_BITS ; sh < 2*GMP_NUMB_BITS ; sh++)
     87  1.1  mrg     {
     88  1.1  mrg       for (neg = 0; neg <= 1; neg++)
     89  1.1  mrg         {
     90  1.1  mrg           mpz_neg (z, z);
     91  1.1  mrg           mpfr_set_z (f, z, MPFR_RNDN);
     92  1.1  mrg 
     93  1.1  mrg           if (sh < 0)
     94  1.1  mrg             {
     95  1.1  mrg               mpz_tdiv_q_2exp (z, z, -sh);
     96  1.1  mrg               mpfr_div_2exp (f, f, -sh, MPFR_RNDN);
     97  1.1  mrg             }
     98  1.1  mrg           else
     99  1.1  mrg             {
    100  1.1  mrg               mpz_mul_2exp (z, z, sh);
    101  1.1  mrg               mpfr_mul_2exp (f, f, sh, MPFR_RNDN);
    102  1.1  mrg             }
    103  1.1  mrg 
    104  1.1  mrg           inex = mpfr_get_z (got, f, MPFR_RNDZ);
    105  1.1  mrg 
    106  1.1  mrg           if (mpz_cmp (got, z) != 0)
    107  1.1  mrg             {
    108  1.1  mrg               printf ("Wrong result for shift=%d\n", sh);
    109  1.1  mrg               printf ("     f "); mpfr_dump (f);
    110  1.1  mrg               printf ("   got "); mpz_dump (got);
    111  1.1  mrg               printf ("  want "); mpz_dump (z);
    112  1.1  mrg               exit (1);
    113  1.1  mrg             }
    114  1.1  mrg           if (! SAME_SIGN (inex, - mpfr_cmp_z (f, z)))
    115  1.1  mrg             {
    116  1.1  mrg               printf ("Wrong inexact value for shift=%d\n", sh);
    117  1.1  mrg               printf ("    f "); mpfr_dump (f);
    118  1.1  mrg               printf ("  got %+d\n", inex);
    119  1.1  mrg               printf (" want %+d\n", -mpfr_cmp_z (f, z));
    120  1.1  mrg               exit (1);
    121  1.1  mrg             }
    122  1.1  mrg         }
    123  1.1  mrg     }
    124  1.1  mrg 
    125  1.1  mrg   mpfr_clear (f);
    126  1.1  mrg   mpz_clear (got);
    127  1.1  mrg }
    128  1.1  mrg 
    129  1.1  mrg static void
    130  1.1  mrg check (void)
    131  1.1  mrg {
    132  1.1  mrg   mpz_t  z;
    133  1.1  mrg 
    134  1.1  mrg   mpz_init (z);
    135  1.1  mrg 
    136  1.1  mrg   mpz_set_ui (z, 0L);
    137  1.1  mrg   check_one (z);
    138  1.1  mrg 
    139  1.1  mrg   mpz_set_si (z, 123L);
    140  1.1  mrg   check_one (z);
    141  1.1  mrg 
    142  1.1  mrg   mpz_rrandomb (z, RANDS, 2*GMP_NUMB_BITS);
    143  1.1  mrg   check_one (z);
    144  1.1  mrg 
    145  1.1  mrg   mpz_rrandomb (z, RANDS, 5*GMP_NUMB_BITS);
    146  1.1  mrg   check_one (z);
    147  1.1  mrg 
    148  1.1  mrg   mpz_clear (z);
    149  1.1  mrg }
    150  1.1  mrg 
    151  1.1  mrg static void
    152  1.1  mrg special (void)
    153  1.1  mrg {
    154  1.1  mrg   int inex;
    155  1.1  mrg   mpfr_t x;
    156  1.1  mrg   mpz_t z;
    157  1.1  mrg   int i;
    158  1.1  mrg   mpfr_exp_t e;
    159  1.1  mrg 
    160  1.1  mrg   mpfr_init2 (x, 2);
    161  1.1  mrg   mpz_init (z);
    162  1.1  mrg 
    163  1.1  mrg   for (i = -1; i <= 1; i++)
    164  1.1  mrg     {
    165  1.1  mrg       if (i != 0)
    166  1.1  mrg         mpfr_set_nan (x);
    167  1.1  mrg       else
    168  1.1  mrg         mpfr_set_inf (x, i);
    169  1.1  mrg       mpfr_clear_flags ();
    170  1.1  mrg       inex = mpfr_get_z (z, x, MPFR_RNDN);
    171  1.1  mrg       if (!mpfr_erangeflag_p () || inex != 0 || mpz_cmp_ui (z, 0) != 0)
    172  1.1  mrg         {
    173  1.1  mrg           printf ("special() failed on mpfr_get_z for i = %d\n", i);
    174  1.1  mrg           exit (1);
    175  1.1  mrg         }
    176  1.1  mrg       mpfr_clear_flags ();
    177  1.1  mrg       e = mpfr_get_z_2exp (z, x);
    178  1.1  mrg       if (!mpfr_erangeflag_p () || e != __gmpfr_emin ||
    179  1.1  mrg           mpz_cmp_ui (z, 0) != 0)
    180  1.1  mrg         {
    181  1.1  mrg           printf ("special() failed on mpfr_get_z_2exp for i = %d\n", i);
    182  1.1  mrg           exit (1);
    183  1.1  mrg         }
    184  1.1  mrg     }
    185  1.1  mrg 
    186  1.1  mrg   mpfr_clear (x);
    187  1.1  mrg   mpz_clear (z);
    188  1.1  mrg }
    189  1.1  mrg 
    190  1.1  mrg int
    191  1.1  mrg main (void)
    192  1.1  mrg {
    193  1.1  mrg   tests_start_mpfr ();
    194  1.1  mrg 
    195  1.1  mrg   check ();
    196  1.1  mrg   check_diff ();
    197  1.1  mrg   special ();
    198  1.1  mrg 
    199  1.1  mrg   tests_end_mpfr ();
    200  1.1  mrg   return 0;
    201  1.1  mrg }
    202