• Subject: Re: Negative zero denominator
• From: William Ahern <william@...>
• Date: Fri, 21 Aug 2015 11:44:53 -0700

```On Fri, Aug 21, 2015 at 09:03:19AM -0300, Soni L. wrote:
>
>
> On 21/08/15 08:54 AM, Philipp Janda wrote:
> >Am 21.08.2015 um 13:43 schröbte Liam Devine:
> >>Lua 5.3 returns positive infinity for a negative zero denominator, which
> >>is a change from 5.1, 5.2 and LuaJIT. Unless I am missing something,
> >>this does not seem to be fixed in 5.3.1 or listed on the bug page[1].
> >>
> >>liam@dmail00:~\$ lua53
> >>Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> >>>return 1/-0
> >>inf
> >>>os.exit()
> >
> >There is no negative zero integer. Try `1/-0.0`.
> >
> >Philipp
> >
> >
> >
> https://en.wikipedia.org/wiki/Ones'_complement
>

In C, at least, where signed magnitude and ones' complement representations
are used for signed integer, negative 0 is permitted to be a trap
representation.

... Which of these applies is implementation-defined, as is whether the
value with sign bit 1 and all value bits zero (for the first two),
or with sign bit and all value bits 1 (for ones' complement), is a
trap representation or a normal value. In the case of sign and
magnitude and ones' complement, if this representation is a normal
value it is called a negative zero. C11 (N1570) 6.2.6.2p2.

In other words, just because the machine uses ones' complement doesn't mean
there's a negative 0. Even more importantly, even where negative 0 exists
arithmetic expressions only produce negative 0 when one of the operands is

If the implementation supports negative zeros, they shall be
generated only by:

— the &, |, ^, ~, <<, and >> operators with operands that produce
such a value;

— the +, -, *, /, and % operators where one operand is a negative
zero and the result is zero;

— compound assignment operators based on the above cases.

It is unspecified whether these cases actually generate a negative
zero or a normal zero, and whether a negative zero becomes a normal
zero when stored in an object.

C11 (N1570) 6.2.6.2p3.

So you can't produce it without either using a literal "-0" in your code, or
perhaps via conversion from a floating point value.

I post this only because your comment piqued my interest. I didn't know any
of this beforehand, I swear ;)

```