summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-02-26 11:57:16 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-02-26 11:57:16 +0000
commitbced30d62979b555190bd3424d0441e6b8a64c21 (patch)
treefcd1291b4984b3a0159d48d6d9ee2c26e324213d
parent38db747a8c692c0bc7dff1e65d0ac13a599494b9 (diff)
downloadmpfr-bced30d62979b555190bd3424d0441e6b8a64c21.tar.gz
[src/sum.c] Completed the implementation (but there's still a bug).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/new-sum@9324 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--src/sum.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/sum.c b/src/sum.c
index eebda25cb..14283594a 100644
--- a/src/sum.c
+++ b/src/sum.c
@@ -798,6 +798,8 @@ sum_aux (mpfr_ptr sum, mpfr_ptr *const x, unsigned long n, mpfr_rnd_t rnd,
}
}
+ MPFR_ASSERTD (MPFR_LIMB_MSB (sump[sn-1]) != 0);
+
if (tmd == 0) /* no TMD */
{
if (inex && !carry) /* two's complement significand decreased */
@@ -879,7 +881,7 @@ sum_aux (mpfr_ptr sum, mpfr_ptr *const x, unsigned long n, mpfr_rnd_t rnd,
logn, cq, 0, NULL, NULL, &minexp, &maxexp);
if (cancel != 0)
- sst = (wp[ws-1] & MPFR_LIMB_HIGHBIT) == 0 ? 1 : -1;
+ sst = MPFR_LIMB_MSB (wp[ws-1]) == 0 ? 1 : -1;
else if (tmd == 1)
sst = 0;
else
@@ -921,17 +923,22 @@ sum_aux (mpfr_ptr sum, mpfr_ptr *const x, unsigned long n, mpfr_rnd_t rnd,
if (corr > 0 &&
MPFR_UNLIKELY (mpn_add_1 (sump, sump, sn, MPFR_LIMB_ONE << sd)))
{
- /* FIXME: Terminate the implementation, but first, add a
- testcase that will make the following assertion fail. */
- MPFR_ASSERTN (0);
+ sump[sn-1] = MPFR_LIMB_HIGHBIT;
+ e++;
}
- if (corr < 0 &&
- MPFR_UNLIKELY (mpn_sub_1 (sump, sump, sn, MPFR_LIMB_ONE << sd)))
+ if (corr < 0)
{
- /* FIXME: Terminate the implementation, but first, add a
- testcase that will make the following assertion fail. */
- MPFR_ASSERTN (0);
+ mpn_sub_1 (sump, sump, sn, MPFR_LIMB_ONE << sd);
+ if (MPFR_UNLIKELY (MPFR_LIMB_MSB (sump[sn-1]) == 0))
+ {
+ mp_size_t i;
+
+ sump[0] = MPFR_LIMB_MAX << sd;
+ for (i = 1; i < sn; i++)
+ sump[i] = MPFR_LIMB_MAX;
+ e--;
+ }
}
} /* Step 8 block */