Home | History | Annotate | Line # | Download | only in mpf
t-ui_div.c revision 1.1
      1  1.1  mrg /* Test mpf_ui_div.
      2  1.1  mrg 
      3  1.1  mrg Copyright 2004 Free Software Foundation, Inc.
      4  1.1  mrg 
      5  1.1  mrg This file is part of the GNU MP Library.
      6  1.1  mrg 
      7  1.1  mrg The GNU MP Library is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU Lesser General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     10  1.1  mrg option) any later version.
     11  1.1  mrg 
     12  1.1  mrg The GNU MP Library is distributed in the hope that it will be useful, but
     13  1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14  1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     15  1.1  mrg License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU Lesser General Public License
     18  1.1  mrg along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
     19  1.1  mrg 
     20  1.1  mrg #include <stdio.h>
     21  1.1  mrg #include <stdlib.h>
     22  1.1  mrg #include "gmp.h"
     23  1.1  mrg #include "gmp-impl.h"
     24  1.1  mrg #include "tests.h"
     25  1.1  mrg 
     26  1.1  mrg 
     27  1.1  mrg void
     28  1.1  mrg check_one (const char *desc, mpf_ptr got, unsigned long u, mpf_srcptr v)
     29  1.1  mrg {
     30  1.1  mrg   mpf_t      uf;
     31  1.1  mrg   mp_limb_t  ulimbs[2];
     32  1.1  mrg   mp_size_t  usize;
     33  1.1  mrg 
     34  1.1  mrg   ulimbs[0] = u & GMP_NUMB_MASK;
     35  1.1  mrg   usize = (u != 0);
     36  1.1  mrg #if BITS_PER_ULONG > GMP_NUMB_BITS
     37  1.1  mrg   u >>= GMP_NUMB_BITS;
     38  1.1  mrg   ulimbs[1] = u;
     39  1.1  mrg   usize += (u != 0);
     40  1.1  mrg #endif
     41  1.1  mrg   PTR(uf) = ulimbs;
     42  1.1  mrg   SIZ(uf) = usize;
     43  1.1  mrg   EXP(uf) = usize;
     44  1.1  mrg 
     45  1.1  mrg   if (! refmpf_validate_division ("mpf_ui_div", got, uf, v))
     46  1.1  mrg     {
     47  1.1  mrg       mp_trace_base = -16;
     48  1.1  mrg       printf    ("  u 0x%lX  (%lu)\n", u, u);
     49  1.1  mrg       mpf_trace ("  v", v);
     50  1.1  mrg       printf    ("  %s\n", desc);
     51  1.1  mrg       abort ();
     52  1.1  mrg     }
     53  1.1  mrg }
     54  1.1  mrg 
     55  1.1  mrg void
     56  1.1  mrg check_rand (void)
     57  1.1  mrg {
     58  1.1  mrg   unsigned long  min_prec = __GMPF_BITS_TO_PREC (1);
     59  1.1  mrg   gmp_randstate_ptr  rands = RANDS;
     60  1.1  mrg   unsigned long  prec, u;
     61  1.1  mrg   mpf_t  got, v;
     62  1.1  mrg   int    i;
     63  1.1  mrg 
     64  1.1  mrg   mpf_init (got);
     65  1.1  mrg   mpf_init (v);
     66  1.1  mrg 
     67  1.1  mrg   for (i = 0; i < 200; i++)
     68  1.1  mrg     {
     69  1.1  mrg       /* got precision */
     70  1.1  mrg       prec = min_prec + gmp_urandomm_ui (rands, 15L);
     71  1.1  mrg       refmpf_set_prec_limbs (got, prec);
     72  1.1  mrg 
     73  1.1  mrg       /* u */
     74  1.1  mrg       prec = gmp_urandomm_ui (rands, BITS_PER_ULONG+1);
     75  1.1  mrg       u = gmp_urandomb_ui (rands, prec);
     76  1.1  mrg 
     77  1.1  mrg       /* v precision */
     78  1.1  mrg       prec = min_prec + gmp_urandomm_ui (rands, 15L);
     79  1.1  mrg       refmpf_set_prec_limbs (v, prec);
     80  1.1  mrg 
     81  1.1  mrg       /* v, non-zero */
     82  1.1  mrg       do {
     83  1.1  mrg         mpf_random2 (v, PREC(v), (mp_exp_t) 20);
     84  1.1  mrg       } while (SIZ(v) == 0);
     85  1.1  mrg 
     86  1.1  mrg       /* v possibly negative */
     87  1.1  mrg       if (gmp_urandomb_ui (rands, 1L))
     88  1.1  mrg         mpf_neg (v, v);
     89  1.1  mrg 
     90  1.1  mrg       if ((i % 2) == 0)
     91  1.1  mrg         {
     92  1.1  mrg           /* src != dst */
     93  1.1  mrg           mpf_ui_div (got, u, v);
     94  1.1  mrg           check_one ("separate", got, u, v);
     95  1.1  mrg         }
     96  1.1  mrg       else
     97  1.1  mrg         {
     98  1.1  mrg           /* src == dst */
     99  1.1  mrg           prec = refmpf_set_overlap (got, v);
    100  1.1  mrg           mpf_ui_div (got, u, got);
    101  1.1  mrg           check_one ("overlap src==dst", got, u, v);
    102  1.1  mrg 
    103  1.1  mrg           mpf_set_prec_raw (got, prec);
    104  1.1  mrg         }
    105  1.1  mrg     }
    106  1.1  mrg 
    107  1.1  mrg   mpf_clear (got);
    108  1.1  mrg   mpf_clear (v);
    109  1.1  mrg }
    110  1.1  mrg 
    111  1.1  mrg void
    112  1.1  mrg check_various (void)
    113  1.1  mrg {
    114  1.1  mrg   mpf_t got, v;
    115  1.1  mrg 
    116  1.1  mrg   mpf_init (got);
    117  1.1  mrg   mpf_init (v);
    118  1.1  mrg 
    119  1.1  mrg   /* 100/4 == 25 */
    120  1.1  mrg   mpf_set_prec (got, 20L);
    121  1.1  mrg   mpf_set_ui (v, 4L);
    122  1.1  mrg   mpf_ui_div (got, 100L, v);
    123  1.1  mrg   MPF_CHECK_FORMAT (got);
    124  1.1  mrg   ASSERT_ALWAYS (mpf_cmp_ui (got, 25L) == 0);
    125  1.1  mrg 
    126  1.1  mrg   {
    127  1.1  mrg     /* 1/(2^n+1), a case where truncating the divisor would be wrong */
    128  1.1  mrg     unsigned long  u = 1L;
    129  1.1  mrg     mpf_set_prec (got, 500L);
    130  1.1  mrg     mpf_set_prec (v, 900L);
    131  1.1  mrg     mpf_set_ui (v, 1L);
    132  1.1  mrg     mpf_mul_2exp (v, v, 800L);
    133  1.1  mrg     mpf_add_ui (v, v, 1L);
    134  1.1  mrg     mpf_ui_div (got, u, v);
    135  1.1  mrg     check_one ("1/2^n+1, separate", got, u, v);
    136  1.1  mrg   }
    137  1.1  mrg 
    138  1.1  mrg   mpf_clear (got);
    139  1.1  mrg   mpf_clear (v);
    140  1.1  mrg }
    141  1.1  mrg 
    142  1.1  mrg int
    143  1.1  mrg main (void)
    144  1.1  mrg {
    145  1.1  mrg   tests_start ();
    146  1.1  mrg 
    147  1.1  mrg   check_various ();
    148  1.1  mrg   check_rand ();
    149  1.1  mrg 
    150  1.1  mrg   tests_end ();
    151  1.1  mrg   exit (0);
    152  1.1  mrg }
    153