(root)/
mpfr-4.2.1/
src/
sub1.c
       1  /* mpfr_sub1 -- internal function to perform a "real" subtraction
       2  
       3  Copyright 2001-2023 Free Software Foundation, Inc.
       4  Contributed by the AriC and Caramba projects, INRIA.
       5  
       6  This file is part of the GNU MPFR Library.
       7  
       8  The GNU MPFR Library is free software; you can redistribute it and/or modify
       9  it under the terms of the GNU Lesser General Public License as published by
      10  the Free Software Foundation; either version 3 of the License, or (at your
      11  option) any later version.
      12  
      13  The GNU MPFR Library is distributed in the hope that it will be useful, but
      14  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      15  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
      16  License for more details.
      17  
      18  You should have received a copy of the GNU Lesser General Public License
      19  along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
      20  https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
      21  51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
      22  
      23  #include "mpfr-impl.h"
      24  
      25  /* compute sign(b) * (|b| - |c|), with |b| > |c|, diff_exp = EXP(b) - EXP(c)
      26     Returns 0 iff result is exact,
      27     a negative value when the result is less than the exact value,
      28     a positive value otherwise.
      29  */
      30  
      31  int
      32  mpfr_sub1 (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode)
      33  {
      34    int sign;
      35    mpfr_exp_t diff_exp, exp_a, exp_b;
      36    mpfr_prec_t cancel, cancel1;
      37    mp_size_t cancel2, an, bn, cn, cn0;
      38    mp_limb_t *ap, *bp, *cp;
      39    mp_limb_t carry, bb, cc;
      40    mpfr_prec_t aq, bq;
      41    int inexact, shift_b, shift_c, add_exp = 0;
      42    int cmp_low = 0; /* used for rounding to nearest: 0 if low(b) = low(c),
      43                        negative if low(b) < low(c), positive if low(b) > low(c) */
      44    int sh, k;
      45    MPFR_TMP_DECL(marker);
      46  
      47    MPFR_TMP_MARK(marker);
      48    ap = MPFR_MANT(a);
      49    an = MPFR_LIMB_SIZE(a);
      50  
      51    (void) MPFR_GET_PREC (a);
      52    (void) MPFR_GET_PREC (b);
      53    (void) MPFR_GET_PREC (c);
      54  
      55    sign = mpfr_cmp2 (b, c, &cancel);
      56  
      57    if (MPFR_UNLIKELY(sign == 0))
      58      {
      59        MPFR_LOG_MSG (("sign=0\n", 0));
      60        if (rnd_mode == MPFR_RNDD)
      61          MPFR_SET_NEG (a);
      62        else
      63          MPFR_SET_POS (a);
      64        MPFR_SET_ZERO (a);
      65        MPFR_RET (0);
      66      }
      67  
      68    /* sign != 0, so that cancel has a valid value. */
      69    MPFR_LOG_MSG (("sign=%d cancel=%Pd\n", sign, cancel));
      70    MPFR_ASSERTD (cancel >= 0 && cancel <= MPFR_PREC_MAX);
      71  
      72    /*
      73     * If subtraction: sign(a) = sign * sign(b)
      74     * If addition: sign(a) = sign of the larger argument in absolute value.
      75     *
      76     * Both cases can be simplified in:
      77     * if (sign>0)
      78     *    if addition: sign(a) = sign * sign(b) = sign(b)
      79     *    if subtraction, b is greater, so sign(a) = sign(b)
      80     * else
      81     *    if subtraction, sign(a) = - sign(b)
      82     *    if addition, sign(a) = sign(c) (since c is greater)
      83     *      But if it is an addition, sign(b) and sign(c) are opposed!
      84     *      So sign(a) = - sign(b)
      85     */
      86  
      87    if (sign < 0) /* swap b and c so that |b| > |c| */
      88      {
      89        mpfr_srcptr t;
      90        MPFR_SET_OPPOSITE_SIGN (a,b);
      91        t = b; b = c; c = t;
      92      }
      93    else
      94      MPFR_SET_SAME_SIGN (a,b);
      95  
      96    if (MPFR_UNLIKELY (MPFR_IS_UBF (b) || MPFR_IS_UBF (c)))
      97      {
      98        exp_b = MPFR_UBF_GET_EXP (b);
      99        /* Early underflow detection. Rare, but a test is needed anyway
     100           since in the "MAX (aq, bq) + 2 <= diff_exp" branch, the exponent
     101           may decrease and MPFR_EXP_MIN would yield an integer overflow. */
     102        if (MPFR_UNLIKELY (exp_b < __gmpfr_emin - 1))
     103          {
     104            if (rnd_mode == MPFR_RNDN)
     105              rnd_mode = MPFR_RNDZ;
     106            return mpfr_underflow (a, rnd_mode, MPFR_SIGN(a));
     107          }
     108        diff_exp = mpfr_ubf_diff_exp (b, c);
     109        MPFR_LOG_MSG (("UBF: exp_b=%" MPFR_EXP_FSPEC "d%s "
     110                       "diff_exp=%" MPFR_EXP_FSPEC "d%s\n",
     111                       (mpfr_eexp_t) exp_b,
     112                       exp_b == MPFR_EXP_MAX ? "=MPFR_EXP_MAX" : "",
     113                       (mpfr_eexp_t) diff_exp,
     114                       diff_exp == MPFR_EXP_MAX ? "=MPFR_EXP_MAX" : ""));
     115        /* If diff_exp == MPFR_EXP_MAX, the actual value can be larger,
     116           but anyway, since mpfr_exp_t >= mp_size_t, this will be the
     117           case c small below, and the exact value does not matter. */
     118        /* mpfr_set4 below used with MPFR_RNDF does not support UBF. */
     119        if (rnd_mode == MPFR_RNDF)
     120          rnd_mode = MPFR_RNDN;
     121      }
     122    else
     123      {
     124        exp_b = MPFR_GET_EXP (b);
     125        diff_exp = exp_b - MPFR_GET_EXP (c);
     126      }
     127    MPFR_ASSERTD (diff_exp >= 0);
     128  
     129    aq = MPFR_GET_PREC (a);
     130    bq = MPFR_GET_PREC (b);
     131  
     132    /* Check if c is too small.
     133       A more precise test is to replace 2 by
     134        (rnd == MPFR_RNDN) + mpfr_power2_raw (b)
     135        but it is more expensive and not very useful */
     136    if (MPFR_UNLIKELY (MAX (aq, bq) + 2 <= diff_exp))
     137      {
     138        MPFR_LOG_MSG (("case c small\n", 0));
     139  
     140        /* Remember, we can't have an exact result! */
     141        /*   A.AAAAAAAAAAAAAAAAA
     142           = B.BBBBBBBBBBBBBBB
     143            -                     C.CCCCCCCCCCCCC */
     144        /* A = S*ABS(B) +/- ulp(a) */
     145  
     146        /* since we can't have an exact result, for RNDF we can truncate b */
     147        if (rnd_mode == MPFR_RNDF)
     148          return mpfr_set4 (a, b, MPFR_RNDZ, MPFR_SIGN (a));
     149  
     150        exp_a = exp_b;  /* may be any out-of-range value due to UBF */
     151        MPFR_RNDRAW_EVEN (inexact, a, MPFR_MANT (b), bq,
     152                          rnd_mode, MPFR_SIGN (a),
     153                          if (exp_a != MPFR_EXP_MAX)
     154                            exp_a ++);
     155        MPFR_LOG_MSG (("inexact=%d\n", inexact));
     156        if (inexact == 0 &&
     157            /* a = b, but the exact value of b - c is a bit below. Then,
     158               except for directed rounding similar to toward zero and
     159               before overflow checking: a is the correctly rounded value
     160               and since |b| - |c| < |a|, the ternary value value is given
     161               by the sign of a. */
     162            ! MPFR_IS_LIKE_RNDZ (rnd_mode, MPFR_IS_NEG (a)))
     163          {
     164            MPFR_LOG_MSG (("c small, case 1\n", 0));
     165            inexact = MPFR_INT_SIGN (a);
     166          }
     167        else if (inexact != 0 &&
     168            /*   A.AAAAAAAAAAAAAA
     169               = B.BBBBBBBBBBBBBBB
     170                -                   C.CCCCCCCCCCCCC */
     171            /* It isn't exact, so PREC(b) > PREC(a) and the last
     172               PREC(b)-PREC(a) bits of b are not all zeros.
     173               Subtracting c from b will not have an effect on the rounding
     174               except in case of a midpoint in the round-to-nearest mode,
     175               when the even rounding was done away from zero instead of
     176               toward zero.
     177               In case of even rounding:
     178                 1.BBBBBBBBBBBBBx10
     179               -                     1.CCCCCCCCCCCC
     180               = 1.BBBBBBBBBBBBBx01  Rounded to PREC(b)
     181               = 1.BBBBBBBBBBBBBx    Nearest / Rounded to PREC(a)
     182               Set gives:
     183                 1.BBBBBBBBBBBBB0   if inexact == EVEN_INEX  (x == 0)
     184                 1.BBBBBBBBBBBBB1+1 if inexact == -EVEN_INEX (x == 1)
     185               which means we get a wrong rounded result if x == 1,
     186               i.e. inexact == MPFR_EVEN_INEX (for positive numbers). */
     187                 MPFR_LIKELY (inexact != MPFR_EVEN_INEX * MPFR_INT_SIGN (a)))
     188          {
     189            MPFR_LOG_MSG (("c small, case 2\n", 0));
     190            /* nothing to do */
     191          }
     192        else
     193          {
     194            /* We need to take the value preceding |a|. We can't use
     195               mpfr_nexttozero due to a possible out-of-range exponent.
     196               But this will allow us to have more specific code. */
     197            MPFR_LOG_MSG (("c small, case 3: correcting the value of a\n", 0));
     198            sh = (mpfr_prec_t) an * GMP_NUMB_BITS - aq;
     199            mpn_sub_1 (ap, ap, an, MPFR_LIMB_ONE << sh);
     200            if (MPFR_UNLIKELY (MPFR_LIMB_MSB (ap[an-1]) == 0))
     201              {
     202                exp_a --;
     203                /* The following is valid whether an = 1 or an > 1. */
     204                ap[an-1] |= MPFR_LIMB_HIGHBIT;
     205              }
     206            inexact = - MPFR_INT_SIGN (a);
     207          }
     208        /* The underflow case is possible only with UBF. The overflow case
     209           is also possible with normal FP due to rounding. */
     210        if (MPFR_UNLIKELY (exp_a > __gmpfr_emax))
     211          return mpfr_overflow (a, rnd_mode, MPFR_SIGN (a));
     212        if (MPFR_UNLIKELY (exp_a < __gmpfr_emin))
     213          {
     214            if (rnd_mode == MPFR_RNDN &&
     215                (exp_a < __gmpfr_emin - 1 ||
     216                 (inexact * MPFR_INT_SIGN (a) >= 0 && mpfr_powerof2_raw (a))))
     217              rnd_mode = MPFR_RNDZ;
     218            return mpfr_underflow (a, rnd_mode, MPFR_SIGN(a));
     219          }
     220        MPFR_SET_EXP (a, exp_a);
     221        MPFR_RET (inexact);
     222      }
     223  
     224    /* reserve a space to store b aligned with the result, i.e. shifted by
     225       (-cancel) % GMP_NUMB_BITS to the right */
     226    bn = MPFR_LIMB_SIZE (b);
     227    MPFR_UNSIGNED_MINUS_MODULO (shift_b, cancel);
     228    cancel1 = (cancel + shift_b) / GMP_NUMB_BITS;
     229  
     230    /* the high cancel1 limbs from b should not be taken into account */
     231    if (MPFR_UNLIKELY (shift_b == 0))
     232      {
     233        bp = MPFR_MANT(b); /* no need of an extra space */
     234        /* Ensure ap != bp */
     235        if (MPFR_UNLIKELY (ap == bp))
     236          {
     237            bp = MPFR_TMP_LIMBS_ALLOC (bn);
     238            MPN_COPY (bp, ap, bn);
     239          }
     240      }
     241    else
     242      {
     243        bp = MPFR_TMP_LIMBS_ALLOC (bn + 1);
     244        bp[0] = mpn_rshift (bp + 1, MPFR_MANT(b), bn++, shift_b);
     245      }
     246  
     247    /* reserve a space to store c aligned with the result, i.e. shifted by
     248       (diff_exp-cancel) % GMP_NUMB_BITS to the right */
     249    cn = MPFR_LIMB_SIZE (c);
     250    if (IS_POW2 (GMP_NUMB_BITS))
     251      shift_c = ((mpfr_uexp_t) diff_exp - cancel) % GMP_NUMB_BITS;
     252    else
     253      {
     254        /* The above operation does not work if diff_exp - cancel < 0. */
     255        shift_c = diff_exp - (cancel % GMP_NUMB_BITS);
     256        shift_c = (shift_c + GMP_NUMB_BITS) % GMP_NUMB_BITS;
     257      }
     258    MPFR_ASSERTD (shift_c >= 0 && shift_c < GMP_NUMB_BITS);
     259  
     260    if (MPFR_UNLIKELY(shift_c == 0))
     261      {
     262        cp = MPFR_MANT(c);
     263        /* Ensure ap != cp */
     264        if (ap == cp)
     265          {
     266            cp = MPFR_TMP_LIMBS_ALLOC (cn);
     267            MPN_COPY(cp, ap, cn);
     268          }
     269      }
     270   else
     271      {
     272        cp = MPFR_TMP_LIMBS_ALLOC (cn + 1);
     273        cp[0] = mpn_rshift (cp + 1, MPFR_MANT(c), cn++, shift_c);
     274      }
     275  
     276  #if 0
     277    MPFR_LOG_MSG (("rnd=%s shift_b=%d shift_c=%d diffexp=%" MPFR_EXP_FSPEC
     278                   "d\n", mpfr_print_rnd_mode (rnd_mode), shift_b, shift_c,
     279                   (mpfr_eexp_t) diff_exp));
     280  #endif
     281  
     282    MPFR_ASSERTD (ap != cp);
     283    MPFR_ASSERTD (bp != cp);
     284  
     285    /* here we have shift_c = (diff_exp - cancel) % GMP_NUMB_BITS,
     286          0 <= shift_c < GMP_NUMB_BITS
     287       thus we want cancel2 = ceil((cancel - diff_exp) / GMP_NUMB_BITS) */
     288  
     289    /* Possible optimization with a C99 compiler (i.e. well-defined
     290       integer division): if MPFR_PREC_MAX is reduced to
     291       ((mpfr_prec_t)((mpfr_uprec_t)(~(mpfr_uprec_t)0)>>1) - GMP_NUMB_BITS + 1)
     292       and diff_exp is of type mpfr_exp_t (no need for mpfr_uexp_t, since
     293       the sum or difference of 2 exponents must be representable, as used
     294       by the multiplication code), then the computation of cancel2 could
     295       be simplified to
     296         cancel2 = (cancel - (diff_exp - shift_c)) / GMP_NUMB_BITS;
     297       because cancel, diff_exp and shift_c are all non-negative and
     298       these variables are signed. */
     299  
     300    MPFR_ASSERTD (cancel >= 0);
     301    if (cancel >= diff_exp)
     302      /* Note that cancel is signed and will be converted to mpfr_uexp_t
     303         (type of diff_exp) in the expression below, so that this will
     304         work even if cancel is very large and diff_exp = 0. */
     305      cancel2 = (cancel - diff_exp + (GMP_NUMB_BITS - 1)) / GMP_NUMB_BITS;
     306    else
     307      cancel2 = - (mp_size_t) ((diff_exp - cancel) / GMP_NUMB_BITS);
     308    /* the high cancel2 limbs from b should not be taken into account */
     309  #if 0
     310    MPFR_LOG_MSG (("cancel=%Pd cancel1=%Pd cancel2=%Pd\n",
     311                   cancel, cancel1, cancel2));
     312  #endif
     313  
     314    /*               ap[an-1]        ap[0]
     315               <----------------+-----------|---->
     316               <----------PREC(a)----------><-sh->
     317   cancel1
     318   limbs        bp[bn-cancel1-1]
     319   <--...-----><----------------+-----------+----------->
     320    cancel2
     321    limbs       cp[cn-cancel2-1]                                    cancel2 >= 0
     322      <--...--><----------------+----------------+---------------->
     323                  (-cancel2)                                        cancel2 < 0
     324                     limbs      <----------------+---------------->
     325    */
     326  
     327    /* first part: put in ap[0..an-1] the value of high(b) - high(c),
     328       where high(b) consists of the high an+cancel1 limbs of b,
     329       and high(c) consists of the high an+cancel2 limbs of c.
     330     */
     331  
     332    /* copy high(b) into a */
     333    if (MPFR_LIKELY(an + (mp_size_t) cancel1 <= bn))
     334      /* a: <----------------+-----------|---->
     335         b: <-----------------------------------------> */
     336        MPN_COPY (ap, bp + bn - (an + cancel1), an);
     337    else
     338      /* a: <----------------+-----------|---->
     339         b: <-------------------------> */
     340      if ((mp_size_t) cancel1 < bn) /* otherwise b does not overlap with a */
     341        {
     342          MPN_ZERO (ap, an + cancel1 - bn);
     343          MPN_COPY (ap + (an + cancel1 - bn), bp, bn - cancel1);
     344        }
     345      else
     346        MPN_ZERO (ap, an);
     347  
     348    /* subtract high(c) */
     349    if (MPFR_LIKELY(an + cancel2 > 0)) /* otherwise c does not overlap with a */
     350      {
     351        mp_limb_t *ap2;
     352  
     353        if (cancel2 >= 0)
     354          {
     355            if (an + cancel2 <= cn)
     356              /* a: <----------------------------->
     357                 c: <-----------------------------------------> */
     358              mpn_sub_n (ap, ap, cp + cn - (an + cancel2), an);
     359            else
     360              /* a: <---------------------------->
     361                 c: <-------------------------> */
     362              {
     363                ap2 = ap + an + (cancel2 - cn);
     364                if (cn > cancel2)
     365                  mpn_sub_n (ap2, ap2, cp, cn - cancel2);
     366              }
     367          }
     368        else /* cancel2 < 0 */
     369          {
     370            mp_limb_t borrow;
     371  
     372            if (an + cancel2 <= cn)
     373              /* a: <----------------------------->
     374                 c: <-----------------------------> */
     375              borrow = mpn_sub_n (ap, ap, cp + cn - (an + cancel2),
     376                                  an + cancel2);
     377            else
     378              /* a: <---------------------------->
     379                 c: <----------------> */
     380              {
     381                ap2 = ap + an + cancel2 - cn;
     382                borrow = mpn_sub_n (ap2, ap2, cp, cn);
     383              }
     384            ap2 = ap + an + cancel2;
     385            mpn_sub_1 (ap2, ap2, -cancel2, borrow);
     386          }
     387      }
     388  
     389    /* now perform rounding */
     390    sh = (mpfr_prec_t) an * GMP_NUMB_BITS - aq;
     391    /* last unused bits from a */
     392    carry = ap[0] & MPFR_LIMB_MASK (sh);
     393    ap[0] -= carry;
     394  
     395    if (rnd_mode == MPFR_RNDF)
     396      {
     397        inexact = 0;
     398        /* truncating is always correct since -1 ulp < low(b) - low(c) < 1 ulp */
     399        goto truncate;
     400      }
     401    else if (rnd_mode == MPFR_RNDN)
     402      {
     403        if (MPFR_LIKELY(sh))
     404          {
     405            /* can decide except when carry = 2^(sh-1) [middle]
     406               or carry = 0 [truncate, but cannot decide inexact flag] */
     407            if (carry > (MPFR_LIMB_ONE << (sh - 1)))
     408              goto add_one_ulp;
     409            else if ((0 < carry) && (carry < (MPFR_LIMB_ONE << (sh - 1))))
     410              {
     411                inexact = -1; /* result if smaller than exact value */
     412                goto truncate;
     413              }
     414            /* now carry = 2^(sh-1), in which case cmp_low=2,
     415               or carry = 0, in which case cmp_low=0 */
     416            cmp_low = (carry == 0) ? 0 : 2;
     417          }
     418      }
     419    else /* directed rounding: set rnd_mode to RNDZ iff toward zero */
     420      {
     421        if (MPFR_IS_RNDUTEST_OR_RNDDNOTTEST(rnd_mode, MPFR_IS_NEG(a)))
     422          rnd_mode = MPFR_RNDZ;
     423  
     424        if (carry)
     425          {
     426            if (rnd_mode == MPFR_RNDZ)
     427              {
     428                inexact = -1;
     429                goto truncate;
     430              }
     431            else /* round away */
     432              goto add_one_ulp;
     433          }
     434      }
     435  
     436    /* we have to consider the low (bn - (an+cancel1)) limbs from b,
     437       and the (cn - (an+cancel2)) limbs from c. */
     438    bn -= an + cancel1;
     439    cn0 = cn;
     440    cn -= an + cancel2;
     441  
     442  #if 0
     443    MPFR_LOG_MSG (("last sh=%d bits from a are %Mu, bn=%Pd, cn=%Pd\n",
     444                   sh, carry, (mpfr_prec_t) bn, (mpfr_prec_t) cn));
     445  #endif
     446  
     447    /* for rounding to nearest, we couldn't conclude up to here in the following
     448       cases:
     449       1. sh = 0, then cmp_low=0: we can either truncate, subtract one ulp
     450          or add one ulp: -1 ulp < low(b)-low(c) < 1 ulp
     451       2. sh > 0 but the low sh bits from high(b)-high(c) equal 2^(sh-1):
     452          -0.5 ulp <= -1/2^sh < low(b)-low(c)-0.5 < 1/2^sh <= 0.5 ulp
     453          we can't decide the rounding, in that case cmp_low=2:
     454          either we truncate and flag=-1, or we add one ulp and flag=1
     455       3. the low sh>0 bits from high(b)-high(c) equal 0: we know we have to
     456          truncate but we can't decide the ternary value, here cmp_low=0:
     457          -0.5 ulp <= -1/2^sh < low(b)-low(c) < 1/2^sh <= 0.5 ulp
     458          we always truncate and inexact can be any of -1,0,1
     459    */
     460  
     461    /* note: here cn might exceed cn0, in which case we consider a zero limb */
     462    for (k = 0; (bn > 0) || (cn > 0); k = 1)
     463      {
     464        /* if cmp_low < 0, we know low(b) - low(c) < 0
     465           if cmp_low > 0, we know low(b) - low(c) > 0
     466              (more precisely if cmp_low = 2, low(b) - low(c) = 0.5 ulp so far)
     467           if cmp_low = 0, so far low(b) - low(c) = 0 */
     468  
     469        /* get next limbs */
     470        bb = (bn > 0) ? bp[--bn] : 0;
     471        if ((cn > 0) && (cn-- <= cn0))
     472          cc = cp[cn];
     473        else
     474          cc = 0;
     475  
     476        /* cmp_low compares low(b) and low(c) */
     477        if (cmp_low == 0) /* case 1 or 3 */
     478          cmp_low = (bb < cc) ? -2+k : (bb > cc) ? 1 : 0;
     479  
     480        /* Case 1 for k=0 splits into 7 subcases:
     481           1a: bb > cc + half
     482           1b: bb = cc + half
     483           1c: 0 < bb - cc < half
     484           1d: bb = cc
     485           1e: -half < bb - cc < 0
     486           1f: bb - cc = -half
     487           1g: bb - cc < -half
     488  
     489           Case 2 splits into 3 subcases:
     490           2a: bb > cc
     491           2b: bb = cc
     492           2c: bb < cc
     493  
     494           Case 3 splits into 3 subcases:
     495           3a: bb > cc
     496           3b: bb = cc
     497           3c: bb < cc
     498        */
     499  
     500        /* the case rounding to nearest with sh=0 is special since one couldn't
     501           subtract above 1/2 ulp in the trailing limb of the result */
     502        if (rnd_mode == MPFR_RNDN && sh == 0 && k == 0) /* case 1 for k=0 */
     503          {
     504            mp_limb_t half = MPFR_LIMB_HIGHBIT;
     505  
     506            /* add one ulp if bb > cc + half
     507               truncate if cc - half < bb < cc + half
     508               sub one ulp if bb < cc - half
     509            */
     510  
     511            if (cmp_low < 0) /* bb < cc: -1 ulp < low(b) - low(c) < 0,
     512                                cases 1e, 1f and 1g */
     513              {
     514                if (cc >= half)
     515                  cc -= half;
     516                else /* since bb < cc < half, bb+half < 2*half */
     517                  bb += half;
     518                /* now we have bb < cc + half:
     519                   we have to subtract one ulp if bb < cc,
     520                   and truncate if bb > cc */
     521              }
     522            else if (cmp_low >= 0) /* bb >= cc, cases 1a to 1d */
     523              {
     524                if (cc < half)
     525                  cc += half;
     526                else /* since bb >= cc >= half, bb - half >= 0 */
     527                  bb -= half;
     528                /* now we have bb > cc - half: we have to add one ulp if bb > cc,
     529                   and truncate if bb < cc */
     530                if (cmp_low > 0)
     531                  cmp_low = 2;
     532              }
     533          }
     534  
     535  #if 0
     536        MPFR_LOG_MSG (("k=%d bb=%Mu cc=%Mu cmp_low=%d\n", k, bb, cc, cmp_low));
     537  #endif
     538  
     539        if (cmp_low < 0) /* low(b) - low(c) < 0: either truncate or subtract
     540                            one ulp */
     541          {
     542            if (rnd_mode == MPFR_RNDZ)
     543              goto sub_one_ulp; /* set inexact=-1 */
     544            else if (rnd_mode != MPFR_RNDN) /* round away */
     545              {
     546                inexact = 1;
     547                goto truncate;
     548              }
     549            else /* round to nearest */
     550              {
     551                /* If cmp_low < 0 and bb > cc, then -0.5 ulp < low(b)-low(c) < 0,
     552                   whatever the value of sh.
     553                   If sh>0, then cmp_low < 0 implies that the initial neglected
     554                   sh bits were 0 (otherwise cmp_low=2 initially), thus the
     555                   weight of the new bits is less than 0.5 ulp too.
     556                   If k > 0 (and sh=0) this means that either the first neglected
     557                   limbs bb and cc were equal (thus cmp_low was 0 for k=0),
     558                   or we had bb - cc = -0.5 ulp or 0.5 ulp.
     559                   The last case is not possible here since we would have
     560                   cmp_low > 0 which is sticky.
     561                   In the first case (where we have cmp_low = -1), we truncate,
     562                   whereas in the 2nd case we have cmp_low = -2 and we subtract
     563                   one ulp.
     564                */
     565                if (bb > cc || sh > 0 || cmp_low == -1)
     566                  {  /* -0.5 ulp < low(b)-low(c) < 0,
     567                        bb > cc corresponds to cases 1e and 1f1
     568                        sh > 0 corresponds to cases 3c and 3b3
     569                        cmp_low = -1 corresponds to case 1d3 (also 3b3) */
     570                    inexact = 1;
     571                    goto truncate;
     572                  }
     573                else if (bb < cc) /* here sh = 0 and low(b)-low(c) < -0.5 ulp,
     574                                     this corresponds to cases 1g and 1f3 */
     575                  goto sub_one_ulp;
     576                /* the only case where we can't conclude is sh=0 and bb=cc,
     577                   i.e., we have low(b) - low(c) = -0.5 ulp (up to now), thus
     578                   we don't know if we must truncate or subtract one ulp.
     579                   Note: for sh=0 we can't have low(b) - low(c) = -0.5 ulp up to
     580                   now, since low(b) - low(c) > 1/2^sh */
     581              }
     582          }
     583        else if (cmp_low > 0) /* 0 < low(b) - low(c): either truncate or
     584                                 add one ulp */
     585          {
     586            if (rnd_mode == MPFR_RNDZ)
     587              {
     588                inexact = -1;
     589                goto truncate;
     590              }
     591            else if (rnd_mode != MPFR_RNDN) /* round away */
     592              goto add_one_ulp;
     593            else /* round to nearest */
     594              {
     595                if (bb > cc)
     596                  {
     597                    /* if sh=0, then bb>cc means that low(b)-low(c) > 0.5 ulp,
     598                       and similarly when cmp_low=2 */
     599                    if (cmp_low == 2) /* cases 1a, 1b1, 2a and 2b1 */
     600                      goto add_one_ulp;
     601                    /* sh > 0 and cmp_low > 0: this implies that the sh initial
     602                       neglected bits were 0, and the remaining low(b)-low(c)>0,
     603                       but its weight is less than 0.5 ulp */
     604                    else /* 0 < low(b) - low(c) < 0.5 ulp, this corresponds to
     605                            cases 3a, 1d1 and 3b1 */
     606                      {
     607                        inexact = -1;
     608                        goto truncate;
     609                      }
     610                  }
     611                else if (bb < cc) /* 0 < low(b) - low(c) < 0.5 ulp, cases 1c,
     612                                     1b3, 2b3 and 2c */
     613                  {
     614                    inexact = -1;
     615                    goto truncate;
     616                  }
     617                /* the only case where we can't conclude is bb=cc, i.e.,
     618                   low(b) - low(c) = 0.5 ulp (up to now), thus we don't know
     619                   if we must truncate or add one ulp. */
     620              }
     621          }
     622        /* after k=0, we cannot conclude in the following cases, we split them
     623           according to the values of bb and cc for k=1:
     624           1b. sh=0 and cmp_low = 1 and bb-cc = half [around 0.5 ulp]
     625               1b1. bb > cc: add one ulp, inex = 1
     626               1b2: bb = cc: cannot conclude
     627               1b3: bb < cc: truncate, inex = -1
     628           1d. sh=0 and cmp_low = 0 and bb-cc = 0 [around 0]
     629               1d1: bb > cc: truncate, inex = -1
     630               1d2: bb = cc: cannot conclude
     631               1d3: bb < cc: truncate, inex = +1
     632           1f. sh=0 and cmp_low = -1 and bb-cc = -half [around -0.5 ulp]
     633               1f1: bb > cc: truncate, inex = +1
     634               1f2: bb = cc: cannot conclude
     635               1f3: bb < cc: sub one ulp, inex = -1
     636           2b. sh > 0 and cmp_low = 2 and bb=cc [around 0.5 ulp]
     637               2b1. bb > cc: add one ulp, inex = 1
     638               2b2: bb = cc: cannot conclude
     639               2b3: bb < cc: truncate, inex = -1
     640           3b. sh > 0 and cmp_low = 0 [around 0]
     641               3b1. bb > cc: truncate, inex = -1
     642               3b2: bb = cc: cannot conclude
     643               3b3: bb < cc: truncate, inex = +1
     644        */
     645      }
     646  
     647    if ((rnd_mode == MPFR_RNDN) && cmp_low != 0)
     648      {
     649        /* even rounding rule */
     650        if ((ap[0] >> sh) & 1)
     651          {
     652            if (cmp_low < 0)
     653              goto sub_one_ulp;
     654            else
     655              goto add_one_ulp;
     656          }
     657        else
     658          inexact = (cmp_low > 0) ? -1 : 1;
     659      }
     660    else
     661      inexact = 0;
     662    goto truncate;
     663  
     664   sub_one_ulp: /* sub one unit in last place to a */
     665    mpn_sub_1 (ap, ap, an, MPFR_LIMB_ONE << sh);
     666    inexact = -1;
     667    goto end_of_sub;
     668  
     669   add_one_ulp: /* add one unit in last place to a */
     670    if (MPFR_UNLIKELY(mpn_add_1 (ap, ap, an, MPFR_LIMB_ONE << sh)))
     671      /* result is a power of 2: 11111111111111 + 1 = 1000000000000000 */
     672      {
     673        ap[an-1] = MPFR_LIMB_HIGHBIT;
     674        add_exp = 1;
     675      }
     676    inexact = 1; /* result larger than exact value */
     677  
     678   truncate:
     679    if (MPFR_UNLIKELY((ap[an-1] >> (GMP_NUMB_BITS - 1)) == 0))
     680      /* case 1 - epsilon */
     681      {
     682        ap[an-1] = MPFR_LIMB_HIGHBIT;
     683        add_exp = 1;
     684      }
     685  
     686   end_of_sub:
     687    /* we have to set MPFR_EXP(a) to MPFR_EXP(b) - cancel + add_exp, taking
     688       care of underflows/overflows in that computation, and of the allowed
     689       exponent range */
     690    MPFR_TMP_FREE (marker);
     691    if (MPFR_LIKELY(cancel))
     692      {
     693        cancel -= add_exp; /* OK: add_exp is an int equal to 0 or 1 */
     694        MPFR_ASSERTD (cancel >= 0);
     695        /* Detect an underflow case to avoid a possible integer overflow
     696           with UBF in the computation of exp_a. */
     697        if (MPFR_UNLIKELY (exp_b < __gmpfr_emin - 1))
     698          {
     699            if (rnd_mode == MPFR_RNDN)
     700              rnd_mode = MPFR_RNDZ;
     701            return mpfr_underflow (a, rnd_mode, MPFR_SIGN(a));
     702          }
     703        exp_a = exp_b - cancel;
     704        /* The following assertion corresponds to a limitation of the MPFR
     705           implementation. It may fail with a 32-bit ABI and huge precisions,
     706           but this is practically impossible with a 64-bit ABI. This kind
     707           of issue is not specific to this function. */
     708        MPFR_ASSERTN (exp_b != MPFR_EXP_MAX || exp_a > __gmpfr_emax);
     709        if (MPFR_UNLIKELY (exp_a < __gmpfr_emin))
     710          {
     711          underflow:
     712            if (rnd_mode == MPFR_RNDN &&
     713                (exp_a < __gmpfr_emin - 1 ||
     714                 (inexact >= 0 && mpfr_powerof2_raw (a))))
     715              rnd_mode = MPFR_RNDZ;
     716            return mpfr_underflow (a, rnd_mode, MPFR_SIGN(a));
     717          }
     718        /* We cannot have an overflow here, except for UBFs. Indeed:
     719           exp_a = exp_b - cancel + add_exp <= emax - 1 + 1 <= emax.
     720           For UBFs, we can have exp_b > emax. */
     721        if (exp_a > __gmpfr_emax)
     722          {
     723            MPFR_ASSERTD (exp_b > __gmpfr_emax);  /* since exp_b >= exp_a */
     724            return mpfr_overflow (a, rnd_mode, MPFR_SIGN (a));
     725          }
     726      }
     727    else /* cancel = 0: MPFR_EXP(a) <- MPFR_EXP(b) + add_exp */
     728      {
     729        /* in case cancel = 0, add_exp can still be 1, in case b is just
     730           below a power of two, c is very small, prec(a) < prec(b),
     731           and rnd=away or nearest */
     732        MPFR_ASSERTD (add_exp == 0 || add_exp == 1);
     733        /* Overflow iff exp_b + add_exp > __gmpfr_emax in Z, but we do
     734           a subtraction below to avoid a potential integer overflow in
     735           the case exp_b == MPFR_EXP_MAX. */
     736        if (MPFR_UNLIKELY (exp_b > __gmpfr_emax - add_exp))
     737          return mpfr_overflow (a, rnd_mode, MPFR_SIGN (a));
     738        exp_a = exp_b + add_exp;
     739        /* Warning: an underflow can happen for UBFs, for example when
     740           mpfr_add is called from mpfr_fmma or mpfr_fmms. */
     741        if (MPFR_UNLIKELY (exp_a < __gmpfr_emin))
     742          goto underflow;
     743        MPFR_ASSERTD (exp_a >= __gmpfr_emin);
     744      }
     745    MPFR_SET_EXP (a, exp_a);
     746    /* check that result is msb-normalized */
     747    MPFR_ASSERTD(ap[an-1] > ~ap[an-1]);
     748    MPFR_RET (inexact * MPFR_INT_SIGN (a));
     749  }