Peter Dalgaard BSA p.dalgaard@biostat.ku.dk
20 Jul 1999 11:50:01 +0200

Thomas Vogels <tov@infiniti.ece.cmu.edu> writes:

> "Peter" == Peter Dalgaard BSA <p.dalgaard@biostat.ku.dk> writes:
> Peter> Something pretty close to the following should work:
> Peter> 
> Peter> #define R_FINITE(x) ({double y = x; \
> Peter> *((int *) &y) & 0x7ff00000 != 0x7ff00000})
> Peter> 
> Peter> #define ISNAN(x) ({double y = x; \
> Peter> *((int *) &y) & 0x7ff00000 == 0x7ff00000 && \
> Peter> (*((int *) &y) & 0x7fffffff != 0x7ff00000 || *((int *) &y + 1) != 0)}
> Pretty but not close ;-)  Sorry, but I can't compile these macros.  I
> see your point for the local var, but cc and gcc choke on it.

I take it that you fixed the missing ')' in ISNAN? Too bad. Perhaps it
can work without the local "y"? I put it in just to catch cases where
x might be in a register so that you cannot take its address.

> I've looked into /usr/include/fp.h which is included for AIX
> platforms.  (Its version is 1.9)  There are defines for FINITE,
> IS_INF, IS_NAN.  Can we use them?  Roll our own finite()?

That would make very good sense. The code would probably have to go in
an "#if aix" type clause, but so would my suggestion.

> Does it make sense for configure to check, not only whether finite
> exists but also whether it's broken?

It certainly would.
> BTW, if you step thru EncodeReal you see that !R_FINITE(x) if false
> for 1/0 (i.e. 1/0 is not detected as not finite).

Yes. If you look at R_FINITE, you'll see that the logic is
essentially: If HAVE_FINITE use finite() else assume non-IEEE and only
check for the internal NA code. So if either finite() misbehaves or
doesn't exist, that will happen.

> Here is first the C code to show what's working what's not.  (I picked
> your stuff and added the calls to the macros.)  This is followed by
> the output when compiled with cc and gcc.  I'm having major headaches
> here with the -D_XOPEN_SOURCE_EXTENDED (details follow).  Maybe we can
> dump finite in favor of FINITE?
> Are  my assumptions about the return values are correct?

They look fine. Would seem that only gcc without the -D_XOPENetc is
having trouble with finite() -- why? could that be a gcc bug?

What happens with isnan(), is that as buggy as finite()?

It looks quite feasible simply to put

#ifdef _AIX
	#define R_FINITE(x) FINITE(X)
	#define R_ISNAN(x)  IS_NAN(X)

or something like it in Arith.h
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch