digitalmars.D - Negative integer modulo/division
- bearophile (42/42) Mar 13 2012 When I translate Python code to D I sometimes need in D the different in...
- Steven Schveighoffer (7/9) Mar 14 2012 This might be more efficient (assuming z is your target for this):
-
Stewart Gordon
(7/9)
Mar 14 2012
- Caligo (1/1) Mar 14 2012 http://www.digitalmars.com/d/archives/digitalmars/D/Could_we_have_mod_in...
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
Mar 13 2012
On Tue, 13 Mar 2012 15:13:01 -0400, bearophile <bearophileHUGS lycos.com> wrote:For the modulus I sometimes use: ((x % y) + y) % yThis might be more efficient (assuming z is your target for this): if((z = x % y) < 0) z += y; Though I don't know, maybe the optimizer will reduce to this. Hard to do it in a single expression without using a function. -Steve
Mar 14 2012
On 14/03/2012 11:27, Steven Schveighoffer wrote: <snip>This might be more efficient (assuming z is your target for this): if((z = x % y) < 0) z += y;<snip> Depends on what you want it to do if y is negative. In such cases, what you've got here will return a value in (y, 0] if x is positive, or in (2*y, y] if x is negative. I too wish D gave the choice between floor-mod and trunc-mod. Stewart.
Mar 14 2012
http://www.digitalmars.com/d/archives/digitalmars/D/Could_we_have_mod_in_std.math_152977.html
Mar 14 2012