[Rd] NA_real_ <op> NaN -> NA or NaN, should we care?

William Dunlap wdunlap at tibco.com
Thu Apr 30 19:51:43 CEST 2009


On Linux when I compile R 2.10.0(devel) (src/main/arithmetic.c in
particular)
with gcc 3.4.5 using the flags -g -O2 I get noncommutative behavior when
adding NA and NaN:
   > NA_real_ + NaN
   [1] NaN
   > NaN + NA_real_
   [1] NA
If I compile src/main/arithmetic.c without optimization (just -g)
then both of those return NA.

On Windows, using a precompiled R 2.8.1 from CRAN I get
NA for both answers.

On Linux, after compiling src/main/arithmetic.c with -g -O2 the bit
patterns for NA_real_ and as.numeric(NA) are different:
   > my_numeric_NA <- as.numeric(NA)
   > writeBin(my_numeric_NA, ptmp<-pipe("od -x", open="wb"));close(ptmp)
   0000000 07a2 0000 0000 7ff8
   0000010
   > writeBin(NA_real_, ptmp<-pipe("od -x", open="wb"));close(ptmp)
   0000000 07a2 0000 0000 7ff0
   0000010 
On Linux, after compiling with -g the bit patterns for NA_real_
and as.numeric(NA) are identical.
   > my_numeric_NA <- as.numeric(NA)
   > writeBin(my_numeric_NA, ptmp<-pipe("od -x", open="wb"));close(ptmp)
   0000000 07a2 0000 0000 7ff8
   0000010
   > writeBin(NA_real_, ptmp<-pipe("od -x", open="wb"));close(ptmp)
   0000000 07a2 0000 0000 7ff8
   0000010

On Windows, using precompiled R 2.8.1 and cygwin/bin/od, both of those
gave the 7ff8 version.

Is this confounding of NA and NaN of concern or does R not promise to
keep NA and NaN distinct? 

I haven't followed all the macros, but it looks like arithmetic.c just
does
    result[i]=x[i]+y[i]
and lets the compiler/floating point unit decide what to do when x[i]
and y[i]
are different NaN values (NA is a NaN value).  I haven't looked at the C
code
for the initialization of NA_real_.  Adding explicit tests for NA-ness
in the
binary operators (as S+ does) adds a fairly significant cost.

Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com 



More information about the R-devel mailing list