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!
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 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
The modulo operation on the other hand is following the mathematical definition.
Method 2
- Magic formula:
a = (a // b) * b + (a % b) a: -10b: 3a // b: -4-
a % b: 2Substitute in magic formula:
-10 = -4 * 3 + 2 = -12 + 2 = -10 -
a: 10 b: -3a // b: -4-
a % b: -2In 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: -10b: 3a % 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.
Method 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
Method 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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0