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

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

version 1.1.1.2, 2000/09/09 14:13:11 version 1.1.1.3, 2003/08/25 16:06:35
Line 1 
Line 1 
 /* mpf_sub -- Subtract two floats.  /* mpf_sub -- Subtract two floats.
   
 Copyright (C) 1993, 1994, 1995, 1996, 1999, 2000 Free Software Foundation,  Copyright 1993, 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
 Inc.  Foundation, Inc.
   
 This file is part of the GNU MP Library.  This file is part of the GNU MP Library.
   
Line 24  MA 02111-1307, USA. */
Line 24  MA 02111-1307, USA. */
 #include "gmp-impl.h"  #include "gmp-impl.h"
   
 void  void
 #if __STDC__  
 mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v)  mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v)
 #else  
 mpf_sub (r, u, v)  
      mpf_ptr r;  
      mpf_srcptr u;  
      mpf_srcptr v;  
 #endif  
 {  {
   mp_srcptr up, vp;    mp_srcptr up, vp;
   mp_ptr rp, tp;    mp_ptr rp, tp;
Line 53  mpf_sub (r, u, v)
Line 46  mpf_sub (r, u, v)
     }      }
   if (vsize == 0)    if (vsize == 0)
     {      {
       mpf_set (r, u);        if (r != u)
           mpf_set (r, u);
       return;        return;
     }      }
   
Line 162  mpf_sub (r, u, v)
Line 156  mpf_sub (r, u, v)
              1 00000000 ...               1 00000000 ...
              0 ffffffff ... */               0 ffffffff ... */
   
           if (up[usize - 1] != 1 || vp[vsize - 1] != ~(mp_limb_t) 0            if (up[usize - 1] != 1 || vp[vsize - 1] != GMP_NUMB_MAX
               || (usize >= 2 && up[usize - 2] != 0))                || (usize >= 2 && up[usize - 2] != 0))
             goto general_case;              goto general_case;
   
Line 172  mpf_sub (r, u, v)
Line 166  mpf_sub (r, u, v)
   
       /* Skip sequences of 00000000/ffffffff */        /* Skip sequences of 00000000/ffffffff */
       while (vsize != 0 && usize != 0 && up[usize - 1] == 0        while (vsize != 0 && usize != 0 && up[usize - 1] == 0
              && vp[vsize - 1] == ~(mp_limb_t) 0)               && vp[vsize - 1] == GMP_NUMB_MAX)
         {          {
           usize--;            usize--;
           vsize--;            vsize--;
Line 181  mpf_sub (r, u, v)
Line 175  mpf_sub (r, u, v)
   
       if (usize == 0)        if (usize == 0)
         {          {
           while (vsize != 0 && vp[vsize - 1] == ~(mp_limb_t) 0)            while (vsize != 0 && vp[vsize - 1] == GMP_NUMB_MAX)
             {              {
               vsize--;                vsize--;
               exp--;                exp--;
Line 218  mpf_sub (r, u, v)
Line 212  mpf_sub (r, u, v)
             mp_size_t size, i;              mp_size_t size, i;
             size = vsize;              size = vsize;
             for (i = 0; i < size; i++)              for (i = 0; i < size; i++)
               tp[i] = ~vp[i];                tp[i] = ~vp[i] & GMP_NUMB_MASK;
             cy_limb = 1 - mpn_add_1 (tp, tp, vsize, (mp_limb_t) 1);              cy_limb = 1 - mpn_add_1 (tp, tp, vsize, (mp_limb_t) 1);
             rsize = vsize;              rsize = vsize;
             if (cy_limb == 0)              if (cy_limb == 0)
Line 246  mpf_sub (r, u, v)
Line 240  mpf_sub (r, u, v)
             mp_size_t size, i;              mp_size_t size, i;
             size = vsize - usize;              size = vsize - usize;
             for (i = 0; i < size; i++)              for (i = 0; i < size; i++)
               tp[i] = ~vp[i];                tp[i] = ~vp[i] & GMP_NUMB_MASK;
             cy_limb = mpn_sub_n (tp + size, up, vp + size, usize);              cy_limb = mpn_sub_n (tp + size, up, vp + size, usize);
             cy_limb+= mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1);              cy_limb+= mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1);
             cy_limb-= mpn_add_1 (tp, tp, vsize, (mp_limb_t) 1);              cy_limb-= mpn_add_1 (tp, tp, vsize, (mp_limb_t) 1);
Line 345  general_case:
Line 339  general_case:
                   /* vvvvvvv  */                    /* vvvvvvv  */
                   mp_size_t size, i;                    mp_size_t size, i;
                   size = vsize - usize;                    size = vsize - usize;
                   tp[0] = -vp[0];                    tp[0] = -vp[0] & GMP_NUMB_MASK;
                   for (i = 1; i < size; i++)                    for (i = 1; i < size; i++)
                     tp[i] = ~vp[i];                      tp[i] = ~vp[i] & GMP_NUMB_MASK;
                   mpn_sub_n (tp + size, up, vp + size, usize);                    mpn_sub_n (tp + size, up, vp + size, usize);
                   mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1);                    mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1);
                   rsize = vsize;                    rsize = vsize;
Line 371  general_case:
Line 365  general_case:
                   /*   vvvvv  */                    /*   vvvvv  */
                   mp_size_t size, i;                    mp_size_t size, i;
                   size = vsize + ediff - usize;                    size = vsize + ediff - usize;
                   tp[0] = -vp[0];                    tp[0] = -vp[0] & GMP_NUMB_MASK;
                   for (i = 1; i < size; i++)                    for (i = 1; i < size; i++)
                     tp[i] = ~vp[i];                      tp[i] = ~vp[i] & GMP_NUMB_MASK;
                   mpn_sub (tp + size, up, usize, vp + size, usize - ediff);                    mpn_sub (tp + size, up, usize, vp + size, usize - ediff);
                   mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1);                    mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1);
                   rsize = vsize + ediff;                    rsize = vsize + ediff;
Line 386  general_case:
Line 380  general_case:
           /*      vv  */            /*      vv  */
           mp_size_t size, i;            mp_size_t size, i;
           size = vsize + ediff - usize;            size = vsize + ediff - usize;
           tp[0] = -vp[0];            tp[0] = -vp[0] & GMP_NUMB_MASK;
           for (i = 1; i < vsize; i++)            for (i = 1; i < vsize; i++)
             tp[i] = ~vp[i];              tp[i] = ~vp[i] & GMP_NUMB_MASK;
           for (i = vsize; i < size; i++)            for (i = vsize; i < size; i++)
             tp[i] = ~(mp_limb_t) 0;              tp[i] = GMP_NUMB_MAX;
           mpn_sub_1 (tp + size, up, usize, (mp_limb_t) 1);            mpn_sub_1 (tp + size, up, usize, (mp_limb_t) 1);
           rsize = size + usize;            rsize = size + usize;
         }          }

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

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