summaryrefslogtreecommitdiff
path: root/cmp.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2000-12-05 13:24:43 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2000-12-05 13:24:43 +0000
commit939e65b7f72db362ece161794c867631ce5554e3 (patch)
treefb98aa7246a928274dc5e33390d2439f5f8a8044 /cmp.c
parent49945294d135d2944f5184caf5b8b2a703f30c03 (diff)
downloadmpfr-939e65b7f72db362ece161794c867631ce5554e3.tar.gz
fixed bug in mpfr_cmp2 when return value is k*BITS_PER_MP_LIMB-1
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@833 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'cmp.c')
-rw-r--r--cmp.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/cmp.c b/cmp.c
index f4f04d1ad..970ecd542 100644
--- a/cmp.c
+++ b/cmp.c
@@ -127,8 +127,8 @@ mpfr_cmp2(b, c)
if (d)
{
cc = bp[bn--];
- if (d<BITS_PER_MP_LIMB)
- cc -= cp[cn]>>d;
+ if (d < BITS_PER_MP_LIMB)
+ cc -= cp[cn] >> d;
}
else { /* d=0 */
while (bn>=0 && cn>=0 && (cc=(bp[bn--]-cp[cn--]))==0) {
@@ -148,7 +148,7 @@ mpfr_cmp2(b, c)
count_leading_zeros(u, cc);
k += u;
- if (cc != ((mp_limb_t)1<<(BITS_PER_MP_LIMB-u-1))) return k;
+ if (cc != ((mp_limb_t) 1 << (BITS_PER_MP_LIMB - u - 1))) return k;
/* now cc is an exact power of two */
if (cc != 1)
@@ -192,14 +192,16 @@ mpfr_cmp2(b, c)
or k+z+1 if low(b) < low(c) */
if (d > BITS_PER_MP_LIMB) { return k; }
- while (bn >= 0)
+ while (bn >= 0) /* the next limb of b to be considered is b[bn] */
{
+ /* for c we have to consider the low d bits of c[cn]
+ and the high (BITS_PER_MP_LIMB-d) bits of c[cn-1] */
if (cn < 0) return k;
if (d)
{
- u = cp[cn--] << (BITS_PER_MP_LIMB - d);
- if (cn >= 0) u+=(cp[cn]>>d);
+ u = cp[cn--] << (BITS_PER_MP_LIMB - d);
+ if (cn >= 0) u += cp[cn] >> d;
}
else u = cp[cn--];
@@ -208,8 +210,12 @@ mpfr_cmp2(b, c)
bp[bn--] < cp[cn--] : borrow
*/
if ((cc = bp[bn--]) != u) {
- if (cc>u) return k;
- else { count_leading_zeros(u, cc-u); return k + 1 + z + u; }
+ if (cc > u) return k;
+ else {
+ count_leading_zeros(u, cc-u);
+ z += u + 1;
+ if (u + 1 < BITS_PER_MP_LIMB) return k + z;
+ }
}
else z += BITS_PER_MP_LIMB;
}