2 dnl Copyright (C) 2010-2020 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
7 AC_DEFUN([gl_FUNC_SQRTL],
9 AC_REQUIRE([gl_MATH_H_DEFAULTS])
10 AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
12 dnl Persuade glibc <math.h> to declare sqrtl().
13 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
16 AC_CACHE_CHECK([whether sqrtl() can be used without linking with libm],
17 [gl_cv_func_sqrtl_no_libm],
21 [[#ifndef __NO_MATH_INLINES
22 # define __NO_MATH_INLINES 1 /* for glibc */
25 long double (* volatile funcptr) (long double) = sqrtl;
27 [[return funcptr (x) > 0.4
28 || sqrtl (x) > 0.4;]])],
29 [gl_cv_func_sqrtl_no_libm=yes],
30 [gl_cv_func_sqrtl_no_libm=no])
32 if test $gl_cv_func_sqrtl_no_libm = no; then
33 AC_CACHE_CHECK([whether sqrtl() can be used with libm],
34 [gl_cv_func_sqrtl_in_libm],
40 [[#ifndef __NO_MATH_INLINES
41 # define __NO_MATH_INLINES 1 /* for glibc */
44 long double (* volatile funcptr) (long double) = sqrtl;
46 [[return funcptr (x) > 0.4
47 || sqrtl (x) > 0.4;]])],
48 [gl_cv_func_sqrtl_in_libm=yes],
49 [gl_cv_func_sqrtl_in_libm=no])
52 if test $gl_cv_func_sqrtl_in_libm = yes; then
56 if test $gl_cv_func_sqrtl_no_libm = yes \
57 || test $gl_cv_func_sqrtl_in_libm = yes; then
58 dnl Also check whether it's declared.
59 dnl Mac OS X 10.3 has sqrtl() in libc but doesn't declare it in <math.h>.
60 AC_CHECK_DECL([sqrtl], , [HAVE_DECL_SQRTL=0], [[#include <math.h>]])
63 LIBS="$LIBS $SQRTL_LIBM"
66 case "$gl_cv_func_sqrtl_works" in
74 if test $HAVE_SQRTL = 0 || test $REPLACE_SQRTL = 1; then
75 dnl Find libraries needed to link lib/sqrtl.c.
76 if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
77 AC_REQUIRE([gl_FUNC_SQRT])
78 SQRTL_LIBM="$SQRT_LIBM"
80 AC_REQUIRE([gl_FUNC_ISNANL])
81 AC_REQUIRE([gl_FUNC_FREXPL])
82 AC_REQUIRE([gl_FUNC_LDEXPL])
83 AC_REQUIRE([gl_FUNC_SQRT])
84 dnl Append $ISNANL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
85 case " $SQRTL_LIBM " in
86 *" $ISNANL_LIBM "*) ;;
87 *) SQRTL_LIBM="$SQRTL_LIBM $ISNANL_LIBM" ;;
89 dnl Append $FREXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
90 case " $SQRTL_LIBM " in
91 *" $FREXPL_LIBM "*) ;;
92 *) SQRTL_LIBM="$SQRTL_LIBM $FREXPL_LIBM" ;;
94 dnl Append $LDEXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
95 case " $SQRTL_LIBM " in
96 *" $LDEXPL_LIBM "*) ;;
97 *) SQRTL_LIBM="$SQRTL_LIBM $LDEXPL_LIBM" ;;
99 dnl Append $SQRT_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
100 case " $SQRTL_LIBM " in
102 *) SQRTL_LIBM="$SQRTL_LIBM $SQRT_LIBM" ;;
106 AC_SUBST([SQRTL_LIBM])
109 dnl Test whether sqrtl() works.
110 dnl On OpenBSD 5.1/SPARC, sqrtl(8.1974099812331540680810141969554806865L) has
111 dnl rounding errors that eat up the last 8 to 9 decimal digits.
112 AC_DEFUN([gl_FUNC_SQRTL_WORKS],
114 AC_REQUIRE([AC_PROG_CC])
115 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
116 AC_CACHE_CHECK([whether sqrtl works], [gl_cv_func_sqrtl_works],
122 #ifndef sqrtl /* for AIX */
127 long double sqrtl (long double);
130 my_ldexpl (long double x, int d)
138 volatile long double x;
139 volatile long double y;
143 x = 8.1974099812331540680810141969554806865L;
146 z = my_ldexpl (z, LDBL_MANT_DIG);
154 [gl_cv_func_sqrtl_works=yes],
155 [gl_cv_func_sqrtl_works=no],
157 openbsd*) gl_cv_func_sqrtl_works="guessing no" ;;
158 # Guess yes on native Windows.
159 mingw*) gl_cv_func_sqrtl_works="guessing yes" ;;
160 *) gl_cv_func_sqrtl_works="guessing yes" ;;