gnulib update
[bpt/guile.git] / m4 / frexp.m4
1 # frexp.m4 serial 11
2 dnl Copyright (C) 2007-2011 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.
6
7 AC_DEFUN([gl_FUNC_FREXP],
8 [
9 AC_REQUIRE([gl_MATH_H_DEFAULTS])
10 AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
11 FREXP_LIBM=
12 if test $gl_cv_func_frexp_no_libm = no; then
13 AC_CACHE_CHECK([whether frexp() can be used with libm],
14 [gl_cv_func_frexp_in_libm],
15 [
16 save_LIBS="$LIBS"
17 LIBS="$LIBS -lm"
18 AC_LINK_IFELSE(
19 [AC_LANG_PROGRAM(
20 [[#include <math.h>
21 double x;]],
22 [[int e; return frexp (x, &e) > 0;]])],
23 [gl_cv_func_frexp_in_libm=yes],
24 [gl_cv_func_frexp_in_libm=no])
25 LIBS="$save_LIBS"
26 ])
27 if test $gl_cv_func_frexp_in_libm = yes; then
28 FREXP_LIBM=-lm
29 fi
30 fi
31 if test $gl_cv_func_frexp_no_libm = yes \
32 || test $gl_cv_func_frexp_in_libm = yes; then
33 save_LIBS="$LIBS"
34 LIBS="$LIBS $FREXP_LIBM"
35 gl_FUNC_FREXP_WORKS
36 LIBS="$save_LIBS"
37 case "$gl_cv_func_frexp_works" in
38 *yes) gl_func_frexp=yes ;;
39 *) gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
40 esac
41 else
42 gl_func_frexp=no
43 fi
44 if test $gl_func_frexp = yes; then
45 AC_DEFINE([HAVE_FREXP], [1],
46 [Define if the frexp() function is available and works.])
47 fi
48 AC_SUBST([FREXP_LIBM])
49 ])
50
51 AC_DEFUN([gl_FUNC_FREXP_NO_LIBM],
52 [
53 AC_REQUIRE([gl_MATH_H_DEFAULTS])
54 AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
55 if test $gl_cv_func_frexp_no_libm = yes; then
56 gl_FUNC_FREXP_WORKS
57 case "$gl_cv_func_frexp_works" in
58 *yes) gl_func_frexp_no_libm=yes ;;
59 *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
60 esac
61 else
62 gl_func_frexp_no_libm=no
63 dnl Set REPLACE_FREXP here because the system may have frexp in libm.
64 REPLACE_FREXP=1
65 fi
66 if test $gl_func_frexp_no_libm = yes; then
67 AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
68 [Define if the frexp() function is available in libc.])
69 fi
70 ])
71
72 dnl Test whether frexp() can be used without linking with libm.
73 dnl Set gl_cv_func_frexp_no_libm to 'yes' or 'no' accordingly.
74 AC_DEFUN([gl_CHECK_FREXP_NO_LIBM],
75 [
76 AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
77 [gl_cv_func_frexp_no_libm],
78 [
79 AC_LINK_IFELSE(
80 [AC_LANG_PROGRAM(
81 [[#include <math.h>
82 double x;]],
83 [[int e; return frexp (x, &e) > 0;]])],
84 [gl_cv_func_frexp_no_libm=yes],
85 [gl_cv_func_frexp_no_libm=no])
86 ])
87 ])
88
89 dnl Test whether frexp() works also on denormalized numbers (this fails e.g. on
90 dnl NetBSD 3.0), on infinite numbers (this fails e.g. on IRIX 6.5 and mingw),
91 dnl and on negative zero (this fails e.g. on NetBSD 4.99).
92 AC_DEFUN([gl_FUNC_FREXP_WORKS],
93 [
94 AC_REQUIRE([AC_PROG_CC])
95 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
96 AC_CACHE_CHECK([whether frexp works], [gl_cv_func_frexp_works],
97 [
98 AC_RUN_IFELSE(
99 [AC_LANG_SOURCE([[
100 #include <float.h>
101 #include <math.h>
102 #include <string.h>
103 /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
104 ICC 10.0 has a bug when optimizing the expression -zero.
105 The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
106 to PowerPC on MacOS X 10.5. */
107 #if defined __hpux || defined __sgi || defined __ICC
108 static double
109 compute_minus_zero (void)
110 {
111 return -DBL_MIN * DBL_MIN;
112 }
113 # define minus_zero compute_minus_zero ()
114 #else
115 double minus_zero = -0.0;
116 #endif
117 int main()
118 {
119 int result = 0;
120 int i;
121 volatile double x;
122 double zero = 0.0;
123 /* Test on denormalized numbers. */
124 for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
125 ;
126 if (x > 0.0)
127 {
128 int exp;
129 double y = frexp (x, &exp);
130 /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
131 On NetBSD: y = 0.75. Correct: y = 0.5. */
132 if (y != 0.5)
133 result |= 1;
134 }
135 /* Test on infinite numbers. */
136 x = 1.0 / 0.0;
137 {
138 int exp;
139 double y = frexp (x, &exp);
140 if (y != x)
141 result |= 2;
142 }
143 /* Test on negative zero. */
144 x = minus_zero;
145 {
146 int exp;
147 double y = frexp (x, &exp);
148 if (memcmp (&y, &x, sizeof x))
149 result |= 4;
150 }
151 return result;
152 }]])],
153 [gl_cv_func_frexp_works=yes],
154 [gl_cv_func_frexp_works=no],
155 [case "$host_os" in
156 netbsd* | irix* | mingw*) gl_cv_func_frexp_works="guessing no";;
157 *) gl_cv_func_frexp_works="guessing yes";;
158 esac
159 ])
160 ])
161 ])