X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fmath.in.h;h=3ffb1774b455096df464d63bdb8ef3efa50b8bf3;hb=c2318e88599d84748f3537b54646913f0af0eb20;hp=c40ae9c59221237eb2704801d6e02d15010246c9;hpb=81ba90be88fe306baebf8055bf0ea095ee61ffe4;p=gnulib.git diff --git a/lib/math.in.h b/lib/math.in.h index c40ae9c59..3ffb1774b 100644 --- a/lib/math.in.h +++ b/lib/math.in.h @@ -1,6 +1,6 @@ /* A GNU-like . - Copyright (C) 2002-2003, 2007 Free Software Foundation, Inc. + Copyright (C) 2002-2003, 2007-2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,6 +17,8 @@ #ifndef _GL_MATH_H +@PRAGMA_SYSTEM_HEADER@ + /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT@ @NEXT_MATH_H@ @@ -32,6 +34,34 @@ extern "C" { #endif +/* POSIX allows platforms that don't support NAN. But all major + machines in the past 15 years have supported something close to + IEEE NaN, so we define this unconditionally. We also must define + it on platforms like Solaris 10, where NAN is present but defined + as a function pointer rather than a floating point constant. */ +#if !defined NAN || @REPLACE_NAN@ +# undef NAN + /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ +# ifdef __DECC +static float +_NaN () +{ + static float zero = 0.0f; + return zero / zero; +} +# define NAN (_NaN()) +# else +# define NAN (0.0f / 0.0f) +# endif +#endif + +/* Solaris 10 defines HUGE_VAL, but as a function pointer rather + than a floating point constant. */ +#if @REPLACE_HUGE_VAL@ +# undef HUGE_VAL +# define HUGE_VAL (1.0 / 0.0) +#endif + /* Write x as x = mantissa * 2^exp where @@ -218,7 +248,7 @@ extern long double logl (long double x); #if @GNULIB_ROUNDF@ -# if !@HAVE_DECL_ROUNDF@ +# if @REPLACE_ROUNDF@ # undef roundf # define roundf rpl_roundf extern float roundf (float x); @@ -232,7 +262,7 @@ extern float roundf (float x); #endif #if @GNULIB_ROUND@ -# if !@HAVE_DECL_ROUND@ +# if @REPLACE_ROUND@ # undef round # define round rpl_round extern double round (double x); @@ -246,7 +276,7 @@ extern double round (double x); #endif #if @GNULIB_ROUNDL@ -# if !@HAVE_DECL_ROUNDL@ +# if @REPLACE_ROUNDL@ # undef roundl # define roundl rpl_roundl extern long double roundl (long double x); @@ -323,7 +353,8 @@ extern double trunc (double x); #endif #if @GNULIB_TRUNCL@ -# if !@HAVE_DECL_TRUNCL@ +# if @REPLACE_TRUNCL@ +# undef truncl # define truncl rpl_truncl extern long double truncl (long double x); # endif @@ -337,7 +368,7 @@ extern long double truncl (long double x); #if @GNULIB_ISFINITE@ -# if !@HAVE_DECL_ISFINITE@ +# if @REPLACE_ISFINITE@ extern int gl_isfinitef (float x); extern int gl_isfinited (double x); extern int gl_isfinitel (long double x); @@ -352,7 +383,66 @@ extern int gl_isfinitel (long double x); #endif +#if @GNULIB_ISINF@ +# if @REPLACE_ISINF@ +extern int gl_isinff (float x); +extern int gl_isinfd (double x); +extern int gl_isinfl (long double x); +# undef isinf +# define isinf(x) \ + (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \ + sizeof (x) == sizeof (double) ? gl_isinfd (x) : \ + gl_isinff (x)) +# endif +#elif defined GNULIB_POSIXCHECK + /* How to override a macro? */ +#endif + + +#if @GNULIB_ISNAN@ +# if @REPLACE_ISNAN@ +/* We can't just use the isnanf macro (e.g.) as exposed by + isnanf.h (e.g.) here, because those may end up being macros + that recursively expand back to isnan. So use the gnulib + replacements for them directly. */ +# if HAVE_ISNANF && __GNUC__ >= 4 +# define gl_isnan_f(x) __builtin_isnan ((float)(x)) +# else +extern int rpl_isnanf (float x); +# define gl_isnan_f(x) rpl_isnanf (x) +# endif +# if HAVE_ISNAND && __GNUC__ >= 4 +# define gl_isnan_d(x) __builtin_isnan ((double)(x)) +# else +extern int rpl_isnand (double x); +# define gl_isnan_d(x) rpl_isnand (x) +# endif +# if HAVE_ISNANL && __GNUC__ >= 4 +# define gl_isnan_l(x) __builtin_isnan ((long double)(x)) +# else +extern int rpl_isnanl (long double x); +# define gl_isnan_l(x) rpl_isnanl (x) +# endif +# undef isnan +# define isnan(x) \ + (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \ + sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \ + gl_isnan_f (x)) +# endif +#elif defined GNULIB_POSIXCHECK + /* How to override a macro? */ +#endif + + #if @GNULIB_SIGNBIT@ +# if @REPLACE_SIGNBIT_USING_GCC@ +# undef signbit + /* GCC 4.0 and newer provides three built-ins for signbit. */ +# define signbit(x) \ + (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \ + sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \ + __builtin_signbitf (x)) +# endif # if @REPLACE_SIGNBIT@ # undef signbit extern int gl_signbitf (float arg);