Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 702
tlands_ Avatar asked Jan 15 '13 22:01

tlands_


People also ask

What is the difference between integer division and division?

Java does integer division, which basically is the same as regular real division, but you throw away the remainder (or fraction). Thus, 7 / 3 is 2 with a remainder of 1. Throw away the remainder, and the result is 2. Integer division can come in very handy.

Why is integer division used?

Integer division ( // ) The integer division operation // is used when you want your answer to be in whole numbers. Since it is very common for the result of dividing two integers to be a decimal value, in Python3 integers, division rounds the result to the lower bound.

What is integer division in Python?

In Python, there are two kinds of division: integer division and float division. Integer Division. Integer division returns the floor of the division. That is, the values after the decimal point are discarded. It is written as '//' in Python 3.


4 Answers

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.

like image 171
Anirudh Ramanathan Avatar answered Oct 08 '22 06:10

Anirudh Ramanathan


  • 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.

like image 25
Pavel Anossov Avatar answered Oct 08 '22 05:10

Pavel Anossov


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

like image 36
Kabie Avatar answered Oct 08 '22 06:10

Kabie


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

like image 42
Dr. Cyanide Avatar answered Oct 08 '22 06:10

Dr. Cyanide