[BACK]Return to mul_2exp.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpf

Diff for /OpenXM_contrib/gmp/mpf/Attic/mul_2exp.c between version 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2000/09/09 14:13:13 version 1.1.1.3, 2003/08/25 16:06:35
Line 1 
Line 1 
 /* mpf_mul_2exp -- Multiply a float by 2^n.  /* mpf_mul_2exp -- Multiply a float by 2^n.
   
 Copyright (C) 1993, 1994, 1996, 2000 Free Software Foundation, Inc.  Copyright 1993, 1994, 1996, 2000, 2001, 2002 Free Software Foundation, Inc.
   
 This file is part of the GNU MP Library.  This file is part of the GNU MP Library.
   
Line 23  MA 02111-1307, USA. */
Line 23  MA 02111-1307, USA. */
 #include "gmp-impl.h"  #include "gmp-impl.h"
   
 void  void
 #if __STDC__  
 mpf_mul_2exp (mpf_ptr r, mpf_srcptr u, unsigned long int exp)  mpf_mul_2exp (mpf_ptr r, mpf_srcptr u, unsigned long int exp)
 #else  
 mpf_mul_2exp (r, u, exp)  
      mpf_ptr r;  
      mpf_srcptr u;  
      unsigned long int exp;  
 #endif  
 {  {
   mp_srcptr up;    mp_srcptr up;
   mp_ptr rp = r->_mp_d;    mp_ptr rp = r->_mp_d;
Line 51  mpf_mul_2exp (r, u, exp)
Line 44  mpf_mul_2exp (r, u, exp)
   abs_usize = ABS (usize);    abs_usize = ABS (usize);
   up = u->_mp_d;    up = u->_mp_d;
   
   if (exp % BITS_PER_MP_LIMB == 0)    if (exp % GMP_NUMB_BITS == 0)
     {      {
       prec++;                   /* retain more precision here as we don't need        prec++;                   /* retain more precision here as we don't need
                                    to account for carry-out here */                                     to account for carry-out here */
Line 62  mpf_mul_2exp (r, u, exp)
Line 55  mpf_mul_2exp (r, u, exp)
         }          }
       if (rp != up)        if (rp != up)
         MPN_COPY_INCR (rp, up, abs_usize);          MPN_COPY_INCR (rp, up, abs_usize);
       r->_mp_exp = uexp + exp / BITS_PER_MP_LIMB;        r->_mp_exp = uexp + exp / GMP_NUMB_BITS;
     }      }
   else    else
     {      {
Line 75  mpf_mul_2exp (r, u, exp)
Line 68  mpf_mul_2exp (r, u, exp)
           /* Use mpn_rshift since mpn_lshift operates downwards, and we            /* Use mpn_rshift since mpn_lshift operates downwards, and we
              therefore would clobber part of U before using that part, in case               therefore would clobber part of U before using that part, in case
              R is the same variable as U.  */               R is the same variable as U.  */
           cy_limb = mpn_rshift (rp + 1, up, abs_usize, (-exp) % BITS_PER_MP_LIMB);            cy_limb = mpn_rshift (rp + 1, up, abs_usize,
                                   GMP_NUMB_BITS - exp % GMP_NUMB_BITS);
           rp[0] = cy_limb;            rp[0] = cy_limb;
           adj = rp[abs_usize] != 0;            adj = rp[abs_usize] != 0;
         }          }
       else        else
         {          {
           cy_limb = mpn_lshift (rp, up, abs_usize, exp % BITS_PER_MP_LIMB);            cy_limb = mpn_lshift (rp, up, abs_usize, exp % GMP_NUMB_BITS);
           rp[abs_usize] = cy_limb;            rp[abs_usize] = cy_limb;
           adj = cy_limb != 0;            adj = cy_limb != 0;
         }          }
   
       abs_usize += adj;        abs_usize += adj;
       r->_mp_exp = uexp + exp / BITS_PER_MP_LIMB + adj;        r->_mp_exp = uexp + exp / GMP_NUMB_BITS + adj;
     }      }
   r->_mp_size = usize >= 0 ? abs_usize : -abs_usize;    r->_mp_size = usize >= 0 ? abs_usize : -abs_usize;
 }  }

Legend:
Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>