Commit | Line | Data |
---|---|---|
3d458a81 | 1 | # frexp.m4 serial 11 |
dd36ce77 MW |
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.]) | |
dd36ce77 MW |
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.]) | |
dd36ce77 MW |
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 | ]) |