By Dasaru


2011-09-10 06:58:09 8 Comments

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)?

7 comments

@Mateen Ulhaq 2011-09-10 07:06:48

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

@Yatharth Agarwal 2013-11-29 05:52:00

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?

@ollj 2017-05-29 14:01:30

you can evade the "divivion by 0" case of (A%B) for its type float identity mod(a,b) for float(B)=b=0.0 , that is undefined, or defined differently between any 2 implementations, to avoid logic errors (hard crashes) in favor of arithmetic errors...

by computing mod([a*b],[b])==b*(a-floor(a))
INSTREAD OF
computing mod([a],[b])

where [a*b]==your x-axis, over time [b] == the maximum of the seesaw curve (that will never be reached) == the first derivative of the seesaw function

https://www.shadertoy.com/view/MslfW8

@Mac 2011-09-10 09:04:45

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.

@Nawaz 2011-09-10 07:10:24

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.

@mu is too short 2011-09-10 07:51:45

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.

@Zaffy 2012-10-02 11:29:55

Is it possible to crash program using mod zero or just result is unknown ?

@Nawaz 2012-10-02 11:46:19

@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.

@mafso 2014-08-16 17:33:45

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).

@mafso 2014-08-16 17:39:15

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.

@Masood Lapeh 2019-02-24 14:12:50

My program crashed silently without any error message, and that was the problem.

@Billy Moon 2011-09-10 07:21:05

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

@Petar Ivanov 2011-09-10 07:00:45

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)

@mu is too short 2011-09-10 07:08:14

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.

@hammar 2011-09-10 07:11:16

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 Ivanov 2011-09-10 07:12:54

-5 % 2 = -(5 % 2) in fact.

@Nawaz 2011-09-10 07:38:24

@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

@phuclv 2013-10-29 01:11:21

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/…

@K-ballo 2011-09-10 07:00:04

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.

@mu is too short 2011-09-10 07:07:33

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.

@K-ballo 2011-09-10 07:18:48

True you, the quirks of mod. But alas it is enough to illustrate why one cannot mod by zero.

Related Questions

Sponsored Content

17 Answered Questions

[SOLVED] What's the syntax for mod in java

  • 2008-09-18 05:17:15
  • Bob
  • 908526 View
  • 226 Score
  • 17 Answer
  • Tags:   java modulo

18 Answered Questions

[SOLVED] Why should C++ programmers minimize use of 'new'?

23 Answered Questions

[SOLVED] Why can't variables be declared in a switch statement?

5 Answered Questions

[SOLVED] Undefined behavior and sequence points

24 Answered Questions

[SOLVED] Image Processing: Algorithm Improvement for 'Coca-Cola Can' Recognition

4 Answered Questions

21 Answered Questions

[SOLVED] Do you use NULL or 0 (zero) for pointers in C++?

  • 2008-10-07 02:15:05
  • camh
  • 128696 View
  • 186 Score
  • 21 Answer
  • Tags:   c++ null

Sponsored Content