Basically, I need (-3) % 5 to be "2" instead of "-3". Python produces "2", but C++ produces "-3". Not sure how to produce "2" in C++. Thanks!
-
Keith raises an important point in a comment. Is your second operand always positive? If not, what should happen when it's negative?ysth– ysth2012-12-10 03:11:51 +00:00Commented Dec 10, 2012 at 3:11
6 Answers
Most easily: ((x % 5) + 5) % 5
1 Comment
5 but something else.The quick & dirty way is to write
((x % divisor) + divisor) % divisor
For example, ((-3 % 5) + 5) % 5 == 2. However this performs two separate divisions, and since divisions are one of the slowest arithmetic operations you might like one of these alternatives:
(1) General mod for integer or floating point
int mod(int x, int divisor)
{
int m = x % divisor;
return m + (m < 0 ? divisor : 0);
}
template<class Num> Num mod(Num x, Num divisor)
{
Num m = x % divisor;
return m + (m < 0 ? divisor : 0);
}
(2) Non-branching mod for 32-bit integers
int mod(int x, int divisor)
{
int m = x % divisor;
return m + ((m >> 31) & divisor);
}
All this assumes that the divisor is always positive.
1 Comment
std::modulus(x, divisor) might?You can add some multiple of 5 to the negative number first, to convert it to a positive number with the same value mod 5.
You can do that by taking the absolute of the negative number, adding whatever is needed to round it up to the next multiple of 5, and then add it to your negative number, and that should already be a number between 0 and 4.
Alternatively, simply do something like:
num = -2;
mod = 5;
if ( num < 0 ) {
result = mod - (abs(num) % mod);
}
and it'll work (explanation: mathemagic)
4 Comments
(x + (abs(x)+y-abs(x)%y)) % ymod. As Hailiang Zhang said, the code would fail if num%mod==0; I fixed it in an edit just now.I see a lot of suggestions for ((x % 5) + 5) % 5 But I'm getting the same result with just (X + 5) % 5
(X + divisor) % divisor.