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

• Subject: Re: Problem with integer division in Lua 5.3.1
• From: Hartmut Henkel <hartmut_henkel@...>
• Date: Thu, 7 Jan 2016 22:23:34 +0100 (CET)

```On Sat, 28 Nov 2015, Roberto Ierusalimschy wrote:

> > I guess that clears up my misunderstanding, but I still regard an
> > operation called "integer division" which sometimes returns a result
> > of type "float" to be counterintuitive.
>
> As I explained a few messages ago, the operation is not called integer
> division. It is called floor division.

Just to report as a caveat, floor division hit me when quickly
converting a calendar date into a julian date by the formula (Fliegel,
van Flandern):

jd = d - 32075 + 1461 * (y + 4800 + (m - 14) / 12) / 4 + 367 * (m - 2 -
(m - 14) / 12 * 12) / 12 - 3 * ((y + 4900 + (m - 14) / 12) / 100) / 4;

This works flawlessly in Fortran and C, with integers. So i thought, in
Lua assure that variables are integers, then simply replace "/" by "//"
and the result would be fine. However it wasn't since Lua by "floor
division" handles negative divisions like (m - 14) / 12 differently from
the established Fortran and C methods. And it's rather tedious to
rewrite the simple formula above with Lua's integer facility. Fortran
seems to do do essentially this:

local idiv = function(a, b)
if (a >= 0) and (b >= 0) then return a // b
elseif (a >= 0) and (b < 0) then return -(a // (-b))
elseif (a < 0) and (b >= 0) then return -((-a) // b)
elseif (a < 0) and (b < 0) then return (-a) // (-b)
else assert(0)
end
end

More on such cases see also an interesting comparison between languages:
https://craftofcoding.files.wordpress.com/2013/07/cs_langjuliandates.pdf

(i would have liked Lua to do "//" like Fortran does integer division.)

Regards, Hartmut

```