diff options
author | aiju <devnull@localhost> | 2018-05-04 21:18:46 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2018-05-04 21:18:46 +0000 |
commit | 8dc43a951c051422a63b4ed6298bf84c0896edc2 (patch) | |
tree | a85c131ac6630c834fd773d34dddc2a43cc3e191 /sys/src/libmp | |
parent | 454d26a0e4f91d03bb8f1f4f3f7dbe56d722deab (diff) |
mpdiv: fix sign bug
Diffstat (limited to 'sys/src/libmp')
-rw-r--r-- | sys/src/libmp/port/mpdiv.c | 12 |
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); |