From w.northcott at unsw.edu.au  Wed Jan  5 20:26:54 2005
From: w.northcott at unsw.edu.au (Bill Northcott)
Date: Wed Jan  5 20:27:21 2005
Subject: [Rd] Standalone Mathlib, C++ and ISNAN()
In-Reply-To: <Pine.A41.4.61b.0501050759060.100170@homer05.u.washington.edu>
References: <77B2A8C4-5ED8-11D9-97FA-000393D3D676@unsw.edu.au>
	<Pine.A41.4.61b.0501050759060.100170@homer05.u.washington.edu>
Message-ID: <C2214FA4-5F4F-11D9-97FA-000393D3D676@unsw.edu.au>

On 06/01/2005, at 3:09 AM, Thomas Lumley wrote:
>>
>> If building against a full R library, one might possible use R_IsNaN 
>> instead but this function is not included in libRmath v2.0 and the 
>> function R_IsNaNorNA which was used in libRmath v1.9 no longer exists
>>
>
> Yes, but in your standalone C or C++ code you can just use isnan() 
> from math.h directly.

As I explained in the last message:
>> In R2.0 ISNAN() is defined using isnan thus (isnan(x)!=0).  isnan() 
>> is in math.h and this works perfectly for C code.  However, in C++ 
>> the header cmath (included by iostream and others) undefs isnan().  
>> So on platforms for which isnan() is a macro, the code breaks at 
>> compile time with 'isnan() undeclared'.
>
> The reason that R doesn't do that is twofold.  In the past we tried to 
> support computers that didn't use IEEE 754 arithmetic, which meant 
> that isnan might not exist.  Also, IIRC we found that isnan() doesn't 
> use 1 for TRUE on all platforms -- sometimes it uses -1 or something 
> else -- and code had assumed 1.  That's why the strange-looking 
> isnan(x)!=0 is there.

There is nothing strange about this.  The spec for isnan says it is 
zero if and only if the object is not a nan.  Any other value indicates 
a nan.
>
> It would be worth noting somewhere that ISNAN breaks when some C++ 
> headers are included on Mac OS X, and I will do that.

The point I am trying to make is that it is not just MacOS X.   The g++ 
cmath header undefs isnan so it will break with gcc on any platform 
which has a macro for isnan.  HP-UX is one.
Also the C++ gurus insist that the ISO C++ standard requires cmath to 
zap the macros, which implies it will happen with other ISO compliant 
C++ compilers.

There is a function R_IsNaN.  I have not checked, but I presume it just 
calls isnan.  This should work because it will not be zapped by the C++ 
headers, because it is in a different (C?) compilation unit.  However, 
it is currently not part of the standalone Rmath.h/libRmath.  It would 
be good if it could be included in the standalone build as was its 
predecessor R_IsNaNorNA.

That way, we would have a workaround by using R_IsNaN.

Bill Northcott


[Rd] Standalone Mathlib, C++ and ISNAN()
Bill Northcott