Integer division & modulo operation with negative operands in Python
Questions arise when I type in these expressions to Python 3.3.0
-10 // 3 # -4
-10 % 3 # 2
10 // -3 # -4
10 % -3 # -2
-10 // -3 # 3
It appears as though it takes the approximate floating point (-3.33)? and rounds down either way in integer division but in the modulo operation it does something totally different. It seems like it returns the remainder +/-1 and only switches the sign depending on where the negative operand is. I am utterly confused, even after looking over other answers on this site! I hope someone can clearly explain this too me! The book says hint: recall this magic formula a = (a//b)(b)+(a%b) but that doesn't seem to clear the water for me at all.
-Thanks in advance!
Edit: Those are just my personal assessments of what happens (above), I know, I'm completely off!
Solution 1:
The integer division there is just taking the floor of the number obtained at the end.
10/3 -> floor(3.33) -> 3
-10/3 -> floor(-3.33) -> -4
(Why it floors)
The modulo operation on the other hand is following the mathematical definition.
Solution 2:
- Magic formula:
a = (a // b) * b + (a % b)
a: -10
b: 3
a // b: -4
-
a % b: 2
Substitute in magic formula:
-10 = -4 * 3 + 2 = -12 + 2 = -10
a: 10
b: -3
a // b: -4
-
a % b: -2
In magic formula:
10 = -4 * -3 - 2 = 12 - 2 = 10
So the magic formula seems to be correct.
If you define a // b
as floor(a / b)
(which it is), a % b
should be a - floor(a / b) * b
. Let's see:
a: -10
b: 3
a % b = a - floor(a / b) * b = -10 - floor(-3.33) * 3 = -10 + 4 * 3 = 2
The fact that a // b
is always floored is pretty easy to remember (please read Cthulhu's first link, it's an explanation by the creator of Python). For negative a
in a % b
.. try to imagine a table of numbers that starts at 0
and has b
columns:
b = 3:
0 1 2
3 4 5
6 7 8
9 10 11
...
If a
is the number in a cell, a % b
would be the column number:
a a % b
_______________
0 1 2 0 1 2
3 4 5 0 1 2
6 7 8 0 1 2
9 10 11 0 1 2
Now extend the table back in the negatives:
a a % b
__________________
-12 -11 -10 0 1 2
-9 -8 -7 0 1 2
-6 -5 -4 0 1 2
-3 -2 -1 0 1 2
0 1 2 0 1 2
3 4 5 0 1 2
6 7 8 0 1 2
9 10 11 0 1 2
-10 % 3
would be 2
. Negative a
in a % b
would come up in these sorts of context. a % b
with negative b
doesn't come up much.
Solution 3:
A simple rule: for a % b = c
, if c
is not zero, then should have the same sign as b
.
And apply the magic formula:
10 % -3 = -2
=> 10 // -3 = (10 - (-2)) / (-3) = -4
-10 % 3 = 2
=> -10 // 3 = (-10 - 2) / 3 = -4
-10 % -3 = -1
=> -10 // -3 = (-10 - (-1)) / (-3) = 3
Solution 4:
OK, so I did some digging and I think that the problem isn't Python, but rather the Modulo function. I'm basing this answer off of http://mathforum.org/library/drmath/view/52343.html
10 % 3 Uses the highest multiple of 3 that is LESS THAN 10. In this case, 9. 10 - 9 = 1
-10 % 3 does the same thing. It's still looking for a multiple of 3 that is LESS THAN -10. In this case, -12. (-10) - (-12) = 2