hypotf.m4 4.5 KB
Newer Older
1
# hypotf.m4 serial 7
2
dnl Copyright (C) 2012-2018 Free Software Foundation, Inc.
Bruno Haible's avatar
Bruno Haible committed
3 4 5 6 7 8
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_HYPOTF],
[
9
  m4_divert_text([DEFAULTS], [gl_hypotf_required=plain])
Bruno Haible's avatar
Bruno Haible committed
10 11 12
  AC_REQUIRE([gl_MATH_H_DEFAULTS])
  AC_REQUIRE([gl_FUNC_HYPOT])

13 14 15
  dnl Persuade glibc <math.h> to declare hypotf().
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])

Bruno Haible's avatar
Bruno Haible committed
16
  dnl Test whether hypotf() exists. Assume that hypotf(), if it exists, is
17
  dnl defined in the same library as hypot().
Bruno Haible's avatar
Bruno Haible committed
18 19 20 21 22 23
  save_LIBS="$LIBS"
  LIBS="$LIBS $HYPOT_LIBM"
  AC_CHECK_FUNCS([hypotf])
  LIBS="$save_LIBS"
  if test $ac_cv_func_hypotf = yes; then
    HYPOTF_LIBM="$HYPOT_LIBM"
24

Bruno Haible's avatar
Bruno Haible committed
25 26 27 28 29 30 31 32
    save_LIBS="$LIBS"
    LIBS="$LIBS $HYPOTF_LIBM"
    gl_FUNC_HYPOTF_WORKS
    LIBS="$save_LIBS"
    case "$gl_cv_func_hypotf_works" in
      *yes) ;;
      *) REPLACE_HYPOTF=1 ;;
    esac
33

34 35
    m4_ifdef([gl_FUNC_HYPOTF_IEEE], [
      if test $gl_hypotf_required = ieee && test $REPLACE_HYPOTF = 0; then
36
        AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
        AC_CACHE_CHECK([whether hypotf works according to ISO C 99 with IEC 60559],
          [gl_cv_func_hypotf_ieee],
          [
            save_LIBS="$LIBS"
            LIBS="$LIBS $HYPOTF_LIBM"
            AC_RUN_IFELSE(
              [AC_LANG_SOURCE([[
#ifndef __NO_MATH_INLINES
# define __NO_MATH_INLINES 1 /* for glibc */
#endif
#include <math.h>
/* Compare two numbers with ==.
   This is a separate function because IRIX 6.5 "cc -O" miscompiles an
   'x == x' test.  */
static int
numeric_equal (float x, float y)
{
  return x == y;
}
static float dummy (float x, float y) { return 0; }
float zero;
float one = 1.0f;
int main (int argc, char *argv[])
{
  float (*my_hypotf) (float, float) = argc ? hypotf : dummy;
  float f;
  /* Test hypotf(NaN,Infinity).
     This test fails on OSF/1 5.1 and native Windows.  */
  f = my_hypotf (zero / zero, one / zero);
  if (!numeric_equal (f, f))
    return 1;
  return 0;
}
              ]])],
              [gl_cv_func_hypotf_ieee=yes],
              [gl_cv_func_hypotf_ieee=no],
73
              [case "$host_os" in
74 75 76 77 78 79
                                # Guess yes on glibc systems.
                 *-gnu* | gnu*) gl_cv_func_hypotf_ieee="guessing yes" ;;
                                # Guess yes on native Windows.
                 mingw*)        gl_cv_func_hypotf_ieee="guessing yes" ;;
                                # If we don't know, assume the worst.
                 *)             gl_cv_func_hypotf_ieee="guessing no" ;;
80 81
               esac
              ])
82 83 84 85 86 87 88 89
            LIBS="$save_LIBS"
          ])
        case "$gl_cv_func_hypotf_ieee" in
          *yes) ;;
          *) REPLACE_HYPOTF=1 ;;
        esac
      fi
    ])
Bruno Haible's avatar
Bruno Haible committed
90 91
  else
    HAVE_HYPOTF=0
92 93 94 95
    dnl If the function is declared but does not appear to exist, it may be
    dnl defined as an inline function. In order to avoid a conflict, we have
    dnl to define rpl_hypotf, not hypotf.
    AC_CHECK_DECLS([hypotf], [REPLACE_HYPOTF=1], , [[#include <math.h>]])
Bruno Haible's avatar
Bruno Haible committed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
  fi
  if test $HAVE_HYPOTF = 0 || test $REPLACE_HYPOTF = 1; then
    dnl Find libraries needed to link lib/hypotf.c.
    HYPOTF_LIBM="$HYPOT_LIBM"
  fi
  AC_SUBST([HYPOTF_LIBM])
])

dnl Test whether hypotf() works.
dnl It returns wrong values on NetBSD 5.1/x86_64 and OpenBSD 4.9/x86.
AC_DEFUN([gl_FUNC_HYPOTF_WORKS],
[
  AC_REQUIRE([AC_PROG_CC])
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
  AC_CACHE_CHECK([whether hypotf works], [gl_cv_func_hypotf_works],
    [
      AC_RUN_IFELSE(
        [AC_LANG_SOURCE([[
#include <float.h>
#include <math.h>
volatile float x;
volatile float y;
volatile float z;
int main ()
{
  int result = 0;
  /* This test fails on NetBSD 5.1.  */
  {
    x = FLT_MIN * 2.0f;
    y = FLT_MIN * 3.0f;
    z = hypotf (x, y);
    if (!(z >= FLT_MIN * 2.0f && z <= FLT_MIN * 4.0f))
      result |= 1;
  }
  /* This test fails on OpenBSD 4.9.  */
  {
    x = FLT_MAX;
    y = FLT_MAX * 0.5f;
    z = hypotf (x, y);
    if (!(z > 0 && z == z + z))
      result |= 2;
  }
  return result;
}
]])],
        [gl_cv_func_hypotf_works=yes],
        [gl_cv_func_hypotf_works=no],
        [case "$host_os" in
144 145 146 147
           netbsd* | openbsd*) gl_cv_func_hypotf_works="guessing no" ;;
                               # Guess yes on native Windows.
           mingw*)             gl_cv_func_hypotf_works="guessing yes" ;;
           *)                  gl_cv_func_hypotf_works="guessing yes" ;;
Bruno Haible's avatar
Bruno Haible committed
148 149 150 151
         esac
        ])
    ])
])