• Subject: Re: 5.1 rc mod giving -0 (never just 0)
• From: Mike Pall <mikelu-0601@...>
• Date: Mon, 23 Jan 2006 14:57:38 +0100

```Hi,

Roberto Ierusalimschy wrote:
> That example seems only a big coincidence to me.

I beg to differ.

> When we call
> math.fmod(2^i, 3), 2^i is computed and stored in memory, with only 54
> mantissa bits.

No. 2^i always needs just a single bit of precision in the
mantissa. Only the exponent changes.

This was the whole intention of the example: generating exact
numbers with huge exponent differences and taking their modulus
(and not getting an exact result). Dito for 2^i + 2^(i-1) etc.

> When Lua reads it back, there is no information available
> about the other bits. Lua cannot recreate them! Actually, several
> other similar cases fail with fmod. For instance:
>
> > for i = 50, 70 do io.write(math.fmod(2^i + 1, 3), " ") end; io.write"\n"
> 2 0 2 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1

This has nothing to do with math.fmod. _Generating_ the number
2^i+1 needs i+1 bits of precision. It is rounded to 2^i if i is
too large _before_ even touching fmod. The fmod results are
correct and exact.

The '%' results are not:

for i = 50, 70 do io.write((2^i + 1) % 3, " ") end; io.write"\n"
2 0 2 2 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536

But as I argued in my previous post, this is probably not a good
reason to change the behaviour of '%'.

Bye,
Mike

```