X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmath.in.h;h=d6308cbb9dc1df25022a2203a21c32d3954529f5;hb=b344de996cd51f8a2f2558a3172016b64d99c622;hp=001d59a1dfd42ede445908d561331a8da0cf1cdf;hpb=ca1938db6aed3e620314e9dfc451d7fe4d4ebb91;p=gnulib.git diff --git a/lib/math.in.h b/lib/math.in.h index 001d59a1d..d6308cbb9 100644 --- a/lib/math.in.h +++ b/lib/math.in.h @@ -1,6 +1,6 @@ /* A GNU-like . - Copyright (C) 2002-2003, 2007-2010 Free Software Foundation, Inc. + Copyright (C) 2002-2003, 2007-2011 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 @@ -15,17 +15,18 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef _GL_MATH_H +#ifndef _@GUARD_PREFIX@_MATH_H #if __GNUC__ >= 3 @PRAGMA_SYSTEM_HEADER@ #endif +@PRAGMA_COLUMNS@ /* The include_next requires a split double-inclusion guard. */ #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ -#ifndef _GL_MATH_H -#define _GL_MATH_H +#ifndef _@GUARD_PREFIX@_MATH_H +#define _@GUARD_PREFIX@_MATH_H /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ @@ -72,18 +73,21 @@ _GL_WARN_ON_USE (rpl_ ## func ## l, #func " is unportable - " \ 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 +# if !GNULIB_defined_NAN +# undef NAN /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */ -# ifdef __DECC +# ifdef __DECC static float _NaN () { static float zero = 0.0f; return zero / zero; } -# define NAN (_NaN()) -# else -# define NAN (0.0f / 0.0f) +# define NAN (_NaN()) +# else +# define NAN (0.0f / 0.0f) +# endif +# define GNULIB_defined_NAN 1 # endif #endif @@ -201,6 +205,19 @@ _GL_WARN_ON_USE (ceilf, "ceilf is unportable - " # endif #endif +#if @GNULIB_CEIL@ +# if @REPLACE_CEIL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define ceil rpl_ceil +# endif +_GL_FUNCDECL_RPL (ceil, double, (double x)); +_GL_CXXALIAS_RPL (ceil, double, (double x)); +# else +_GL_CXXALIAS_SYS (ceil, double, (double x)); +# endif +_GL_CXXALIASWARN (ceil); +#endif + #if @GNULIB_CEILL@ # if @REPLACE_CEILL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) @@ -225,19 +242,10 @@ _GL_WARN_ON_USE (ceill, "ceill is unportable - " #if @GNULIB_COSL@ -# if !@HAVE_COSL@ -# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -# undef cosl -# define cosl rpl_cosl -# endif -_GL_FUNCDECL_RPL (cosl, long double, (long double x)); -_GL_CXXALIAS_RPL (cosl, long double, (long double x)); -# else -# if !@HAVE_DECL_COSL@ +# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@ _GL_FUNCDECL_SYS (cosl, long double, (long double x)); -# endif -_GL_CXXALIAS_SYS (cosl, long double, (long double x)); # endif +_GL_CXXALIAS_SYS (cosl, long double, (long double x)); _GL_CXXALIASWARN (cosl); #elif defined GNULIB_POSIXCHECK # undef cosl @@ -270,7 +278,7 @@ _GL_WARN_ON_USE (expl, "expl is unportable - " # endif _GL_FUNCDECL_RPL (floorf, float, (float x)); _GL_CXXALIAS_RPL (floorf, float, (float x)); -#else +# else # if !@HAVE_DECL_FLOORF@ _GL_FUNCDECL_SYS (floorf, float, (float x)); # endif @@ -285,6 +293,19 @@ _GL_WARN_ON_USE (floorf, "floorf is unportable - " # endif #endif +#if @GNULIB_FLOOR@ +# if @REPLACE_FLOOR@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define floor rpl_floor +# endif +_GL_FUNCDECL_RPL (floor, double, (double x)); +_GL_CXXALIAS_RPL (floor, double, (double x)); +# else +_GL_CXXALIAS_SYS (floor, double, (double x)); +# endif +_GL_CXXALIASWARN (floor); +#endif + #if @GNULIB_FLOORL@ # if @REPLACE_FLOORL@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) @@ -331,7 +352,7 @@ _GL_FUNCDECL_SYS (frexpl, long double, _GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr)); # endif #endif -#if @GNULIB_FREXPL@ +#if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@) _GL_CXXALIASWARN (frexpl); #endif #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK @@ -371,19 +392,10 @@ _GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - " #if @GNULIB_LOGL@ -# if !@HAVE_LOGL@ -# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -# undef logl -# define logl rpl_logl -# endif -_GL_FUNCDECL_RPL (logl, long double, (long double x)); -_GL_CXXALIAS_RPL (logl, long double, (long double x)); -# else -# if !@HAVE_DECL_LOGL@ +# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@ _GL_FUNCDECL_SYS (logl, long double, (long double x)); -# endif -_GL_CXXALIAS_SYS (logl, long double, (long double x)); # endif +_GL_CXXALIAS_SYS (logl, long double, (long double x)); _GL_CXXALIASWARN (logl); #elif defined GNULIB_POSIXCHECK # undef logl @@ -465,19 +477,10 @@ _GL_WARN_ON_USE (roundl, "roundl is unportable - " #if @GNULIB_SINL@ -# if !@HAVE_SINL@ -# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -# undef sinl -# define sinl rpl_sinl -# endif -_GL_FUNCDECL_RPL (sinl, long double, (long double x)); -_GL_CXXALIAS_RPL (sinl, long double, (long double x)); -# else -# if !@HAVE_DECL_SINL@ +# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@ _GL_FUNCDECL_SYS (sinl, long double, (long double x)); -# endif -_GL_CXXALIAS_SYS (sinl, long double, (long double x)); # endif +_GL_CXXALIAS_SYS (sinl, long double, (long double x)); _GL_CXXALIASWARN (sinl); #elif defined GNULIB_POSIXCHECK # undef sinl @@ -519,10 +522,18 @@ _GL_WARN_ON_USE (tanl, "tanl is unportable - " #if @GNULIB_TRUNCF@ -# if !@HAVE_DECL_TRUNCF@ +# if @REPLACE_TRUNCF@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define truncf rpl_truncf +# endif +_GL_FUNCDECL_RPL (truncf, float, (float x)); +_GL_CXXALIAS_RPL (truncf, float, (float x)); +# else +# if !@HAVE_DECL_TRUNCF@ _GL_FUNCDECL_SYS (truncf, float, (float x)); -# endif +# endif _GL_CXXALIAS_SYS (truncf, float, (float x)); +# endif _GL_CXXALIASWARN (truncf); #elif defined GNULIB_POSIXCHECK # undef truncf @@ -533,10 +544,18 @@ _GL_WARN_ON_USE (truncf, "truncf is unportable - " #endif #if @GNULIB_TRUNC@ -# if !@HAVE_DECL_TRUNC@ +# if @REPLACE_TRUNC@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# define trunc rpl_trunc +# endif +_GL_FUNCDECL_RPL (trunc, double, (double x)); +_GL_CXXALIAS_RPL (trunc, double, (double x)); +# else +# if !@HAVE_DECL_TRUNC@ _GL_FUNCDECL_SYS (trunc, double, (double x)); -# endif +# endif _GL_CXXALIAS_SYS (trunc, double, (double x)); +# endif _GL_CXXALIASWARN (trunc); #elif defined GNULIB_POSIXCHECK # undef trunc @@ -636,7 +655,8 @@ _GL_EXTERN_C int isnanf (float x); This function is a gnulib extension, unlike isnan() which applied only to 'double' numbers earlier but now is a type-generic macro. */ # if @HAVE_ISNAND@ -/* The original included above provides a declaration of isnan macro. */ +/* The original included above provides a declaration of isnan + macro. */ # if __GNUC__ >= 4 /* GCC 4.0 and newer provides three built-ins for isnan. */ # undef isnand @@ -656,7 +676,8 @@ _GL_EXTERN_C int isnand (double x); #if @GNULIB_ISNANL@ /* Test for NaN for 'long double' numbers. */ # if @HAVE_ISNANL@ -/* The original included above provides a declaration of isnan macro or (older) isnanl function. */ +/* The original included above provides a declaration of isnan + macro or (older) isnanl function. */ # if __GNUC__ >= 4 /* GCC 4.0 and newer provides three built-ins for isnan. */ # undef isnanl @@ -681,7 +702,7 @@ _GL_EXTERN_C int isnanl (long double x); 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)) +# define gl_isnan_f(x) __builtin_isnanf ((float)(x)) # else _GL_EXTERN_C int rpl_isnanf (float x); # define gl_isnan_f(x) rpl_isnanf (x) @@ -693,7 +714,7 @@ _GL_EXTERN_C 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)) +# define gl_isnan_l(x) __builtin_isnanl ((long double)(x)) # else _GL_EXTERN_C int rpl_isnanl (long double x); # define gl_isnan_l(x) rpl_isnanl (x) @@ -703,6 +724,16 @@ _GL_EXTERN_C int rpl_isnanl (long double x); (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \ sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \ gl_isnan_f (x)) +# elif __GNUC__ >= 4 +# undef isnan +# define isnan(x) \ + (sizeof (x) == sizeof (long double) ? __builtin_isnanl ((long double)(x)) : \ + sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \ + __builtin_isnanf ((float)(x))) +# endif +/* Ensure isnan is a macro. */ +# ifndef isnan +# define isnan isnan # endif #elif defined GNULIB_POSIXCHECK # if defined isnan @@ -728,11 +759,13 @@ _GL_EXTERN_C int gl_signbitf (float arg); _GL_EXTERN_C int gl_signbitd (double arg); _GL_EXTERN_C int gl_signbitl (long double arg); # if __GNUC__ >= 2 && !__STRICT_ANSI__ +# define _GL_NUM_UINT_WORDS(type) \ + ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) # if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf # define gl_signbitf_OPTIMIZED_MACRO # define gl_signbitf(arg) \ ({ union { float _value; \ - unsigned int _word[(sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ + unsigned int _word[_GL_NUM_UINT_WORDS (float)]; \ } _m; \ _m._value = (arg); \ (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \ @@ -741,8 +774,8 @@ _GL_EXTERN_C int gl_signbitl (long double arg); # if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd # define gl_signbitd_OPTIMIZED_MACRO # define gl_signbitd(arg) \ - ({ union { double _value; \ - unsigned int _word[(sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ + ({ union { double _value; \ + unsigned int _word[_GL_NUM_UINT_WORDS (double)]; \ } _m; \ _m._value = (arg); \ (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \ @@ -752,10 +785,10 @@ _GL_EXTERN_C int gl_signbitl (long double arg); # define gl_signbitl_OPTIMIZED_MACRO # define gl_signbitl(arg) \ ({ union { long double _value; \ - unsigned int _word[(sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)]; \ + unsigned int _word[_GL_NUM_UINT_WORDS (long double)]; \ } _m; \ _m._value = (arg); \ - (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ + (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \ }) # endif # endif @@ -773,5 +806,5 @@ _GL_WARN_REAL_FLOATING_DECL (signbit); #endif -#endif /* _GL_MATH_H */ -#endif /* _GL_MATH_H */ +#endif /* _@GUARD_PREFIX@_MATH_H */ +#endif /* _@GUARD_PREFIX@_MATH_H */