summaryrefslogtreecommitdiff
path: root/py/smallint.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-10-22 23:05:50 +0100
committerDamien George <damien.p.george@gmail.com>2014-10-22 23:05:50 +0100
commite72be1b999a3337f74a8e5a8f61705666f834d2b (patch)
tree6275c2b8eb01130f987df7ebe414f6690b971bec /py/smallint.c
parent5fc42a6c9733bd8f165be7fa8d70fb614ae8de53 (diff)
py: Fix smallint modulo with negative arguments.
Addresses issue #927.
Diffstat (limited to 'py/smallint.c')
-rw-r--r--py/smallint.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/py/smallint.c b/py/smallint.c
index 804514799..3a06c40a9 100644
--- a/py/smallint.c
+++ b/py/smallint.c
@@ -57,23 +57,23 @@ bool mp_small_int_mul_overflow(mp_int_t x, mp_int_t y) {
}
mp_int_t mp_small_int_modulo(mp_int_t dividend, mp_int_t divisor) {
- mp_int_t lsign = (dividend >= 0) ? 1 :-1;
- mp_int_t rsign = (divisor >= 0) ? 1 :-1;
+ // Python specs require that mod has same sign as second operand
dividend %= divisor;
- if (lsign != rsign) {
+ if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) {
dividend += divisor;
}
return dividend;
}
mp_int_t mp_small_int_floor_divide(mp_int_t num, mp_int_t denom) {
- mp_int_t lsign = num > 0 ? 1 : -1;
- mp_int_t rsign = denom > 0 ? 1 : -1;
- if (lsign == -1) {num *= -1;}
- if (rsign == -1) {denom *= -1;}
- if (lsign != rsign){
- return - ( num + denom - 1) / denom;
+ if (num >= 0) {
+ if (denom < 0) {
+ num += -denom - 1;
+ }
} else {
- return num / denom;
+ if (denom >= 0) {
+ num += -denom + 1;
+ }
}
+ return num / denom;
}