mod of a negative number

L

Lars Enderin

gk skrev:
Int a = -5; Int b = -2;
System.out.println(a % b); // -1

how this is working ?
(How does this work?)
According to the definition of the % operator -1 is the rest after
taking out a multiple (-4) of -2 from -5.
 
P

Patricia Shanahan

gk said:
Int a = -5; Int b = -2;
System.out.println(a % b); // -1

how this is working ?

Strictly speaking, there is no "mod" operator in Java. % is defined to
be "remainder". It is the same as modulo for positive operands.

For integer operands, % is designed to maintain the identity:
(a/b)*b+(a%b) is equal to a.

Java integer division rounds towards zero, so -5/-2 is 2.

( (-5)/(-2) ) * (-2) + (-1) is -5.

See the JLS,
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#239829

Patricia
 
G

gk

Lars said:
gk skrev:
(How does this work?)
According to the definition of the % operator -1 is the rest after
taking out a multiple (-4) of -2 from -5.

true.....but -2<-1 , so we can divide it further theoretically ...is
not it ? hmm...but if we keep on dividing its going to be an infinite
loop.
 
R

Richard F.L.R.Snashall

Patricia said:
For integer operands, % is designed to maintain the identity:
(a/b)*b+(a%b) is equal to a.

Java integer division rounds towards zero, so -5/-2 is 2.

( (-5)/(-2) ) * (-2) + (-1) is -5.

A nitpick question: Is the division ( (8)/(3) ) also 2 in Java?
If so, why is this be called "rounding"?
 
L

Lee Weiner

A nitpick question: Is the division ( (8)/(3) ) also 2 in Java?
If so, why is this be called "rounding"?

It is not called rounding. It is called integer division.
 
P

Patricia Shanahan

Richard said:
A nitpick question: Is the division ( (8)/(3) ) also 2 in Java?
If so, why is this be called "rounding"?

I usually use "rounding" in the sense in which it is used in e.g. the
IEEE 754 standard, to mean modifying the infinitely precise result of a
calculation to fit in the destination's format.

In that usage, it includes rounding directed rounding, such as rounding
towards zero, as well as the various flavors of round to nearest. Some
people use "truncation" when the rounding is towards either zero or
negative infinity.

Patricia
 
G

gk

Joined
May 13, 2010
Messages
1
Reaction score
0
Patricia Shanahan said:
gk wrote:
> Int a = -5; Int b = -2;
> System.out.println(a % b); // -1
>
> how this is working ?
>


Strictly speaking, there is no "mod" operator in Java. % is defined to
be "remainder". It is the same as modulo for positive operands.

For integer operands, % is designed to maintain the identity:
(a/b)*b+(a%b) is equal to a.

Java integer division rounds towards zero, so -5/-2 is 2.

( (-5)/(-2) ) * (-2) + (-1) is -5.

See the JLS,

Patricia
Illuminating post - thanks.

The JLS example was also illuminating:

5 % 3 produces 2
5 % (-3) produces 2
(-5) % 3 produces -2
(-5) % (-3) produces -2

This got me thinking...

Suppose a and b are integers.

We have two special cases:
  1. If b == 0, then a % b is NaN (JLS specification).
  2. If nonzero b divides a, then a % b == 0 (In particular, every nonzero b divides 0, so 0 % b == 0).
Which leaves us with nonzero b does not divide a.

Then

a % b > 0 if a > 0

and

a % b < 0 if a < 0.

Hence, if nonzero b does not divide a, then the sign of a % b equals the sign of a.

You can see this formally by noting:

(a / b) * b + a % b == a

implies

a % b == a - (a / b) * b

and if nonzero b does not divide a, then

Math.abs((a / b) * b) < Math.abs(a),

due integer division rounding towards zero.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top