diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2000-12-05 13:24:43 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2000-12-05 13:24:43 +0000 |
commit | 939e65b7f72db362ece161794c867631ce5554e3 (patch) | |
tree | fb98aa7246a928274dc5e33390d2439f5f8a8044 /cmp.c | |
parent | 49945294d135d2944f5184caf5b8b2a703f30c03 (diff) | |
download | mpfr-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.c | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -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; } |