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