[Rd] Friday question: negative zero
Robin Hankin
r.hankin at noc.soton.ac.uk
Fri Dec 7 16:27:56 CET 2007
Hello everyone
On 1 Sep 2007, at 01:39, Duncan Murdoch wrote:
> The IEEE floating point standard allows for negative zero, but it's
> hard
> to know that you have one in R. One reliable test is to take the
> reciprocal. For example,
>
>> y <- 0
>> 1/y
> [1] Inf
>> y <- -y
>> 1/y
> [1] -Inf
>
> The other day I came across one in complex numbers, and it took me a
> while to figure out that negative zero was what was happening:
>
>> x <- complex(real = -1)
>> x
> [1] -1+0i
>> 1/x
> [1] -1+0i
>> x^(1/3)
> [1] 0.5+0.8660254i
>> (1/x)^(1/3)
> [1] 0.5-0.8660254i
>
> (The imaginary part of 1/x is negative zero.)
>
> As a Friday question: are there other ways to create and detect
> negative zero in R?
>
> And another somewhat more serious question: is the behaviour of
> negative zero consistent across platforms? (The calculations above
> were
> done in Windows in R-devel.)
>
I have been pondering branch cuts and branch points
for some functions which I am implementing.
In this area, it is very important to know whether one has
+0 or -0.
Take the log() function, where it is sometimes
very important to know whether one is just above the
imaginary axis or just below it:
(i). Small y
> y <- 1e-100
> log(-1 + 1i*y)
[1] 0+3.141593i
> y <- -y
> log(-1 + 1i*y)
[1] 0-3.141593i
(ii) Zero y.
> y <- 0
> log(-1 + 1i*y)
[1] 0+3.141593i
> y <- -y
> log(-1 + 1i*y)
[1] 0+3.141593i
>
[ie small imaginary jumps have a discontinuity, infinitesimal jumps
don't].
This behaviour is undesirable (IMO): one would like log (-1+0i) to be
different from log(-1-0i).
Tony Plate's example shows that
even though y<- 0 ; identical(y, -y) is TRUE, one has identical(1/
y, 1/(-y)) is FALSE,
so the sign is not discarded.
My complex function does have a branch cut that follows a portion of
the negative real axis
but the other cuts follow absurdly complicated implicit equations.
At this point
one needs the IEEE requirement that x=x == +0 [ie not -0] for any
real x; one then finds that
(s-t) and -(t-s) are numerically equal but not necessarily
indistinguishable.
One of my earlier questions involved branch cuts for the inverse trig
functions but
(IIRC) the patch I supplied only tested for the imaginary part being
>0; would it be
possible to include information about signed zero in these or other
functions?
> Duncan Murdoch
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
Robin Hankin
Uncertainty Analyst and Neutral Theorist,
National Oceanography Centre, Southampton
European Way, Southampton SO14 3ZH, UK
tel 023-8059-7743
More information about the R-devel
mailing list