• Subject: Re: Modulo operator produces incorrect results with negative operand(s).
• From: Rain Gloom <raingloom42@...>
• Date: Wed, 25 Jan 2017 01:19:43 +0000

> in any language
Did you look at the wikipedia page?
For instance in C++ it is implementation defined.
Also see C (pun unintended): http://stackoverflow.com/questions/11720656/modulo-operation-with-negative-numbers
IMHO C's definition makes the most sense mathematically.

As far as my first semester discrete math knowledge goes, this is the relevant equation:
ka + r = n && 0 <= r < n
where a and n are constants
The important part is 0 <= r. This makes the solution unique for signed integers too and is what C seems to be based on.

On Tue, Jan 24, 2017 at 11:47 PM, Milo Christiansen wrote:
Hmmm... So why does my programmers calculator, Go, _javascript_, etc, etc all return -3 in this case?

Personally I think it's a bug, as "2" is not the correct result for that _expression_ (in any language but Lua it seems).

On Tue, Jan 24, 2017 at 6:40 PM, Soni L. wrote:
On 24/01/17 09:21 PM, Milo Christiansen wrote:
In Lua 5.3 "-3%5 == 2", according to my programmers calculator and several other programing languages I tried this _expression_ in, the real result is -3.

On the other hand "5%-3 == 2", so maybe the result is correct, and the bug is simply reversed operands if one is negative?

I discovered this because I am adding tests (based on the official Lua tests) to my Go Lua VM, and one of the tests failed because the incorrect result is coded into the test.

First of all your modulo is not my modulo (or at least this was a thing back in C89... looks like it isn't in C99+).

Secondly, -3%5 == 2 because floor(-3/5) = -1, and (-1)*5+2 = -5+2 = -3.

https://www.microsoft.com/en-us/research/publication/division-and-modulus-for-computer-scientists/

http://hisham.hm/2015/04/18/a-small-practical-example-where-luas-behavior-is-better-than-cs/

https://github.com/sp614x/optifine/issues/288

etc. This is an endless argument.

Thirdly, in case you're still reading this for some unknown reason, RTFM always applies:

http://www.lua.org/manual/5.3/manual.html#3.4.1

"Modulo is defined as the remainder of a division that rounds the quotient towards minus infinity (floor division)."

--
Disclaimer: these emails may be made public at any given time, with or without reason. If you don't agree with this, DO NOT REPLY.

• References: