mirror of
https://git.savannah.gnu.org/git/gnulib.git
synced 2025-09-04 02:42:02 +03:00
log10: Work around OSF/1 5.1 bug.
* lib/math.in.h (log10): New declaration. * lib/log10.c: New file. * m4/log10.m4 (gl_FUNC_LOG10_WORKS): New macro. (gl_FUNC_LOG10): Invoke it. Set REPLACE_LOG10. * m4/math_h.m4 (gl_MATH_H): Test whether log10 is declared. (gl_MATH_H_DEFAULTS): Initialize GNULIB_LOG10, REPLACE_LOG10. * modules/math (Makefile.am): Substitute GNULIB_LOG10, REPLACE_LOG10. * modules/log10 (Files): Add lib/log10.c. (Depends-on): Add math. (configure.ac): If REPLACE_LOG10 is 1, compile an override. * tests/test-math-c++.cc: Check the declaration of log10. * doc/posix-functions/log10.texi: Mention the OSF/1 5.1 problem.
This commit is contained in:
16
ChangeLog
16
ChangeLog
@@ -1,3 +1,19 @@
|
|||||||
|
2012-04-01 Bruno Haible <bruno@clisp.org>
|
||||||
|
|
||||||
|
log10: Work around OSF/1 5.1 bug.
|
||||||
|
* lib/math.in.h (log10): New declaration.
|
||||||
|
* lib/log10.c: New file.
|
||||||
|
* m4/log10.m4 (gl_FUNC_LOG10_WORKS): New macro.
|
||||||
|
(gl_FUNC_LOG10): Invoke it. Set REPLACE_LOG10.
|
||||||
|
* m4/math_h.m4 (gl_MATH_H): Test whether log10 is declared.
|
||||||
|
(gl_MATH_H_DEFAULTS): Initialize GNULIB_LOG10, REPLACE_LOG10.
|
||||||
|
* modules/math (Makefile.am): Substitute GNULIB_LOG10, REPLACE_LOG10.
|
||||||
|
* modules/log10 (Files): Add lib/log10.c.
|
||||||
|
(Depends-on): Add math.
|
||||||
|
(configure.ac): If REPLACE_LOG10 is 1, compile an override.
|
||||||
|
* tests/test-math-c++.cc: Check the declaration of log10.
|
||||||
|
* doc/posix-functions/log10.texi: Mention the OSF/1 5.1 problem.
|
||||||
|
|
||||||
2012-03-31 Bruno Haible <bruno@clisp.org>
|
2012-03-31 Bruno Haible <bruno@clisp.org>
|
||||||
|
|
||||||
log10l tests: More tests.
|
log10l tests: More tests.
|
||||||
|
@@ -8,6 +8,9 @@ Gnulib module: log10
|
|||||||
|
|
||||||
Portability problems fixed by Gnulib:
|
Portability problems fixed by Gnulib:
|
||||||
@itemize
|
@itemize
|
||||||
|
@item
|
||||||
|
This function returns a wrong value for a minus zero argument on some platforms:
|
||||||
|
OSF/1 5.1.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
Portability problems not fixed by Gnulib:
|
Portability problems not fixed by Gnulib:
|
||||||
|
31
lib/log10.c
Normal file
31
lib/log10.c
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/* Base 10 logarithmic function.
|
||||||
|
Copyright (C) 2012 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
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
double
|
||||||
|
log10 (double x)
|
||||||
|
#undef log10
|
||||||
|
{
|
||||||
|
/* Work around the OSF/1 5.1 bug. */
|
||||||
|
if (x == 0.0)
|
||||||
|
/* Return -Infinity. */
|
||||||
|
return -1.0 / 0.0;
|
||||||
|
return log10 (x);
|
||||||
|
}
|
@@ -1205,6 +1205,26 @@ _GL_WARN_ON_USE (log10f, "log10f is unportable - "
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_LOG10@
|
||||||
|
# if @REPLACE_LOG10@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef log10
|
||||||
|
# define log10 rpl_log10
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (log10, double, (double x));
|
||||||
|
_GL_CXXALIAS_RPL (log10, double, (double x));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (log10, double, (double x));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (log10);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef log10
|
||||||
|
# if HAVE_RAW_DECL_LOG10
|
||||||
|
_GL_WARN_ON_USE (log10, "log10 has portability problems - "
|
||||||
|
"use gnulib module log10 for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_LOG10L@
|
#if @GNULIB_LOG10L@
|
||||||
# if !@HAVE_LOG10L@ || !@HAVE_DECL_LOG10L@
|
# if !@HAVE_LOG10L@ || !@HAVE_DECL_LOG10L@
|
||||||
# undef log10l
|
# undef log10l
|
||||||
|
45
m4/log10.m4
45
m4/log10.m4
@@ -1,4 +1,4 @@
|
|||||||
# log10.m4 serial 1
|
# log10.m4 serial 2
|
||||||
dnl Copyright (C) 2011-2012 Free Software Foundation, Inc.
|
dnl Copyright (C) 2011-2012 Free Software Foundation, Inc.
|
||||||
dnl This file is free software; the Free Software Foundation
|
dnl This file is free software; the Free Software Foundation
|
||||||
dnl gives unlimited permission to copy and/or distribute it,
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -6,6 +6,49 @@ dnl with or without modifications, as long as this notice is preserved.
|
|||||||
|
|
||||||
AC_DEFUN([gl_FUNC_LOG10],
|
AC_DEFUN([gl_FUNC_LOG10],
|
||||||
[
|
[
|
||||||
|
AC_REQUIRE([gl_MATH_H_DEFAULTS])
|
||||||
|
|
||||||
dnl Determine LOG10_LIBM.
|
dnl Determine LOG10_LIBM.
|
||||||
gl_COMMON_DOUBLE_MATHFUNC([log10])
|
gl_COMMON_DOUBLE_MATHFUNC([log10])
|
||||||
|
|
||||||
|
save_LIBS="$LIBS"
|
||||||
|
LIBS="$LIBS $LOG10_LIBM"
|
||||||
|
gl_FUNC_LOG10_WORKS
|
||||||
|
LIBS="$save_LIBS"
|
||||||
|
case "$gl_cv_func_log10_works" in
|
||||||
|
*yes) ;;
|
||||||
|
*) REPLACE_LOG10=1 ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Test whether log10() works.
|
||||||
|
dnl On OSF/1 5.1, log10(-0.0) is NaN.
|
||||||
|
AC_DEFUN([gl_FUNC_LOG10_WORKS],
|
||||||
|
[
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||||
|
AC_CACHE_CHECK([whether log10 works], [gl_cv_func_log10_works],
|
||||||
|
[
|
||||||
|
AC_RUN_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([[
|
||||||
|
#include <math.h>
|
||||||
|
volatile double x;
|
||||||
|
double y;
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
x = -0.0;
|
||||||
|
y = log10 (x);
|
||||||
|
if (!(y + y == y))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
]])],
|
||||||
|
[gl_cv_func_log10_works=yes],
|
||||||
|
[gl_cv_func_log10_works=no],
|
||||||
|
[case "$host_os" in
|
||||||
|
osf*) gl_cv_func_log10_works="guessing no";;
|
||||||
|
*) gl_cv_func_log10_works="guessing yes";;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# math_h.m4 serial 104
|
# math_h.m4 serial 105
|
||||||
dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
|
dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
|
||||||
dnl This file is free software; the Free Software Foundation
|
dnl This file is free software; the Free Software Foundation
|
||||||
dnl gives unlimited permission to copy and/or distribute it,
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -45,7 +45,7 @@ AC_DEFUN([gl_MATH_H],
|
|||||||
fabsf fabsl floorf floorl fma fmaf fmal
|
fabsf fabsl floorf floorl fma fmaf fmal
|
||||||
fmod fmodf fmodl frexpf frexpl hypotf hypotl
|
fmod fmodf fmodl frexpf frexpl hypotf hypotl
|
||||||
ldexpf ldexpl
|
ldexpf ldexpl
|
||||||
logb log logf logl log10f log10l log1p log1pf log1pl log2 log2f log2l
|
logb log logf logl log10 log10f log10l log1p log1pf log1pl log2 log2f log2l
|
||||||
modf modff modfl powf
|
modf modff modfl powf
|
||||||
remainder remainderf remainderl
|
remainder remainderf remainderl
|
||||||
rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl
|
rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl
|
||||||
@@ -119,6 +119,7 @@ AC_DEFUN([gl_MATH_H_DEFAULTS],
|
|||||||
GNULIB_LOG=0; AC_SUBST([GNULIB_LOG])
|
GNULIB_LOG=0; AC_SUBST([GNULIB_LOG])
|
||||||
GNULIB_LOGF=0; AC_SUBST([GNULIB_LOGF])
|
GNULIB_LOGF=0; AC_SUBST([GNULIB_LOGF])
|
||||||
GNULIB_LOGL=0; AC_SUBST([GNULIB_LOGL])
|
GNULIB_LOGL=0; AC_SUBST([GNULIB_LOGL])
|
||||||
|
GNULIB_LOG10=0; AC_SUBST([GNULIB_LOG10])
|
||||||
GNULIB_LOG10F=0; AC_SUBST([GNULIB_LOG10F])
|
GNULIB_LOG10F=0; AC_SUBST([GNULIB_LOG10F])
|
||||||
GNULIB_LOG10L=0; AC_SUBST([GNULIB_LOG10L])
|
GNULIB_LOG10L=0; AC_SUBST([GNULIB_LOG10L])
|
||||||
GNULIB_LOG1P=0; AC_SUBST([GNULIB_LOG1P])
|
GNULIB_LOG1P=0; AC_SUBST([GNULIB_LOG1P])
|
||||||
@@ -277,6 +278,7 @@ AC_DEFUN([gl_MATH_H_DEFAULTS],
|
|||||||
REPLACE_LOG=0; AC_SUBST([REPLACE_LOG])
|
REPLACE_LOG=0; AC_SUBST([REPLACE_LOG])
|
||||||
REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF])
|
REPLACE_LOGF=0; AC_SUBST([REPLACE_LOGF])
|
||||||
REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL])
|
REPLACE_LOGL=0; AC_SUBST([REPLACE_LOGL])
|
||||||
|
REPLACE_LOG10=0; AC_SUBST([REPLACE_LOG10])
|
||||||
REPLACE_LOG1P=0; AC_SUBST([REPLACE_LOG1P])
|
REPLACE_LOG1P=0; AC_SUBST([REPLACE_LOG1P])
|
||||||
REPLACE_LOG1PF=0; AC_SUBST([REPLACE_LOG1PF])
|
REPLACE_LOG1PF=0; AC_SUBST([REPLACE_LOG1PF])
|
||||||
REPLACE_LOG1PL=0; AC_SUBST([REPLACE_LOG1PL])
|
REPLACE_LOG1PL=0; AC_SUBST([REPLACE_LOG1PL])
|
||||||
|
@@ -2,13 +2,19 @@ Description:
|
|||||||
log10() function: base 10 logarithmic function.
|
log10() function: base 10 logarithmic function.
|
||||||
|
|
||||||
Files:
|
Files:
|
||||||
|
lib/log10.c
|
||||||
m4/log10.m4
|
m4/log10.m4
|
||||||
m4/mathfunc.m4
|
m4/mathfunc.m4
|
||||||
|
|
||||||
Depends-on:
|
Depends-on:
|
||||||
|
math
|
||||||
|
|
||||||
configure.ac:
|
configure.ac:
|
||||||
gl_FUNC_LOG10
|
gl_FUNC_LOG10
|
||||||
|
if test $REPLACE_LOG10 = 1; then
|
||||||
|
AC_LIBOBJ([log10])
|
||||||
|
fi
|
||||||
|
gl_MATH_MODULE_INDICATOR([log10])
|
||||||
|
|
||||||
Makefile.am:
|
Makefile.am:
|
||||||
|
|
||||||
|
@@ -84,6 +84,7 @@ math.h: math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(
|
|||||||
-e 's/@''GNULIB_LOG''@/$(GNULIB_LOG)/g' \
|
-e 's/@''GNULIB_LOG''@/$(GNULIB_LOG)/g' \
|
||||||
-e 's/@''GNULIB_LOGF''@/$(GNULIB_LOGF)/g' \
|
-e 's/@''GNULIB_LOGF''@/$(GNULIB_LOGF)/g' \
|
||||||
-e 's/@''GNULIB_LOGL''@/$(GNULIB_LOGL)/g' \
|
-e 's/@''GNULIB_LOGL''@/$(GNULIB_LOGL)/g' \
|
||||||
|
-e 's/@''GNULIB_LOG10''@/$(GNULIB_LOG10)/g' \
|
||||||
-e 's/@''GNULIB_LOG10F''@/$(GNULIB_LOG10F)/g' \
|
-e 's/@''GNULIB_LOG10F''@/$(GNULIB_LOG10F)/g' \
|
||||||
-e 's/@''GNULIB_LOG10L''@/$(GNULIB_LOG10L)/g' \
|
-e 's/@''GNULIB_LOG10L''@/$(GNULIB_LOG10L)/g' \
|
||||||
-e 's/@''GNULIB_LOG1P''@/$(GNULIB_LOG1P)/g' \
|
-e 's/@''GNULIB_LOG1P''@/$(GNULIB_LOG1P)/g' \
|
||||||
@@ -244,6 +245,7 @@ math.h: math.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(
|
|||||||
-e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \
|
-e 's|@''REPLACE_LOG''@|$(REPLACE_LOG)|g' \
|
||||||
-e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \
|
-e 's|@''REPLACE_LOGF''@|$(REPLACE_LOGF)|g' \
|
||||||
-e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \
|
-e 's|@''REPLACE_LOGL''@|$(REPLACE_LOGL)|g' \
|
||||||
|
-e 's|@''REPLACE_LOG10''@|$(REPLACE_LOG10)|g' \
|
||||||
-e 's|@''REPLACE_LOG1P''@|$(REPLACE_LOG1P)|g' \
|
-e 's|@''REPLACE_LOG1P''@|$(REPLACE_LOG1P)|g' \
|
||||||
-e 's|@''REPLACE_LOG1PF''@|$(REPLACE_LOG1PF)|g' \
|
-e 's|@''REPLACE_LOG1PF''@|$(REPLACE_LOG1PF)|g' \
|
||||||
-e 's|@''REPLACE_LOG1PL''@|$(REPLACE_LOG1PL)|g' \
|
-e 's|@''REPLACE_LOG1PL''@|$(REPLACE_LOG1PL)|g' \
|
||||||
|
@@ -210,7 +210,9 @@ SIGNATURE_CHECK (GNULIB_NAMESPACE::ldexpl, long double, (long double, int));
|
|||||||
|
|
||||||
//SIGNATURE_CHECK (GNULIB_NAMESPACE::lgamma, double, (double));
|
//SIGNATURE_CHECK (GNULIB_NAMESPACE::lgamma, double, (double));
|
||||||
|
|
||||||
//SIGNATURE_CHECK (GNULIB_NAMESPACE::log10, double, (double));
|
#if GNULIB_TEST_LOG10
|
||||||
|
SIGNATURE_CHECK (GNULIB_NAMESPACE::log10, double, (double));
|
||||||
|
#endif
|
||||||
#if GNULIB_TEST_LOG10L
|
#if GNULIB_TEST_LOG10L
|
||||||
SIGNATURE_CHECK (GNULIB_NAMESPACE::log10l, long double, (long double));
|
SIGNATURE_CHECK (GNULIB_NAMESPACE::log10l, long double, (long double));
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user