X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmath_.h;h=588642c1f3ca58b534555b2c6228b615b6ffc66d;hb=5d0b385594bc914e6233988bfb6bc1b92a2184b5;hp=be56101d88f076b89c4e1c14ba8447c7d8e73fbf;hpb=69baaaa76e1b186a9a1d9b43ce1083a6a0700bfc;p=gnulib.git diff --git a/lib/math_.h b/lib/math_.h index be56101d8..588642c1f 100644 --- a/lib/math_.h +++ b/lib/math_.h @@ -16,10 +16,16 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#if defined __DECC && __DECC_VER >= 60000000 +# include_next +#endif + #ifndef _GL_MATH_H #define _GL_MATH_H -#include @ABSOLUTE_MATH_H@ +#if !(defined __DECC && __DECC_VER >= 60000000) +# include @ABSOLUTE_MATH_H@ +#endif /* The definition of GL_LINK_WARNING is copied here. */ @@ -30,6 +36,27 @@ extern "C" { #endif +/* Write x as + x = mantissa * 2^exp + where + If x finite and nonzero: 0.5 <= |mantissa| < 1.0. + If x is zero: mantissa = x, exp = 0. + If x is infinite or NaN: mantissa = x, exp unspecified. + Store exp and return mantissa. */ +#if @GNULIB_FREXP@ +# if @REPLACE_FREXP@ +# define frexp rpl_frexp +extern double frexp (double x, int *exp); +# endif +#elif defined GNULIB_POSIXCHECK +# undef frexp +# define frexp(x,e) \ + (GL_LINK_WARNING ("frexp is unportable - " \ + "use gnulib module frexp for portability"), \ + frexp (x, e)) +#endif + + #if @GNULIB_MATHL@ || !@HAVE_DECL_ACOSL@ extern long double acosl (long double x); #endif @@ -107,25 +134,39 @@ extern long double floorl (long double x); floorl (x)) #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_FREXPL@ +/* Write x as + x = mantissa * 2^exp + where + If x finite and nonzero: 0.5 <= |mantissa| < 1.0. + If x is zero: mantissa = x, exp = 0. + If x is infinite or NaN: mantissa = x, exp unspecified. + Store exp and return mantissa. */ +#if @GNULIB_FREXPL@ && @REPLACE_FREXPL@ +# define frexpl rpl_frexpl +#endif +#if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || !@HAVE_DECL_FREXPL@ extern long double frexpl (long double x, int *exp); #endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +#if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK # undef frexpl # define frexpl(x,e) \ (GL_LINK_WARNING ("frexpl is unportable - " \ - "use gnulib module mathl for portability"), \ + "use gnulib module frexpl for portability"), \ frexpl (x, e)) #endif -#if @GNULIB_MATHL@ || !@HAVE_DECL_LDEXPL@ +/* Return x * 2^exp. */ +#if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@ +# define ldexpl rpl_ldexpl +#endif +#if (@GNULIB_LDEXPL@ && @REPLACE_LDEXPL@) || !@HAVE_DECL_LDEXPL@ extern long double ldexpl (long double x, int exp); #endif -#if !@GNULIB_MATHL@ && defined GNULIB_POSIXCHECK +#if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK # undef ldexpl # define ldexpl(x,e) \ (GL_LINK_WARNING ("ldexpl is unportable - " \ - "use gnulib module mathl for portability"), \ + "use gnulib module ldexpl for portability"), \ ldexpl (x, e)) #endif @@ -174,6 +215,51 @@ extern long double tanl (long double x); #endif +#if @GNULIB_SIGNBIT@ +# if @REPLACE_SIGNBIT@ +# undef signbit +extern int gl_signbitf (float arg); +extern int gl_signbitd (double arg); +extern int gl_signbitl (long double arg); +# if __GNUC__ >= 2 && !__STRICT_ANSI__ +# if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT +# define gl_signbitf(arg) \ + ({ union { float _value; \ + unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ + } _m; \ + _m._value = (arg); \ + (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \ + }) +# endif +# if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT +# define gl_signbitd(arg) \ + ({ union { double _value; \ + unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ + } _m; \ + _m._value = (arg); \ + (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \ + }) +# endif +# if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT +# define gl_signbitl(arg) \ + ({ union { long double _value; \ + unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ + } _m; \ + _m._value = (arg); \ + (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ + }) +# endif +# endif +# define signbit(x) \ + (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \ + sizeof (x) == sizeof (double) ? gl_signbitd (x) : \ + gl_signbitf (x)) +# endif +#elif defined GNULIB_POSIXCHECK + /* How to override a macro? */ +#endif + + #ifdef __cplusplus } #endif