autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: doc isinf isnan function portability


From: Paul Eggert
Subject: Re: doc isinf isnan function portability
Date: Thu, 12 Aug 2004 14:58:56 -0700
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

Kevin Ryde <address@hidden> writes:

>         * doc/autoconf.texi (Function Portability): Add notes on isinf and
>         isnan as macros versus functions.
>
> This arose in guile, where Andreas Vögele found AC_CHECK_FUNCS for
> isinf and isnan insufficient on HP-UX.  We ended up with an
> AC_LINK_IFELSE that included <math.h>, which is what I've tried to
> alude to in the words below.

Thanks for mentionin the problem.  I installed the following instead:
it sidesteps the portability mess that guile got its feet stuck into,
and it produces more accurate results for "long double".  Hope it
helps with guile...

2004-08-12  Paul Eggert  <address@hidden>

        * doc/autoconf.texi (Function Portability): Document isinf and
        and isnan.  From a suggestion by Kevin Ryde.

--- doc/autoconf.texi   3 Aug 2004 22:06:10 -0000       1.826
+++ doc/autoconf.texi   12 Aug 2004 21:51:48 -0000      1.827
@@ -3670,6 +3670,58 @@ tradition of it returning @code{int}.
 The ISO C99 standard says a call @code{free(NULL)} does nothing, but
 some old systems don't support this (eg.@: NextStep).
 
address@hidden @code{isinf}
address@hidden @code{isnan}
address@hidden @fuindex isinf
address@hidden @fuindex isnan
address@hidden @code{isinf}
address@hidden @code{isnan}
+The ISO C99 standard specifies that @code{isinf} and @code{isnan} are
+macros.  On some systems just macros are available (e.g., HP-UX), on
+some systems both macros and functions (e.g., glibc 2.3.2), and on some
+systems only functions (e.g., IRIX 6 and Solaris 9).  In some cases
+these functions are declared in nonstandard headers like
address@hidden<sunmath.h>} and defined in non-default libraries like
address@hidden or @option{-lsunmath}.
+
+The C99 @code{isinf} and @code{isnan} macros work correctly with
address@hidden double} arguments, but pre-C99 systems that use functions
+typically assume @code{double} arguments.  On such a system,
address@hidden incorrectly returns true for a finite @code{long double}
+argument that is outside the range of @code{double}.
+
+To work around this porting mess, you can use code like the following.
+
address@hidden
+#include <math.h>
+
+#ifndef isnan
+# define isnan(x) \
+    (sizeof (x) == sizeof (long double) ? isnan_ld (x) \
+     : sizeof (x) == sizeof (double) ? isnan_d (x) \
+     : isnan_f (x))
+static inline int isnan_f  (float       x) @{ return x != x; @}
+static inline int isnan_d  (double      x) @{ return x != x; @}
+static inline int isnan_ld (long double x) @{ return x != x; @}
+#endif
+
+#ifndef isinf
+# define isinf(x) \
+    (sizeof (x) == sizeof (long double) ? isinf_ld (x) \
+     : sizeof (x) == sizeof (double) ? isinf_d (x) \
+     : isinf_f (x))
+static inline int isinf_f  (float       x) @{ return isnan (x - x); @}
+static inline int isinf_d  (double      x) @{ return isnan (x - x); @}
+static inline int isinf_ld (long double x) @{ return isnan (x - x); @}
+#endif
address@hidden example
+
+Use @code{AC_C_INLINE} (@pxref{C Compiler}) so that this code works on
+compilers that lack the @code{inline} keyword.  Some optimizing
+compilers mishandle these definitions, but systems with that bug
+typically have missing or broken @code{isnan} functions anyway, so it's
+probably not worth worrying about.
+
 @item @code{malloc}
 @c @fuindex malloc
 @prindex @code{malloc}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]