3 dnl Copyright (C) 2010-2024 Free Software Foundation, Inc.
4 dnl This file is free software; the Free Software Foundation
5 dnl gives unlimited permission to copy and/or distribute it,
6 dnl with or without modifications, as long as this notice is preserved.
8 AC_DEFUN([gl_FUNC_EXPM1],
10 m4_divert_text([DEFAULTS], [gl_expm1_required=plain])
11 AC_REQUIRE([gl_MATH_H_DEFAULTS])
13 dnl Persuade glibc <math.h> to declare expm1().
14 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
17 AC_CACHE_CHECK([whether expm1() can be used without linking with libm],
18 [gl_cv_func_expm1_no_libm],
22 [[#ifndef __NO_MATH_INLINES
23 # define __NO_MATH_INLINES 1 /* for glibc */
26 double (* volatile funcptr) (double) = expm1;
28 [[return funcptr (x) > 0.5
29 || expm1 (x) > 0.5;]])],
30 [gl_cv_func_expm1_no_libm=yes],
31 [gl_cv_func_expm1_no_libm=no])
33 if test $gl_cv_func_expm1_no_libm = no; then
34 AC_CACHE_CHECK([whether expm1() can be used with libm],
35 [gl_cv_func_expm1_in_libm],
41 [[#ifndef __NO_MATH_INLINES
42 # define __NO_MATH_INLINES 1 /* for glibc */
45 double (* volatile funcptr) (double) = expm1;
47 [[return funcptr (x) > 0.5
48 || expm1 (x) > 0.5;]])],
49 [gl_cv_func_expm1_in_libm=yes],
50 [gl_cv_func_expm1_in_libm=no])
53 if test $gl_cv_func_expm1_in_libm = yes; then
57 if test $gl_cv_func_expm1_no_libm = yes \
58 || test $gl_cv_func_expm1_in_libm = yes; then
60 m4_ifdef([gl_FUNC_EXPM1_IEEE], [
61 if test $gl_expm1_required = ieee && test $REPLACE_EXPM1 = 0; then
62 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
63 AC_CACHE_CHECK([whether expm1 works according to ISO C 99 with IEC 60559],
64 [gl_cv_func_expm1_ieee],
67 LIBS="$LIBS $EXPM1_LIBM"
70 #ifndef __NO_MATH_INLINES
71 # define __NO_MATH_INLINES 1 /* for glibc */
74 ]gl_DOUBLE_MINUS_ZERO_CODE[
75 ]gl_DOUBLE_SIGNBIT_CODE[
76 static double dummy (double x) { return 0; }
77 int main (int argc, char *argv[])
79 double (* volatile my_expm1) (double) = argc ? expm1 : dummy;
80 double y = my_expm1 (minus_zerod);
81 if (!(y == 0.0) || (signbitd (minus_zerod) && !signbitd (y)))
86 [gl_cv_func_expm1_ieee=yes],
87 [gl_cv_func_expm1_ieee=no],
89 # Guess yes on glibc systems.
90 *-gnu* | gnu*) gl_cv_func_expm1_ieee="guessing yes" ;;
91 # Guess yes on musl systems.
92 *-musl* | midipix*) gl_cv_func_expm1_ieee="guessing yes" ;;
93 # Guess yes on native Windows.
94 mingw* | windows*) gl_cv_func_expm1_ieee="guessing yes" ;;
95 # If we don't know, obey --enable-cross-guesses.
96 *) gl_cv_func_expm1_ieee="$gl_cross_guess_normal" ;;
101 case "$gl_cv_func_expm1_ieee" in
103 *) REPLACE_EXPM1=1 ;;
110 if test $HAVE_EXPM1 = 0 || test $REPLACE_EXPM1 = 1; then
111 dnl Find libraries needed to link lib/expm1.c.
112 AC_REQUIRE([gl_FUNC_ISNAND])
113 AC_REQUIRE([gl_FUNC_EXP])
114 AC_REQUIRE([gl_FUNC_ROUND])
115 AC_REQUIRE([gl_FUNC_LDEXP])
117 dnl Append $ISNAND_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
118 case " $EXPM1_LIBM " in
119 *" $ISNAND_LIBM "*) ;;
120 *) EXPM1_LIBM="$EXPM1_LIBM $ISNAND_LIBM" ;;
122 dnl Append $EXP_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
123 case " $EXPM1_LIBM " in
125 *) EXPM1_LIBM="$EXPM1_LIBM $EXP_LIBM" ;;
127 dnl Append $ROUND_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
128 case " $EXPM1_LIBM " in
129 *" $ROUND_LIBM "*) ;;
130 *) EXPM1_LIBM="$EXPM1_LIBM $ROUND_LIBM" ;;
132 dnl Append $LDEXP_LIBM to EXPM1_LIBM, avoiding gratuitous duplicates.
133 case " $EXPM1_LIBM " in
134 *" $LDEXP_LIBM "*) ;;
135 *) EXPM1_LIBM="$EXPM1_LIBM $LDEXP_LIBM" ;;
138 AC_SUBST([EXPM1_LIBM])