lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


The way Lua does it may not be 100% wrong, but it is not the way an experienced programmer will expect it to work. IMHO this adds an unnecessary little speed bump in the way of good workflow.

Wait, what am I saying, this is a language that thinks 1-based indexing is a good thing, forget I said anything. /s

On Tue, Jan 24, 2017 at 6:47 PM, Milo Christiansen <milo.christiansen@gmail.com> 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. <fakedme@gmail.com> 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.

See also:

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.