66

Why is X % 0 an invalid expression?

I always thought X % 0 should equal X. Since you can't divide by zero, shouldn't the answer naturally be the remainder, X (everything left over)?

4
  • @xanatos Me too. I gave the other +1 to balance the other -1... I suspect it's highly duplicated, but then it should have been voted to be closed. Commented Sep 10, 2011 at 7:42
  • 1
    (from a now-deleted link-only answer of Dean Inada) Knuth et al. in Concreate Mathematics give the same definition as yours. (PDF, page 82, definition 3.22.) Commented Aug 25, 2014 at 1:09
  • 2
    Very poor conceptualization and reasoning here. Since the quotient from dividing by 0 is undefined, so must the remainder be. And it's very odd to have "always thought" something that you surely were never taught or told. Commented Oct 14, 2017 at 4:14
  • This question is similar to: Is there a language that defines remainder of integer division by zero to equal the dividend? Why is it not common to define it that way?. If you believe it’s different, please edit the question, make it clear how it’s different and/or how the answers on that question are not helpful for your problem. Commented Sep 26, 2024 at 12:07

7 Answers 7

50

The C++ Standard(2003) says in §5.6/4,

[...] If the second operand of / or % is zero the behavior is undefined; [...]

That is, following expressions invoke undefined-behavior(UB):

X / 0; //UB
X % 0; //UB

Note also that -5 % 2 is NOT equal to -(5 % 2) (as Petar seems to suggest in his comment to his answer). It's implementation-defined. The spec says (§5.6/4),

[...] If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined.

Sign up to request clarification or add additional context in comments.

6 Comments

I'd probably lean towards "partly implementation defined", the sign is implementation defined but wouldn't the value be fixed once the sign is chosen? But that's just nit picking.
Is it possible to crash program using mod zero or just result is unknown ?
@Zaffy: Since mod zero invokes undefined behavior (UB), so yes, it is possible to crash your program using mod zero, but it is not guranteed to crash your program. Program crash is just one out of the million possibilities of UB.
This was linked as a duplicate, and I think this post should be made up-to-date: It's no longer implementation-defined, but a/b + a%b is a for all a and b where the quotient is defined (the behaviour is undefined otherwise). The change happened in C99 and C++11 (maybe already in C++03 with TR1, don't know). Would be nice, if you could also tag the question as C, as they are the same in this respect (it was a C question which duplicated this).
And in case you wonder why C99 and C11 differ (not sure about C++), I remember this to be a defect in C99: INT_MIN % -1 was defined, although it throws an exception on many platforms. In C11, x%y is defined only if x/y is, and it was never safe to assume INT_MIN % -1 to evaluate.
|
16

This answer is not for the mathematician. This answer attempts to give motivation (at the cost of mathematical precision).

Mathematicians: See here.

Programmers: Remember that division by 0 is undefined. Therefore, mod, which relies on division, is also undefined.


This represents division for positive X and D; it's made up of the integral part and fractional part:

(X / D) =   integer    +  fraction
        = floor(X / D) + (X % D) / D

Rearranging, you get:

(X % D) = D * (X / D) - D * floor(X / D)

Substituting 0 for D:

(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)

Since division by 0 is undefined:

(X % 0) = 0 * undefined - 0 * floor(undefined)
        = undefined - undefined
        = undefined

2 Comments

Why can't you just substitute 0 for the outer D in the second equation making it (X % 0) = 0 * (w/e) and just call it zero?
@YatharthAgarwal Because 0 * (w/e) isn't always 0. If w/e is a real number (which includes integers), then it's 0. If not, regular multiplication doesn't give us an answer, i.e., the answer is undefined.
4

X % D is by definition a number 0 <= R < D, such that there exists Q so that

X = D*Q + R

So if D = 0, no such number can exists (because 0 <= R < 0)

4 Comments

That's not true, AFAIK the sign of x % y is implementation defined if x < 0. -5 % 2 happens to be -1 on my system.
X = D*Q + R works for any Q when D = 0, with X = R as the OP wanted. It's the 0 <= R < 0 that's impossible to satisfy. Your answer seems to imply that it's the other way round, though I might just be reading it wrong.
@Petar: No. -5 % 2 is NOT -(5 % 2) in fact. It's implementation-defined. The spec says, If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined
The above is true for mathematics modulus. But CPUs and C compiler implementations often return R that have the same sign as X, so -5 % 2 = -(5 % 2) is true. OTOH Python will return the "true" mathematics modulus so the above wouldn't be true anymore stackoverflow.com/questions/1907565/…
2

I think because to get the remainder of X % 0 you need to first calculate X / 0 which yields infinity, and trying to calculate the remainder of infinity is not really possible.

However, the best solution in line with your thinking would be to do something like this

REMAIN = Y ? X % Y : X

Comments

1

Another way that might be conceptually easy to understand the issue:

Ignoring for the moment the issue of argument sign, a % b could easily be re-written as a - ((a / b) * b). The expression a / b is undefined if b is zero, so in that case the overall expression must be too.

In the end, modulus is effectively a divisive operation, so if a / b is undefined, it's not unreasonable to expect a % b to be as well.

Comments

1

X % Y gives a result in the integer [ 0, Y ) range. X % 0 would have to give a result greater or equal to zero, and less than zero.

2 Comments

That's not true, AFAIK the sign of x % y is implementation defined if x < 0. -5 % 2 happens to be -1 on my system.
True you, the quirks of mod. But alas it is enough to illustrate why one cannot mod by zero.
-1

Erm... I think the mathematical rationalisations here are a bit iffy given that |x mod y| <= |y| and it therefore makes perfect sense to use the squeeze theorem to ‘patch it up’ by defining x mod 0 = 0.

It's true that on your approach to y = 0 you'll encounter more and more discontinuities, infinitely many in fact, but they get smaller and smaller and the question of whether it's continuous at y = 0 is different from whether it should have a value there anyway.

The only true answer here is ‘because the standard says so’.

1 Comment

This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.