Re: [Rd] Friday question: negative zero

From: Petr Savicky <savicky_at_cs.cas.cz>
Date: Sun, 02 Sep 2007 07:29:13 +0200

On Sat, Sep 01, 2007 at 05:22:26PM -0600, Tony Plate wrote:
> One place where I've been caught by -ve zeros is with unit tests. If
> identical(-0, 0) returns FALSE, and the object storage doesn't preserve
> -ve zeros, that can lead to test failures that are tricky to debug.
>
> However, it doesn't look like that is too much a problem in the current
> incarnation of R, at least running under Linux:
>
> * identical(-0, 0) returns TRUE
> * save/load preserves -ve zero
> * however dump() does NOT preserve -ve zero
>
> The fact that identical(-0,0) is TRUE means that we have the situation
> where it is possible that identical(x, y) != identical(f(x), f(y)). I
> don't know if this is a real problem anywhere.

I think, it can be a problem, but the formulation should be modified, since identical(x, y) != identical(f(x), f(y)) may occur even if everything is OK. For example,
  identical(1, -1) != identical(abs(1), abs(-1)).

The problem is that it is possible to have   identical(x, y) & ! identical(f(x), f(y))

However, this it is not a problem of R. This is a problem of IEEE 754 specification, which implies that

    x == y & f(x) != f(y)
is possible.

> > x <- 0
> > y <- -0
> > 1/x
> [1] Inf
> > 1/y
> [1] -Inf
> > identical(x, y)
> [1] TRUE
> > ### there exists f,x,y such that identical(x, y) != identical(f(x), f(y))
> > identical(1/x, 1/y)
> [1] FALSE
> > ### save/load preserves -ve zero
> > save("y", file="y.rda")
> > remove("y")
> > load("y.rda")
> > 1/y
> [1] -Inf
> > identical(x, y)
> [1] TRUE
> > ### dump does not preserve -ve zero
> > dump("y", file="y.R")
> > remove("y")
> > source("y.R")
> > y
> [1] 0
> > 1/y
> [1] Inf

It works the same in my installations. Moreover, "save" preserves -ve zeros even with ascii=TRUE, which is more similar to dump. This may be seen in the output, where indeed "-0" may occur as a text. So, this is another way to detect negative zero. A simpler version is sprintf:
  sprintf("%f",0) # [1] "0.000000"
  sprintf("%f",-0) # [1] "-0.000000"

Petr Savicky.
===



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sun 02 Sep 2007 - 05:32:53 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sun 02 Sep 2007 - 19:40:12 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.