summaryrefslogtreecommitdiff
path: root/sub.c
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2001-08-22 16:01:28 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2001-08-22 16:01:28 +0000
commit9e9ed1db3e9c1f80ccc5f822da4c83f0b459f0fc (patch)
treec1acacb474e320f2ac9558541f270e6b571f6343 /sub.c
parent0eced588b113d6e9523d6baaee8ce280dfea5add (diff)
downloadmpfr-9e9ed1db3e9c1f80ccc5f822da4c83f0b459f0fc.tar.gz
Bugs fixed (particular cases).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1128 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'sub.c')
-rw-r--r--sub.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/sub.c b/sub.c
index fc0f843f0..de7e97427 100644
--- a/sub.c
+++ b/sub.c
@@ -150,21 +150,20 @@ mpfr_sub1 (a, b, c, rnd_mode, diff_exp)
if (c_is_not_zero)
{ /* c is not zero */
/* check whether mant(c)=1/2 or not */
- cc = *cp - (ONE << (BITS_PER_MP_LIMB - 1));
- if (cc == 0)
- {
- bp = cp + (MPFR_PREC(c) - 1) / BITS_PER_MP_LIMB;
- while (cp < bp && cc == 0)
- cc = *++cp;
- }
- if (cc || (ap[an-1] & ONE << sh))
+
+ mp_limb_t *cp2 = cp + (cn-1); /* highest limb */
+
+ cc = *cp2 - MP_LIMB_T_HIGHBIT;
+ while (cc == 0 && cp2 > cp) cc = *--cp2;
+
+ if (cc || ((ap[0] >> sh) & ONE))
goto sub_one_ulp;
/* mant(c)>1/2 or mant(c) = 1/2: subtract 1 iff lsb(a)=1 */
}
}
else if (ap[an-1] == 0)
{ /* case b=2^n */
- ap[an-1] = ONE << (BITS_PER_MP_LIMB - 1);
+ ap[an-1] = MP_LIMB_T_HIGHBIT;
MPFR_EXP(a)++;
}
}