summaryrefslogtreecommitdiff
path: root/sub.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2000-06-16 08:28:40 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2000-06-16 08:28:40 +0000
commitb8afb60500796f62da1ea8fb5703fa4562e2babb (patch)
treea2d58d9a2766fd6c9e232637af3ee3b0b53989d6 /sub.c
parent4dd4dfc29429845e292d15c100018ce9291b4737 (diff)
downloadmpfr-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.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/sub.c b/sub.c
index 7f07e27d1..5580e9b00 100644
--- a/sub.c
+++ b/sub.c
@@ -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;