diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2000-06-16 08:28:40 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2000-06-16 08:28:40 +0000 |
commit | b8afb60500796f62da1ea8fb5703fa4562e2babb (patch) | |
tree | a2d58d9a2766fd6c9e232637af3ee3b0b53989d6 /sub.c | |
parent | 4dd4dfc29429845e292d15c100018ce9291b4737 (diff) | |
download | mpfr-b8afb60500796f62da1ea8fb5703fa4562e2babb.tar.gz |
fixed another bug
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@624 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'sub.c')
-rw-r--r-- | sub.c | 17 |
1 files changed, 7 insertions, 10 deletions
@@ -327,20 +327,17 @@ mpfr_sub1(a, b, c, rnd_mode, diff_exp) cc = *ap & ((ONE<<sh)-1); *ap &= ~cc; /* truncate last bits */ cc -= ONE<<(sh-1); - while ((cc==0 || cc==-1) && k!=0 && kc!=0) { + while ((cc==0 || cc==-1) && k!=0 && kc>=0) { kc--; - cc -= mpn_sub_1(&c2, bp+(--k), 1, (cp[kc]>>dif) + - (cp[kc+1]<<(mp_bits_per_limb-dif))); + if (kc>=0) cc -= mpn_sub_1(&c2, bp+(--k), 1, (cp[kc]>>dif) + + (cp[kc+1]<<(mp_bits_per_limb-dif))); + else /* don't forget last right chunck from c */ + cc -= mpn_sub_1(&c2, bp+(--k), 1, + cp[0]<<(mp_bits_per_limb-dif)); if (cc==0 || (~cc==0 && ~c2==0)) cc=c2; } - if ((cc==0 || (~cc==0)) && kc==0) { - /* it still remains cp[0]<<(mp_bits_per_limb-dif) */ - if (k!=0) cc -= mpn_sub_1(&c2, bp+(--k), 1, - cp[0]<<(mp_bits_per_limb-dif)); - else if (cp[0]<<(mp_bits_per_limb-dif)) cc--; - } if ((long)cc>0) goto add_one_ulp; - else if ((long)cc<-1) goto end_of_sub; /* carry can be at most 1 */ + else if ((long)cc<0) goto end_of_sub; /* carry can be at most 1 */ else if (kc==0) { while (k && cc==0) cc=bp[--k]; if (cc || (*ap & (ONE<<sh))) goto add_one_ulp; |