* doc/headers/assert.texi (assert.h): Document assert module use.
[gnulib.git] / lib / math_.h
index be56101..588642c 100644 (file)
    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 <math.h>
+#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