Negative integer modulo/division

bearophile bearophileHUGS at lycos.com
Tue Mar 13 12:13:01 PDT 2012


When I translate Python code to D I sometimes need in D the different integer division and the different modulo operation of Python3. They give different results with the operands are negative:

Python2 code:

for x in xrange(-10, 1):
    print x, "", x % 3, "", x // 3


Python output:

-10  2  -4
-9  0  -3
-8  1  -3
-7  2  -3
-6  0  -2
-5  1  -2
-4  2  -2
-3  0  -1
-2  1  -1
-1  2  -1
0  0  0



D code:

import std.stdio;
void main() {
    foreach (x; -10 .. 1)
        writeln(x, "  ", x % 3, "  ", x / 3);
}


D output:

-10  -1  -3
-9  0  -3
-8  -2  -2
-7  -1  -2
-6  0  -2
-5  -2  -1
-4  -1  -1
-3  0  -1
-2  -2  0
-1  -1  0
0  0  0



For the modulus I sometimes use:
((x % y) + y) % y

So I suggest to add both simple functions to Phobos, possibly as efficient compiler intrinsics (this means inlined asm).


It seems Ada and CommonLisp have functions for both needs:
http://en.wikipedia.org/wiki/Modulo_operation

I have also seen this Wikipedia page doesn't tell (it has a "?") about what % does on floating point values.

Bye,
bearophile


More information about the Digitalmars-d mailing list