How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers c c

How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers


First of all I'd like to note that you cannot even rely on the fact that (-1) % 8 == -1. the only thing you can rely on is that (x / y) * y + ( x % y) == x. However whether or not the remainder is negative is implementation-defined.

Now why use templates here? An overload for ints and longs would do.

int mod (int a, int b){   int ret = a % b;   if(ret < 0)     ret+=b;   return ret;}

and now you can call it like mod(-1,8) and it will appear to be 7.

Edit: I found a bug in my code. It won't work if b is negative. So I think this is better:

int mod (int a, int b){   if(b < 0) //you can check for b == 0 separately and do what you want     return -mod(-a, -b);      int ret = a % b;   if(ret < 0)     ret+=b;   return ret;}

Reference: C++03 paragraph 5.6 clause 4:

The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined; otherwise (a/b)*b + a%b is equal to a. If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined.


Here is a C function that handles positive OR negative integer OR fractional values for BOTH OPERANDS

#include <math.h>float mod(float a, float N) {return a - N*floor(a/N);} //return in range [0, N)

This is surely the most elegant solution from a mathematical standpoint. However, I'm not sure if it is robust in handling integers. Sometimes floating point errors creep in when converting int -> fp -> int.

I am using this code for non-int s, and a separate function for int.

NOTE: need to trap N = 0!

Tester code:

#include <math.h>#include <stdio.h>float mod(float a, float N){    float ret = a - N * floor (a / N);    printf("%f.1 mod %f.1 = %f.1 \n", a, N, ret);    return ret;}int main (char* argc, char** argv){    printf ("fmodf(-10.2, 2.0) = %f.1  == FAIL! \n\n", fmodf(-10.2, 2.0));    float x;    x = mod(10.2f, 2.0f);    x = mod(10.2f, -2.0f);    x = mod(-10.2f, 2.0f);    x = mod(-10.2f, -2.0f);    return 0;}

(Note: You can compile and run it straight out of CodePad: http://codepad.org/UOgEqAMA)

Output:

fmodf(-10.2, 2.0) = -0.20 == FAIL!

10.2 mod 2.0 = 0.2
10.2 mod -2.0 = -1.8
-10.2 mod 2.0 = 1.8
-10.2 mod -2.0 = -0.2


I have just noticed that Bjarne Stroustrup labels % as the remainder operator, not the modulo operator.

I would bet that this is its formal name in the ANSI C & C++ specifications, and that abuse of terminology has crept in. Does anyone know this for a fact?

But if this is the case then C's fmodf() function (and probably others) are very misleading. they should be labelled fremf(), etc