[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  

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  

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  

> 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