Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C and Python - different behaviour of the modulo (%) operation

I have found that the same mod operation produces different results depending on what language is being used.

In Python:

-1 % 10 

produces 9

In C it produces -1 !

  1. Which one is the right modulo?
  2. How to make mod operation in C to be the same like in Python?
like image 361
psihodelia Avatar asked Dec 15 '09 13:12

psihodelia


People also ask

What is modulo operation in Python?

The % symbol in Python is called the Modulo Operator. It returns the remainder of dividing the left hand operand by right hand operand. It's used to get the remainder of a division problem. The modulo operator is considered an arithmetic operation, along with + , - , / , * , ** , // . The basic syntax is: a % b.

What is modulo operation in C?

The modulus operator is added in the arithmetic operators in C, and it works between two available operands. It divides the given numerator by the denominator to find a result. In simpler words, it produces a remainder for the integer division. Thus, the remainder is also always an integer number only.

Does Python have modulo operator?

Python supports a wide range of arithmetic operators that you can use when working with numbers in your code. One of these operators is the modulo operator ( % ), which returns the remainder of dividing two numbers.

How is modulo calculated in Python?

The Python modulo operator calculates the remainder of dividing two values. This operator is represented by the percentage sign (%). The syntax for the modulo operator is: number1 % number2. The first number is divided by the second then the remainder is returned.


2 Answers

  1. Both variants are correct, however in mathematics (number theory in particular), Python's modulo is most commonly used.
  2. In C, you do ((n % M) + M) % M to get the same result as in Python. E. g. ((-1 % 10) + 10) % 10. Note, how it still works for positive integers: ((17 % 10) + 10) % 10 == 17 % 10, as well as for both variants of C implementations (positive or negative remainder).
like image 113
Alex B Avatar answered Oct 13 '22 17:10

Alex B


Python has a "true" modulo operation, while C has a remainder operation.

It has a direct relation with how the negative integer division is handled, i.e. rounded towards 0 or minus infinite. Python rounds towards minus infinite and C(99) towards 0, but in both languages (n/m)*m + n%m == n, so the % operator must compensate in the correct direction.

Ada is more explicit and has both, as mod and rem.

like image 39
fortran Avatar answered Oct 13 '22 17:10

fortran