* lib/math.in.h (logl): Override if REPLACE_LOGL is 1.
* lib/logl.c (logl): If logf exists, use it and provide just the
workaround.
* m4/logl.m4 (gl_FUNC_LOGL_WORKS): New macro.
(gl_FUNC_LOGL): Invoke it. Set REPLACE_LOGL.
* m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_LOGL.
* modules/math (Makefile.am): Substitute REPLACE_LOGL.
* modules/logl (configure.ac): Consider REPLACE_LOGL.
(Depends-on): Update conditions.
* doc/posix-functions/logl.texi: Mention the OSF/1 5.1 problem.
+2012-03-09 Bruno Haible <bruno@clisp.org>
+
+ logl: Work around OSF/1 5.1 bug.
+ * lib/math.in.h (logl): Override if REPLACE_LOGL is 1.
+ * lib/logl.c (logl): If logf exists, use it and provide just the
+ workaround.
+ * m4/logl.m4 (gl_FUNC_LOGL_WORKS): New macro.
+ (gl_FUNC_LOGL): Invoke it. Set REPLACE_LOGL.
+ * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_LOGL.
+ * modules/math (Makefile.am): Substitute REPLACE_LOGL.
+ * modules/logl (configure.ac): Consider REPLACE_LOGL.
+ (Depends-on): Update conditions.
+ * doc/posix-functions/logl.texi: Mention the OSF/1 5.1 problem.
+
2012-03-09 Bruno Haible <bruno@clisp.org>
logf: Work around OSF/1 5.1 bug.
@item
This function returns wrong results on some platforms:
glibc 2.7 on Linux/SPARC64.
+@item
+This function returns a wrong value for a minus zero argument on some platforms:
+OSF/1 5.1.
@end itemize
Portability problems not fixed by Gnulib:
return log (x);
}
+#elif HAVE_LOGL
+
+long double
+logl (long double x)
+# undef logl
+{
+ /* Work around the OSF/1 5.1 bug. */
+ if (x == 0.0L)
+ /* Return -Infinity. */
+ return -1.0L / 0.0L;
+ return logl (x);
+}
+
#else
/* Code based on glibc/sysdeps/ieee754/ldbl-128/e_logl.c. */
#endif
#if @GNULIB_LOGL@
-# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
-# undef logl
+# if @REPLACE_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_LOGL@ || !@HAVE_DECL_LOGL@
+# undef logl
_GL_FUNCDECL_SYS (logl, long double, (long double x));
-# endif
+# endif
_GL_CXXALIAS_SYS (logl, long double, (long double x));
+# endif
_GL_CXXALIASWARN (logl);
#elif defined GNULIB_POSIXCHECK
# undef logl
-# logl.m4 serial 7
+# logl.m4 serial 8
dnl Copyright (C) 2010-2012 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl Also check whether it's declared.
dnl MacOS X 10.3 has logl() in libc but doesn't declare it in <math.h>.
AC_CHECK_DECL([logl], , [HAVE_DECL_LOGL=0], [[#include <math.h>]])
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $LOGL_LIBM"
+ gl_FUNC_LOGL_WORKS
+ LIBS="$save_LIBS"
+ case "$gl_cv_func_logl_works" in
+ *yes) ;;
+ *) REPLACE_LOGL=1 ;;
+ esac
else
- HAVE_DECL_LOGL=0
HAVE_LOGL=0
+ HAVE_DECL_LOGL=0
+ fi
+ if test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; then
dnl Find libraries needed to link lib/logl.c.
if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
AC_REQUIRE([gl_FUNC_LOG])
LOGL_LIBM="$LOG_LIBM"
else
- AC_REQUIRE([gl_FUNC_FREXPL])
- AC_REQUIRE([gl_FUNC_ISNANL])
- AC_REQUIRE([gl_FUNC_FLOORL])
- dnl Append $FREXPL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
- case " $LOGL_LIBM " in
- *" $FREXPL_LIBM "*) ;;
- *) LOGL_LIBM="$LOGL_LIBM $FREXPL_LIBM" ;;
- esac
- dnl Append $ISNANL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
- case " $LOGL_LIBM " in
- *" $ISNANL_LIBM "*) ;;
- *) LOGL_LIBM="$LOGL_LIBM $ISNANL_LIBM" ;;
- esac
- dnl Append $FLOORL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
- case " $LOGL_LIBM " in
- *" $FLOORL_LIBM "*) ;;
- *) LOGL_LIBM="$LOGL_LIBM $FLOORL_LIBM" ;;
- esac
+ if test $HAVE_LOGL = 0; then
+ AC_REQUIRE([gl_FUNC_FREXPL])
+ AC_REQUIRE([gl_FUNC_ISNANL])
+ AC_REQUIRE([gl_FUNC_FLOORL])
+ dnl Append $FREXPL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
+ case " $LOGL_LIBM " in
+ *" $FREXPL_LIBM "*) ;;
+ *) LOGL_LIBM="$LOGL_LIBM $FREXPL_LIBM" ;;
+ esac
+ dnl Append $ISNANL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
+ case " $LOGL_LIBM " in
+ *" $ISNANL_LIBM "*) ;;
+ *) LOGL_LIBM="$LOGL_LIBM $ISNANL_LIBM" ;;
+ esac
+ dnl Append $FLOORL_LIBM to LOGL_LIBM, avoiding gratuitous duplicates.
+ case " $LOGL_LIBM " in
+ *" $FLOORL_LIBM "*) ;;
+ *) LOGL_LIBM="$LOGL_LIBM $FLOORL_LIBM" ;;
+ esac
+ fi
fi
fi
AC_SUBST([LOGL_LIBM])
])
+
+dnl Test whether logl() works.
+dnl On OSF/1 5.1, logl(-0.0L) is NaN.
+AC_DEFUN([gl_FUNC_LOGL_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether logl works], [gl_cv_func_logl_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <math.h>
+volatile long double x;
+long double y;
+int main ()
+{
+ x = -0.0L;
+ y = logl (x);
+ if (!(y + y == y))
+ return 1;
+ return 0;
+}
+]])],
+ [gl_cv_func_logl_works=yes],
+ [gl_cv_func_logl_works=no],
+ [case "$host_os" in
+ osf*) gl_cv_func_logl_works="guessing no";;
+ *) gl_cv_func_logl_works="guessing yes";;
+ esac
+ ])
+ ])
+])
-# math_h.m4 serial 94
+# math_h.m4 serial 95
dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
REPLACE_LDEXPL=0; AC_SUBST([REPLACE_LDEXPL])
REPLACE_LOG=0; AC_SUBST([REPLACE_LOG])
REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF])
+ REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL])
REPLACE_MODF=0; AC_SUBST([REPLACE_MODF])
REPLACE_MODFF=0; AC_SUBST([REPLACE_MODFF])
REPLACE_MODFL=0; AC_SUBST([REPLACE_MODFL])
Depends-on:
math
extensions
-log [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1]
-frexpl [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
-isnanl [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
-floorl [test $HAVE_LOGL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+log [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1]
+frexpl [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+isnanl [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+floorl [{ test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
configure.ac:
gl_FUNC_LOGL
-if test $HAVE_LOGL = 0; then
+if test $HAVE_LOGL = 0 || test $REPLACE_LOGL = 1; then
AC_LIBOBJ([logl])
fi
gl_MATH_MODULE_INDICATOR([logl])
-e 's|@''REPLACE_LDEXPL''@|$(REPLACE_LDEXPL)|g' \
-e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \
-e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \
+ -e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \
-e 's|@''REPLACE_MODF''@|$(REPLACE_MODF)|g' \
-e 's|@''REPLACE_MODFF''@|$(REPLACE_MODFF)|g' \
-e 's|@''REPLACE_MODFL''@|$(REPLACE_MODFL)|g' \