Blame m4/frexp.m4

Packit 8f70b4
# frexp.m4 serial 16
Packit 8f70b4
dnl Copyright (C) 2007-2018 Free Software Foundation, Inc.
Packit 8f70b4
dnl This file is free software; the Free Software Foundation
Packit 8f70b4
dnl gives unlimited permission to copy and/or distribute it,
Packit 8f70b4
dnl with or without modifications, as long as this notice is preserved.
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([gl_FUNC_FREXP],
Packit 8f70b4
[
Packit 8f70b4
  AC_REQUIRE([gl_MATH_H_DEFAULTS])
Packit 8f70b4
  AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
Packit 8f70b4
  FREXP_LIBM=
Packit 8f70b4
  if test $gl_cv_func_frexp_no_libm = no; then
Packit 8f70b4
    AC_CACHE_CHECK([whether frexp() can be used with libm],
Packit 8f70b4
      [gl_cv_func_frexp_in_libm],
Packit 8f70b4
      [
Packit 8f70b4
        save_LIBS="$LIBS"
Packit 8f70b4
        LIBS="$LIBS -lm"
Packit 8f70b4
        AC_LINK_IFELSE(
Packit 8f70b4
          [AC_LANG_PROGRAM(
Packit 8f70b4
             [[#include <math.h>
Packit 8f70b4
               double x;]],
Packit 8f70b4
             [[int e; return frexp (x, &e) > 0;]])],
Packit 8f70b4
          [gl_cv_func_frexp_in_libm=yes],
Packit 8f70b4
          [gl_cv_func_frexp_in_libm=no])
Packit 8f70b4
        LIBS="$save_LIBS"
Packit 8f70b4
      ])
Packit 8f70b4
    if test $gl_cv_func_frexp_in_libm = yes; then
Packit 8f70b4
      FREXP_LIBM=-lm
Packit 8f70b4
    fi
Packit 8f70b4
  fi
Packit 8f70b4
  if test $gl_cv_func_frexp_no_libm = yes \
Packit 8f70b4
     || test $gl_cv_func_frexp_in_libm = yes; then
Packit 8f70b4
    save_LIBS="$LIBS"
Packit 8f70b4
    LIBS="$LIBS $FREXP_LIBM"
Packit 8f70b4
    gl_FUNC_FREXP_WORKS
Packit 8f70b4
    LIBS="$save_LIBS"
Packit 8f70b4
    case "$gl_cv_func_frexp_works" in
Packit 8f70b4
      *yes) gl_func_frexp=yes ;;
Packit 8f70b4
      *)    gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
Packit 8f70b4
    esac
Packit 8f70b4
  else
Packit 8f70b4
    gl_func_frexp=no
Packit 8f70b4
  fi
Packit 8f70b4
  if test $gl_func_frexp = yes; then
Packit 8f70b4
    AC_DEFINE([HAVE_FREXP], [1],
Packit 8f70b4
      [Define if the frexp() function is available and works.])
Packit 8f70b4
  fi
Packit 8f70b4
  AC_SUBST([FREXP_LIBM])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([gl_FUNC_FREXP_NO_LIBM],
Packit 8f70b4
[
Packit 8f70b4
  AC_REQUIRE([gl_MATH_H_DEFAULTS])
Packit 8f70b4
  AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
Packit 8f70b4
  if test $gl_cv_func_frexp_no_libm = yes; then
Packit 8f70b4
    gl_FUNC_FREXP_WORKS
Packit 8f70b4
    case "$gl_cv_func_frexp_works" in
Packit 8f70b4
      *yes) gl_func_frexp_no_libm=yes ;;
Packit 8f70b4
      *)    gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
Packit 8f70b4
    esac
Packit 8f70b4
  else
Packit 8f70b4
    gl_func_frexp_no_libm=no
Packit 8f70b4
    dnl Set REPLACE_FREXP here because the system may have frexp in libm.
Packit 8f70b4
    REPLACE_FREXP=1
Packit 8f70b4
  fi
Packit 8f70b4
  if test $gl_func_frexp_no_libm = yes; then
Packit 8f70b4
    AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
Packit 8f70b4
      [Define if the frexp() function is available in libc.])
Packit 8f70b4
  fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Test whether frexp() can be used without linking with libm.
Packit 8f70b4
dnl Set gl_cv_func_frexp_no_libm to 'yes' or 'no' accordingly.
Packit 8f70b4
AC_DEFUN([gl_CHECK_FREXP_NO_LIBM],
Packit 8f70b4
[
Packit 8f70b4
  AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
Packit 8f70b4
    [gl_cv_func_frexp_no_libm],
Packit 8f70b4
    [
Packit 8f70b4
      AC_LINK_IFELSE(
Packit 8f70b4
        [AC_LANG_PROGRAM(
Packit 8f70b4
           [[#include <math.h>
Packit 8f70b4
             double x;]],
Packit 8f70b4
           [[int e; return frexp (x, &e) > 0;]])],
Packit 8f70b4
        [gl_cv_func_frexp_no_libm=yes],
Packit 8f70b4
        [gl_cv_func_frexp_no_libm=no])
Packit 8f70b4
    ])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Test whether frexp() works also on denormalized numbers (this fails e.g. on
Packit 8f70b4
dnl NetBSD 3.0), on infinite numbers (this fails e.g. on IRIX 6.5 and mingw),
Packit 8f70b4
dnl and on negative zero (this fails e.g. on NetBSD 4.99 and mingw).
Packit 8f70b4
AC_DEFUN([gl_FUNC_FREXP_WORKS],
Packit 8f70b4
[
Packit 8f70b4
  AC_REQUIRE([AC_PROG_CC])
Packit 8f70b4
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit 8f70b4
  AC_CHECK_DECLS_ONCE([alarm])
Packit 8f70b4
  AC_CACHE_CHECK([whether frexp works], [gl_cv_func_frexp_works],
Packit 8f70b4
    [
Packit 8f70b4
      AC_RUN_IFELSE(
Packit 8f70b4
        [AC_LANG_SOURCE([[
Packit 8f70b4
#include <float.h>
Packit 8f70b4
#include <math.h>
Packit 8f70b4
#include <string.h>
Packit 8f70b4
#if HAVE_DECL_ALARM
Packit 8f70b4
# include <signal.h>
Packit 8f70b4
# include <unistd.h>
Packit 8f70b4
#endif
Packit 8f70b4
/* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
Packit 8f70b4
   ICC 10.0 has a bug when optimizing the expression -zero.
Packit 8f70b4
   The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
Packit 8f70b4
   to PowerPC on Mac OS X 10.5.  */
Packit 8f70b4
#if defined __hpux || defined __sgi || defined __ICC
Packit 8f70b4
static double
Packit 8f70b4
compute_minus_zero (void)
Packit 8f70b4
{
Packit 8f70b4
  return -DBL_MIN * DBL_MIN;
Packit 8f70b4
}
Packit 8f70b4
# define minus_zero compute_minus_zero ()
Packit 8f70b4
#else
Packit 8f70b4
double minus_zero = -0.0;
Packit 8f70b4
#endif
Packit 8f70b4
int main()
Packit 8f70b4
{
Packit 8f70b4
  int result = 0;
Packit 8f70b4
  int i;
Packit 8f70b4
  volatile double x;
Packit 8f70b4
  double zero = 0.0;
Packit 8f70b4
#if HAVE_DECL_ALARM
Packit 8f70b4
  /* NeXTstep 3.3 frexp() runs into an endless loop when called on an infinite
Packit 8f70b4
     number.  Let the test fail in this case.  */
Packit 8f70b4
  signal (SIGALRM, SIG_DFL);
Packit 8f70b4
  alarm (5);
Packit 8f70b4
#endif
Packit 8f70b4
  /* Test on denormalized numbers.  */
Packit 8f70b4
  for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
Packit 8f70b4
    ;
Packit 8f70b4
  if (x > 0.0)
Packit 8f70b4
    {
Packit 8f70b4
      int exp;
Packit 8f70b4
      double y = frexp (x, &exp);
Packit 8f70b4
      /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
Packit 8f70b4
         On NetBSD: y = 0.75. Correct: y = 0.5.  */
Packit 8f70b4
      if (y != 0.5)
Packit 8f70b4
        result |= 1;
Packit 8f70b4
    }
Packit 8f70b4
  /* Test on infinite numbers.  */
Packit 8f70b4
  x = 1.0 / zero;
Packit 8f70b4
  {
Packit 8f70b4
    int exp;
Packit 8f70b4
    double y = frexp (x, &exp);
Packit 8f70b4
    if (y != x)
Packit 8f70b4
      result |= 2;
Packit 8f70b4
  }
Packit 8f70b4
  /* Test on negative zero.  */
Packit 8f70b4
  x = minus_zero;
Packit 8f70b4
  {
Packit 8f70b4
    int exp;
Packit 8f70b4
    double y = frexp (x, &exp);
Packit 8f70b4
    if (memcmp (&y, &x, sizeof x))
Packit 8f70b4
      result |= 4;
Packit 8f70b4
  }
Packit 8f70b4
  return result;
Packit 8f70b4
}]])],
Packit 8f70b4
        [gl_cv_func_frexp_works=yes],
Packit 8f70b4
        [gl_cv_func_frexp_works=no],
Packit 8f70b4
        [case "$host_os" in
Packit 8f70b4
           netbsd* | irix*) gl_cv_func_frexp_works="guessing no" ;;
Packit 8f70b4
           mingw*) # Guess yes with MSVC, no with mingw.
Packit 8f70b4
             AC_EGREP_CPP([Good], [
Packit 8f70b4
#ifdef _MSC_VER
Packit 8f70b4
 Good
Packit 8f70b4
#endif
Packit 8f70b4
               ],
Packit 8f70b4
               [gl_cv_func_frexp_works="guessing yes"],
Packit 8f70b4
               [gl_cv_func_frexp_works="guessing no"])
Packit 8f70b4
             ;;
Packit 8f70b4
           *) gl_cv_func_frexp_works="guessing yes" ;;
Packit 8f70b4
         esac
Packit 8f70b4
        ])
Packit 8f70b4
    ])
Packit 8f70b4
])