diff options
author | aiju <devnull@localhost> | 2016-08-28 12:00:25 +0200 |
---|---|---|
committer | aiju <devnull@localhost> | 2016-08-28 12:00:25 +0200 |
commit | 43bb71c8cca061a705689be27906207329c3b5f7 (patch) | |
tree | c6a8bae4021125c3a2f7edb94699964174382321 /sys/src/libmp | |
parent | 344ff48512561b57022c1f686005b3283da07cc5 (diff) |
mpdiv: negative divisor has to flip sign of quotient
Diffstat (limited to 'sys/src/libmp')
-rw-r--r-- | sys/src/libmp/port/mpdiv.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/src/libmp/port/mpdiv.c b/sys/src/libmp/port/mpdiv.c index 54b943862..8ee1d2ae5 100644 --- a/sys/src/libmp/port/mpdiv.c +++ b/sys/src/libmp/port/mpdiv.c @@ -24,9 +24,12 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) if(divisor->top == 1 && (divisor->p[0] & divisor->p[0]-1) == 0){ vlong r = (vlong)dividend->sign * (dividend->p[0] & divisor->p[0]-1); if(quotient != nil){ + sign = divisor->sign; for(s = 0; ((divisor->p[0] >> s) & 1) == 0; s++) ; mpright(dividend, s, quotient); + if(sign < 0 && quotient->top != 0) + quotient->sign ^= -2; } if(remainder != nil){ remainder->flags |= dividend->flags & MPtimesafe; |