diff options
author | Bruno Haible <bruno@clisp.org> | 2012-04-03 18:59:33 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2012-04-03 21:14:09 +0200 |
commit | 1ab17d9f64900d991443e712f636c9ef6ad543b2 (patch) | |
tree | e1a8a3720fbea6455aaf2a40fb01ba0610db69cc /m4 | |
parent | 9e7a6e9093ca226915933ed14029ba7efea0efca (diff) | |
download | gnulib-1ab17d9f64900d991443e712f636c9ef6ad543b2.tar.gz |
New module 'ilogb'.
* lib/math.in.h (ilogb): New declaration.
* lib/ilogb.c: New file.
* m4/ilogb.m4: New file.
* m4/math_h.m4 (gl_MATH_H): Test whether ilogb is declared.
(gl_MATH_H_DEFAULTS): Initialize GNULIB_ILOGB, HAVE_ILOGB,
REPLACE_ILOGB.
* modules/math (Makefile.am): Substitute GNULIB_ILOGB, HAVE_ILOGB,
REPLACE_ILOGB.
* modules/ilogb: New file.
* tests/test-math-c++.cc: Check the declaration of ilogb.
* doc/posix-functions/ilogb.texi: Mention the new module.
Diffstat (limited to 'm4')
-rw-r--r-- | m4/ilogb.m4 | 112 | ||||
-rw-r--r-- | m4/math_h.m4 | 6 |
2 files changed, 117 insertions, 1 deletions
diff --git a/m4/ilogb.m4 b/m4/ilogb.m4 new file mode 100644 index 0000000000..8e9c05ffb0 --- /dev/null +++ b/m4/ilogb.m4 @@ -0,0 +1,112 @@ +# ilogb.m4 serial 1 +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 with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_ILOGB], +[ + AC_REQUIRE([gl_MATH_H_DEFAULTS]) + + dnl Determine ILOGB_LIBM. + gl_MATHFUNC([ilogb], [int], [(double)]) + if test $gl_cv_func_ilogb_no_libm = yes \ + || test $gl_cv_func_ilogb_in_libm = yes; then + save_LIBS="$LIBS" + LIBS="$LIBS $ILOGB_LIBM" + gl_FUNC_ILOGB_WORKS + LIBS="$save_LIBS" + case "$gl_cv_func_ilogb_works" in + *yes) ;; + *) REPLACE_ILOGB=1 ;; + esac + else + HAVE_ILOGB=0 + fi + if test $HAVE_ILOGB = 0 || test $REPLACE_ILOGB = 1; then + dnl Find libraries needed to link lib/ilogb.c. + AC_REQUIRE([gl_FUNC_FREXP]) + AC_REQUIRE([gl_FUNC_ISNAND]) + ILOGB_LIBM= + dnl Append $FREXP_LIBM to ILOGB_LIBM, avoiding gratuitous duplicates. + case " $ILOGB_LIBM " in + *" $FREXP_LIBM "*) ;; + *) ILOGB_LIBM="$ILOGB_LIBM $FREXP_LIBM" ;; + esac + dnl Append $ISNAND_LIBM to ILOGB_LIBM, avoiding gratuitous duplicates. + case " $ILOGB_LIBM " in + *" $ISNAND_LIBM "*) ;; + *) ILOGB_LIBM="$ILOGB_LIBM $ISNAND_LIBM" ;; + esac + fi + AC_SUBST([ILOGB_LIBM]) +]) + +dnl Test whether ilogb() works. +dnl On OpenBSD 4.9, AIX 5.1, ilogb(0.0) is wrong. +dnl On NetBSD 5.1, OpenBSD 4.9, ilogb(Infinity) is wrong. +dnl On OpenBSD 4.9, ilogb(NaN) is wrong. +AC_DEFUN([gl_FUNC_ILOGB_WORKS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether ilogb works], [gl_cv_func_ilogb_works], + [ + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include <limits.h> +#include <math.h> +/* Provide FP_ILOGB0, FP_ILOGBNAN, like in math.in.h. */ +#if !(defined FP_ILOGB0 && defined FP_ILOGBNAN) +# if defined __NetBSD__ || defined __sgi + /* NetBSD, IRIX 6.5: match what ilogb() does */ +# define FP_ILOGB0 INT_MIN +# define FP_ILOGBNAN INT_MIN +# elif defined _AIX + /* AIX 5.1: match what ilogb() does in AIX >= 5.2 */ +# define FP_ILOGB0 INT_MIN +# define FP_ILOGBNAN INT_MAX +# elif defined __sun + /* Solaris 9: match what ilogb() does */ +# define FP_ILOGB0 (- INT_MAX) +# define FP_ILOGBNAN INT_MAX +# endif +#endif +volatile double x; +static double zero; +static int dummy (double x) { return 0; } +int main (int argc, char *argv[]) +{ + int (*my_ilogb) (double) = argc ? ilogb : dummy; + int result = 0; + /* This test fails on OpenBSD 4.9, AIX 5.1. */ + { + x = 0.0; + if (my_ilogb (x) != FP_ILOGB0) + result |= 1; + } + /* This test fails on NetBSD 5.1, OpenBSD 4.9. */ + { + x = 1.0 / zero; + if (my_ilogb (x) != INT_MAX) + result |= 2; + } + /* This test fails on OpenBSD 4.9. */ + { + x = zero / zero; + if (my_ilogb (x) != FP_ILOGBNAN) + result |= 4; + } + return result; +} +]])], + [gl_cv_func_ilogb_works=yes], + [gl_cv_func_ilogb_works=no], + [case "$host_os" in + aix* | openbsd* | netbsd* | solaris*) + gl_cv_func_ilogb_works="guessing no";; + *) gl_cv_func_ilogb_works="guessing yes";; + esac + ]) + ]) +]) diff --git a/m4/math_h.m4 b/m4/math_h.m4 index ef97a600d4..d9735df133 100644 --- a/m4/math_h.m4 +++ b/m4/math_h.m4 @@ -1,4 +1,4 @@ -# math_h.m4 serial 110 +# math_h.m4 serial 111 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, @@ -44,6 +44,7 @@ AC_DEFUN([gl_MATH_H], expf expl exp2 exp2f exp2l expm1 expm1f expm1l fabsf fabsl floorf floorl fma fmaf fmal fmod fmodf fmodl frexpf frexpl hypotf hypotl + ilogb ldexpf ldexpl log logf logl log10 log10f log10l log1p log1pf log1pl log2 log2f log2l logb logbf logbl @@ -108,6 +109,7 @@ AC_DEFUN([gl_MATH_H_DEFAULTS], GNULIB_HYPOT=0; AC_SUBST([GNULIB_HYPOT]) GNULIB_HYPOTF=0; AC_SUBST([GNULIB_HYPOTF]) GNULIB_HYPOTL=0; AC_SUBST([GNULIB_HYPOTL]) + GNULIB_ILOGB=0; AC_SUBST([GNULIB_ILOGB]) GNULIB_ISFINITE=0; AC_SUBST([GNULIB_ISFINITE]) GNULIB_ISINF=0; AC_SUBST([GNULIB_ISINF]) GNULIB_ISNAN=0; AC_SUBST([GNULIB_ISNAN]) @@ -186,6 +188,7 @@ AC_DEFUN([gl_MATH_H_DEFAULTS], HAVE_FREXPF=1; AC_SUBST([HAVE_FREXPF]) HAVE_HYPOTF=1; AC_SUBST([HAVE_HYPOTF]) HAVE_HYPOTL=1; AC_SUBST([HAVE_HYPOTL]) + HAVE_ILOGB=1; AC_SUBST([HAVE_ILOGB]) HAVE_ISNANF=1; AC_SUBST([HAVE_ISNANF]) HAVE_ISNAND=1; AC_SUBST([HAVE_ISNAND]) HAVE_ISNANL=1; AC_SUBST([HAVE_ISNANL]) @@ -276,6 +279,7 @@ AC_DEFUN([gl_MATH_H_DEFAULTS], REPLACE_HYPOT=0; AC_SUBST([REPLACE_HYPOT]) REPLACE_HYPOTF=0; AC_SUBST([REPLACE_HYPOTF]) REPLACE_HYPOTL=0; AC_SUBST([REPLACE_HYPOTL]) + REPLACE_ILOGB=0; AC_SUBST([REPLACE_ILOGB]) REPLACE_ISFINITE=0; AC_SUBST([REPLACE_ISFINITE]) REPLACE_ISINF=0; AC_SUBST([REPLACE_ISINF]) REPLACE_ISNAN=0; AC_SUBST([REPLACE_ISNAN]) |