digitalmars.D - [Suggestion] floor-mod and floor-divide
- Stewart Gordon (41/41) Nov 29 2004 The C definitions of the / and % operators (which D mimics) have always
The C definitions of the / and % operators (which D mimics) have always
seemed to me to be not quite right in their handling of negative
operands. I've just been looking through my archives at this thread on
the issue:
http://google.com/groups?threadm=100320001202113511%25yahoo_com francis.uy
It would therefore be nice to invent a few new operators to do floor-mod
and floor-divide.
floor-mod is like the standard % operator (aka trunc-mod) except that
the result has the sign of the right operand. So, while trunc-mod does this
23 % 5 == 3
-23 % 5 == -3
23 % -5 == 3
-23 % -5 == -3
floor-mod would do this
23 %% 5 == 3
-23 %% 5 == 2
23 %% -5 == -2
-23 %% -5 == -3
and hence for a given right operand, be periodic over the entire number
line.
floor-divide is simply division always rounded down, rather than towards
zero.
23 /% 5 == 4
-23 /% 5 == -5
23 /% -5 == -5
-23 /% -5 == 4
(Maybe we can come up with a nicer-looking symbol for this operation....)
This satisfies the identity
(x /% y) * y + (x %% y) == x
just as the regular / and % do on integers.
Of course, for floating points, the same floor-mod operator would apply,
but I guess floor-divide isn't really applicable to the same extent. I
guess we could debate what /% (or whatever we decide to call it) should
mean on floating point types, or if it should be defined at all.
I don't know how many CPUs have built-in floor-mod and floor-divide
instructions, but they would be used if compiling for a machine with
these available. Otherwise, the compiler would generate code to
implement the operations in terms of available machine instructions.
Of course, the operators would be overloadable - maybe with opFloorMod
and opFloorDiv?
Stewart.
Nov 29 2004








Stewart Gordon <smjg_1998 yahoo.com>