summaryrefslogtreecommitdiff
path: root/sys/src/libmp
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-05-04 21:18:46 +0000
committeraiju <devnull@localhost>2018-05-04 21:18:46 +0000
commit8dc43a951c051422a63b4ed6298bf84c0896edc2 (patch)
treea85c131ac6630c834fd773d34dddc2a43cc3e191 /sys/src/libmp
parent454d26a0e4f91d03bb8f1f4f3f7dbe56d722deab (diff)
mpdiv: fix sign bug
Diffstat (limited to 'sys/src/libmp')
-rw-r--r--sys/src/libmp/port/mpdiv.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/src/libmp/port/mpdiv.c b/sys/src/libmp/port/mpdiv.c
index cfd673cfa..218f0232f 100644
--- a/sys/src/libmp/port/mpdiv.c
+++ b/sys/src/libmp/port/mpdiv.c
@@ -9,7 +9,7 @@
void
mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)
{
- int j, s, vn, sign;
+ int j, s, vn, sign, qsign, rsign;
mpdigit qd, *up, *vp, *qp;
mpint *u, *v, *t;
@@ -49,6 +49,13 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)
mpassign(mpzero, quotient);
return;
}
+
+ qsign = divisor->sign * dividend->sign;
+ rsign = dividend->sign;
+ if(quotient != nil)
+ quotient->sign = qsign;
+ if(remainder != nil)
+ remainder->sign = rsign;
// D1: shift until divisor, v, has hi bit set (needed to make trial
// divisor accurate)
@@ -121,14 +128,11 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)
if(qp != nil){
assert((quotient->flags & MPtimesafe) == 0);
mpnorm(quotient);
- if(dividend->sign != divisor->sign)
- quotient->sign = -1;
}
if(remainder != nil){
assert((remainder->flags & MPtimesafe) == 0);
mpright(u, s, remainder); // u is the remainder shifted
- remainder->sign = dividend->sign;
}
mpfree(t);