Why is modulus different in different programming languages?

modulo, perl, tcl, vbscript

Solution

The wikipedia answer is fairly helpful here.

A short summary is that any integer can be defined as

a = qn + r

where all of these letters are integers, and

0 <= |r| < |n|.

Almost every programming language will require that (a/n) * n + (a%n) = a. So the definition of modulus will nearly always depend on the definition of integer division. There are two choices for integer division by negative numbers 2/-18 = 0 or 2/-18 = -1. Depending on which one is true for your language will usually change the % operator.

This is because 2 = (-1) * -18 + (-16) and 2 = 0 * -18 + 2.

For Perl the situation is complicated. The manual page says: "Note that when use integer is in scope, "%" gives you direct access to the modulus operator as implemented by your C compiler. This operator is not as well defined for negative operands, but it will execute faster. " So it can choose either option for Perl (like C) if use integer is in scope. If use integer is not in scope, the manual says " If $b is negative, then $a % $b is $a minus the smallest multiple of $b that is not less than $a (i.e. the result will be less than or equal to zero). "

Problem

Perl ``` print 2 % -18; ``` --> ``` -16 ``` Tcl ``` puts [expr {2 % -18}] ``` --> ``` -16 ``` but VBScript ``` wscript.echo 2 mod -18 ``` --> ``` 2 ``` Why the difference?

Original source