diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-08-22 16:01:28 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-08-22 16:01:28 +0000 |
commit | 9e9ed1db3e9c1f80ccc5f822da4c83f0b459f0fc (patch) | |
tree | c1acacb474e320f2ac9558541f270e6b571f6343 /sub.c | |
parent | 0eced588b113d6e9523d6baaee8ce280dfea5add (diff) | |
download | mpfr-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.c | 17 |
1 files changed, 8 insertions, 9 deletions
@@ -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)++; } } |