2 dnl Copyright (C) 2007-2010 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_FREXP],
9 AC_REQUIRE([gl_MATH_H_DEFAULTS])
10 AC_REQUIRE([gl_CHECK_FREXP_NO_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],
18 AC_TRY_LINK([#include <math.h>
20 [int e; return frexp (x, &e) > 0;],
21 [gl_cv_func_frexp_in_libm=yes],
22 [gl_cv_func_frexp_in_libm=no])
25 if test $gl_cv_func_frexp_in_libm = yes; then
29 if test $gl_cv_func_frexp_no_libm = yes \
30 || test $gl_cv_func_frexp_in_libm = yes; then
32 LIBS="$LIBS $FREXP_LIBM"
35 case "$gl_cv_func_frexp_works" in
36 *yes) gl_func_frexp=yes ;;
37 *) gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
42 if test $gl_func_frexp = yes; then
43 AC_DEFINE([HAVE_FREXP], [1],
44 [Define if the frexp() function is available and works.])
48 AC_SUBST([FREXP_LIBM])
51 AC_DEFUN([gl_FUNC_FREXP_NO_LIBM],
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
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 ;;
62 gl_func_frexp_no_libm=no
63 dnl Set REPLACE_FREXP here because the system may have frexp in libm.
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.])
74 dnl Test whether frexp() can be used without linking with libm.
75 dnl Set gl_cv_func_frexp_no_libm to 'yes' or 'no' accordingly.
76 AC_DEFUN([gl_CHECK_FREXP_NO_LIBM],
78 AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
79 [gl_cv_func_frexp_no_libm],
81 AC_TRY_LINK([#include <math.h>
83 [int e; return frexp (x, &e) > 0;],
84 [gl_cv_func_frexp_no_libm=yes],
85 [gl_cv_func_frexp_no_libm=no])
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],
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],
106 /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
107 So we use -zero instead. */
109 /* Test on denormalized numbers. */
110 for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
115 double y = frexp (x, &exp);
116 /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
117 On NetBSD: y = 0.75. Correct: y = 0.5. */
121 /* Test on infinite numbers. */
125 double y = frexp (x, &exp);
129 /* Test on negative zero. */
133 double y = frexp (x, &exp);
134 if (memcmp (&y, &x, sizeof x))
138 }], [gl_cv_func_frexp_works=yes], [gl_cv_func_frexp_works=no],
140 netbsd* | irix* | mingw*) gl_cv_func_frexp_works="guessing no";;
141 *) gl_cv_func_frexp_works="guessing yes";;