512589867eb424bae0d1c3c1d2df6c1c86e9ecc7
[gnulib.git] / m4 / math_h.m4
1 # math_h.m4 serial 77
2 dnl Copyright (C) 2007-2012 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_MATH_H],
8 [
9   AC_REQUIRE([gl_MATH_H_DEFAULTS])
10   gl_CHECK_NEXT_HEADERS([math.h])
11   AC_REQUIRE([AC_C_INLINE])
12
13   AC_CACHE_CHECK([whether NAN macro works], [gl_cv_header_math_nan_works],
14     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
15       [[/* Solaris 10 has a broken definition of NAN.  Other platforms
16         fail to provide NAN, or provide it only in C99 mode; this
17         test only needs to fail when NAN is provided but wrong.  */
18          float f = 1.0f;
19 #ifdef NAN
20          f = NAN;
21 #endif
22          return f == 0;]])],
23       [gl_cv_header_math_nan_works=yes],
24       [gl_cv_header_math_nan_works=no])])
25   if test $gl_cv_header_math_nan_works = no; then
26     REPLACE_NAN=1
27   fi
28   AC_CACHE_CHECK([whether HUGE_VAL works], [gl_cv_header_math_huge_val_works],
29     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>]],
30       [[/* Solaris 10 has a broken definition of HUGE_VAL.  */
31          double d = HUGE_VAL;
32          return d == 0;]])],
33       [gl_cv_header_math_huge_val_works=yes],
34       [gl_cv_header_math_huge_val_works=no])])
35   if test $gl_cv_header_math_huge_val_works = no; then
36     REPLACE_HUGE_VAL=1
37   fi
38
39   dnl Check for declarations of anything we want to poison if the
40   dnl corresponding gnulib module is not in use.
41   gl_WARN_ON_USE_PREPARE([[#include <math.h>]],
42     [acosf acosl asinf asinl atanf atanl
43      cbrt cbrtf ceilf ceill copysign copysignf copysignl cosf cosl coshf
44      expf expl fabsf fabsl floorf floorl fma fmaf fmal
45      fmod fmodf fmodl frexpf frexpl hypotf hypotl
46      ldexpf ldexpl logb logf logl log10f log10l modf modff modfl powf
47      remainder remainderf remainderl
48      rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl
49      tanf tanl tanhf trunc truncf truncl])
50 ])
51
52 AC_DEFUN([gl_MATH_MODULE_INDICATOR],
53 [
54   dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
55   AC_REQUIRE([gl_MATH_H_DEFAULTS])
56   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
57   dnl Define it also as a C macro, for the benefit of the unit tests.
58   gl_MODULE_INDICATOR_FOR_TESTS([$1])
59 ])
60
61 AC_DEFUN([gl_MATH_H_DEFAULTS],
62 [
63   GNULIB_ACOSF=0;      AC_SUBST([GNULIB_ACOSF])
64   GNULIB_ACOSL=0;      AC_SUBST([GNULIB_ACOSL])
65   GNULIB_ASINF=0;      AC_SUBST([GNULIB_ASINF])
66   GNULIB_ASINL=0;      AC_SUBST([GNULIB_ASINL])
67   GNULIB_ATANF=0;      AC_SUBST([GNULIB_ATANF])
68   GNULIB_ATANL=0;      AC_SUBST([GNULIB_ATANL])
69   GNULIB_ATAN2F=0;     AC_SUBST([GNULIB_ATAN2F])
70   GNULIB_CBRT=0;       AC_SUBST([GNULIB_CBRT])
71   GNULIB_CBRTF=0;      AC_SUBST([GNULIB_CBRTF])
72   GNULIB_CEIL=0;       AC_SUBST([GNULIB_CEIL])
73   GNULIB_CEILF=0;      AC_SUBST([GNULIB_CEILF])
74   GNULIB_CEILL=0;      AC_SUBST([GNULIB_CEILL])
75   GNULIB_COPYSIGN=0;   AC_SUBST([GNULIB_COPYSIGN])
76   GNULIB_COPYSIGNF=0;  AC_SUBST([GNULIB_COPYSIGNF])
77   GNULIB_COPYSIGNL=0;  AC_SUBST([GNULIB_COPYSIGNL])
78   GNULIB_COSF=0;       AC_SUBST([GNULIB_COSF])
79   GNULIB_COSL=0;       AC_SUBST([GNULIB_COSL])
80   GNULIB_COSHF=0;      AC_SUBST([GNULIB_COSHF])
81   GNULIB_EXPF=0;       AC_SUBST([GNULIB_EXPF])
82   GNULIB_EXPL=0;       AC_SUBST([GNULIB_EXPL])
83   GNULIB_FABSF=0;      AC_SUBST([GNULIB_FABSF])
84   GNULIB_FABSL=0;      AC_SUBST([GNULIB_FABSL])
85   GNULIB_FLOOR=0;      AC_SUBST([GNULIB_FLOOR])
86   GNULIB_FLOORF=0;     AC_SUBST([GNULIB_FLOORF])
87   GNULIB_FLOORL=0;     AC_SUBST([GNULIB_FLOORL])
88   GNULIB_FMA=0;        AC_SUBST([GNULIB_FMA])
89   GNULIB_FMAF=0;       AC_SUBST([GNULIB_FMAF])
90   GNULIB_FMAL=0;       AC_SUBST([GNULIB_FMAL])
91   GNULIB_FMOD=0;       AC_SUBST([GNULIB_FMOD])
92   GNULIB_FMODF=0;      AC_SUBST([GNULIB_FMODF])
93   GNULIB_FMODL=0;      AC_SUBST([GNULIB_FMODL])
94   GNULIB_FREXPF=0;     AC_SUBST([GNULIB_FREXPF])
95   GNULIB_FREXP=0;      AC_SUBST([GNULIB_FREXP])
96   GNULIB_FREXPL=0;     AC_SUBST([GNULIB_FREXPL])
97   GNULIB_HYPOT=0;      AC_SUBST([GNULIB_HYPOT])
98   GNULIB_HYPOTF=0;     AC_SUBST([GNULIB_HYPOTF])
99   GNULIB_HYPOTL=0;     AC_SUBST([GNULIB_HYPOTL])
100   GNULIB_ISFINITE=0;   AC_SUBST([GNULIB_ISFINITE])
101   GNULIB_ISINF=0;      AC_SUBST([GNULIB_ISINF])
102   GNULIB_ISNAN=0;      AC_SUBST([GNULIB_ISNAN])
103   GNULIB_ISNANF=0;     AC_SUBST([GNULIB_ISNANF])
104   GNULIB_ISNAND=0;     AC_SUBST([GNULIB_ISNAND])
105   GNULIB_ISNANL=0;     AC_SUBST([GNULIB_ISNANL])
106   GNULIB_LDEXPF=0;     AC_SUBST([GNULIB_LDEXPF])
107   GNULIB_LDEXPL=0;     AC_SUBST([GNULIB_LDEXPL])
108   GNULIB_LOGB=0;       AC_SUBST([GNULIB_LOGB])
109   GNULIB_LOGF=0;       AC_SUBST([GNULIB_LOGF])
110   GNULIB_LOGL=0;       AC_SUBST([GNULIB_LOGL])
111   GNULIB_LOG10F=0;     AC_SUBST([GNULIB_LOG10F])
112   GNULIB_LOG10L=0;     AC_SUBST([GNULIB_LOG10L])
113   GNULIB_MODF=0;       AC_SUBST([GNULIB_MODF])
114   GNULIB_MODFF=0;      AC_SUBST([GNULIB_MODFF])
115   GNULIB_MODFL=0;      AC_SUBST([GNULIB_MODFL])
116   GNULIB_POWF=0;       AC_SUBST([GNULIB_POWF])
117   GNULIB_REMAINDER=0;  AC_SUBST([GNULIB_REMAINDER])
118   GNULIB_REMAINDERF=0; AC_SUBST([GNULIB_REMAINDERF])
119   GNULIB_REMAINDERL=0; AC_SUBST([GNULIB_REMAINDERL])
120   GNULIB_RINT=0;       AC_SUBST([GNULIB_RINT])
121   GNULIB_RINTF=0;      AC_SUBST([GNULIB_RINTF])
122   GNULIB_RINTL=0;      AC_SUBST([GNULIB_RINTL])
123   GNULIB_ROUND=0;      AC_SUBST([GNULIB_ROUND])
124   GNULIB_ROUNDF=0;     AC_SUBST([GNULIB_ROUNDF])
125   GNULIB_ROUNDL=0;     AC_SUBST([GNULIB_ROUNDL])
126   GNULIB_SIGNBIT=0;    AC_SUBST([GNULIB_SIGNBIT])
127   GNULIB_SINF=0;       AC_SUBST([GNULIB_SINF])
128   GNULIB_SINL=0;       AC_SUBST([GNULIB_SINL])
129   GNULIB_SINHF=0;      AC_SUBST([GNULIB_SINHF])
130   GNULIB_SQRTF=0;      AC_SUBST([GNULIB_SQRTF])
131   GNULIB_SQRTL=0;      AC_SUBST([GNULIB_SQRTL])
132   GNULIB_TANF=0;       AC_SUBST([GNULIB_TANF])
133   GNULIB_TANL=0;       AC_SUBST([GNULIB_TANL])
134   GNULIB_TANHF=0;      AC_SUBST([GNULIB_TANHF])
135   GNULIB_TRUNC=0;      AC_SUBST([GNULIB_TRUNC])
136   GNULIB_TRUNCF=0;     AC_SUBST([GNULIB_TRUNCF])
137   GNULIB_TRUNCL=0;     AC_SUBST([GNULIB_TRUNCL])
138   dnl Assume proper GNU behavior unless another module says otherwise.
139   HAVE_ACOSF=1;                AC_SUBST([HAVE_ACOSF])
140   HAVE_ACOSL=1;                AC_SUBST([HAVE_ACOSL])
141   HAVE_ASINF=1;                AC_SUBST([HAVE_ASINF])
142   HAVE_ASINL=1;                AC_SUBST([HAVE_ASINL])
143   HAVE_ATANF=1;                AC_SUBST([HAVE_ATANF])
144   HAVE_ATANL=1;                AC_SUBST([HAVE_ATANL])
145   HAVE_ATAN2F=1;               AC_SUBST([HAVE_ATAN2F])
146   HAVE_CBRT=1;                 AC_SUBST([HAVE_CBRT])
147   HAVE_CBRTF=1;                AC_SUBST([HAVE_CBRTF])
148   HAVE_COPYSIGN=1;             AC_SUBST([HAVE_COPYSIGN])
149   HAVE_COPYSIGNF=1;            AC_SUBST([HAVE_COPYSIGNF])
150   HAVE_COPYSIGNL=1;            AC_SUBST([HAVE_COPYSIGNL])
151   HAVE_COSF=1;                 AC_SUBST([HAVE_COSF])
152   HAVE_COSL=1;                 AC_SUBST([HAVE_COSL])
153   HAVE_COSHF=1;                AC_SUBST([HAVE_COSHF])
154   HAVE_EXPF=1;                 AC_SUBST([HAVE_EXPF])
155   HAVE_EXPL=1;                 AC_SUBST([HAVE_EXPL])
156   HAVE_FABSF=1;                AC_SUBST([HAVE_FABSF])
157   HAVE_FABSL=1;                AC_SUBST([HAVE_FABSL])
158   HAVE_FMA=1;                  AC_SUBST([HAVE_FMA])
159   HAVE_FMAF=1;                 AC_SUBST([HAVE_FMAF])
160   HAVE_FMAL=1;                 AC_SUBST([HAVE_FMAL])
161   HAVE_FMODF=1;                AC_SUBST([HAVE_FMODF])
162   HAVE_FMODL=1;                AC_SUBST([HAVE_FMODL])
163   HAVE_FREXPF=1;               AC_SUBST([HAVE_FREXPF])
164   HAVE_HYPOTF=1;               AC_SUBST([HAVE_HYPOTF])
165   HAVE_HYPOTL=1;               AC_SUBST([HAVE_HYPOTL])
166   HAVE_ISNANF=1;               AC_SUBST([HAVE_ISNANF])
167   HAVE_ISNAND=1;               AC_SUBST([HAVE_ISNAND])
168   HAVE_ISNANL=1;               AC_SUBST([HAVE_ISNANL])
169   HAVE_LDEXPF=1;               AC_SUBST([HAVE_LDEXPF])
170   HAVE_LOGF=1;                 AC_SUBST([HAVE_LOGF])
171   HAVE_LOGL=1;                 AC_SUBST([HAVE_LOGL])
172   HAVE_LOG10F=1;               AC_SUBST([HAVE_LOG10F])
173   HAVE_LOG10L=1;               AC_SUBST([HAVE_LOG10L])
174   HAVE_MODFF=1;                AC_SUBST([HAVE_MODFF])
175   HAVE_MODFL=1;                AC_SUBST([HAVE_MODFL])
176   HAVE_POWF=1;                 AC_SUBST([HAVE_POWF])
177   HAVE_REMAINDER=1;            AC_SUBST([HAVE_REMAINDER])
178   HAVE_REMAINDERF=1;           AC_SUBST([HAVE_REMAINDERF])
179   HAVE_REMAINDERL=1;           AC_SUBST([HAVE_REMAINDERL])
180   HAVE_RINT=1;                 AC_SUBST([HAVE_RINT])
181   HAVE_RINTF=1;                AC_SUBST([HAVE_RINTF])
182   HAVE_RINTL=1;                AC_SUBST([HAVE_RINTL])
183   HAVE_SINF=1;                 AC_SUBST([HAVE_SINF])
184   HAVE_SINL=1;                 AC_SUBST([HAVE_SINL])
185   HAVE_SINHF=1;                AC_SUBST([HAVE_SINHF])
186   HAVE_SQRTF=1;                AC_SUBST([HAVE_SQRTF])
187   HAVE_SQRTL=1;                AC_SUBST([HAVE_SQRTL])
188   HAVE_TANF=1;                 AC_SUBST([HAVE_TANF])
189   HAVE_TANL=1;                 AC_SUBST([HAVE_TANL])
190   HAVE_TANHF=1;                AC_SUBST([HAVE_TANHF])
191   HAVE_DECL_ACOSL=1;           AC_SUBST([HAVE_DECL_ACOSL])
192   HAVE_DECL_ASINL=1;           AC_SUBST([HAVE_DECL_ASINL])
193   HAVE_DECL_ATANL=1;           AC_SUBST([HAVE_DECL_ATANL])
194   HAVE_DECL_CBRTF=1;           AC_SUBST([HAVE_DECL_CBRTF])
195   HAVE_DECL_CEILF=1;           AC_SUBST([HAVE_DECL_CEILF])
196   HAVE_DECL_CEILL=1;           AC_SUBST([HAVE_DECL_CEILL])
197   HAVE_DECL_COSL=1;            AC_SUBST([HAVE_DECL_COSL])
198   HAVE_DECL_EXPL=1;            AC_SUBST([HAVE_DECL_EXPL])
199   HAVE_DECL_FLOORF=1;          AC_SUBST([HAVE_DECL_FLOORF])
200   HAVE_DECL_FLOORL=1;          AC_SUBST([HAVE_DECL_FLOORL])
201   HAVE_DECL_FREXPL=1;          AC_SUBST([HAVE_DECL_FREXPL])
202   HAVE_DECL_LDEXPL=1;          AC_SUBST([HAVE_DECL_LDEXPL])
203   HAVE_DECL_LOGB=1;            AC_SUBST([HAVE_DECL_LOGB])
204   HAVE_DECL_LOGL=1;            AC_SUBST([HAVE_DECL_LOGL])
205   HAVE_DECL_LOG10L=1;          AC_SUBST([HAVE_DECL_LOG10L])
206   HAVE_DECL_REMAINDER=1;       AC_SUBST([HAVE_DECL_REMAINDER])
207   HAVE_DECL_ROUND=1;           AC_SUBST([HAVE_DECL_ROUND])
208   HAVE_DECL_ROUNDF=1;          AC_SUBST([HAVE_DECL_ROUNDF])
209   HAVE_DECL_ROUNDL=1;          AC_SUBST([HAVE_DECL_ROUNDL])
210   HAVE_DECL_SINL=1;            AC_SUBST([HAVE_DECL_SINL])
211   HAVE_DECL_SQRTL=1;           AC_SUBST([HAVE_DECL_SQRTL])
212   HAVE_DECL_TANL=1;            AC_SUBST([HAVE_DECL_TANL])
213   HAVE_DECL_TRUNC=1;           AC_SUBST([HAVE_DECL_TRUNC])
214   HAVE_DECL_TRUNCF=1;          AC_SUBST([HAVE_DECL_TRUNCF])
215   HAVE_DECL_TRUNCL=1;          AC_SUBST([HAVE_DECL_TRUNCL])
216   REPLACE_CEIL=0;              AC_SUBST([REPLACE_CEIL])
217   REPLACE_CEILF=0;             AC_SUBST([REPLACE_CEILF])
218   REPLACE_CEILL=0;             AC_SUBST([REPLACE_CEILL])
219   REPLACE_FABSL=0;             AC_SUBST([REPLACE_FABSL])
220   REPLACE_FLOOR=0;             AC_SUBST([REPLACE_FLOOR])
221   REPLACE_FLOORF=0;            AC_SUBST([REPLACE_FLOORF])
222   REPLACE_FLOORL=0;            AC_SUBST([REPLACE_FLOORL])
223   REPLACE_FMA=0;               AC_SUBST([REPLACE_FMA])
224   REPLACE_FMAF=0;              AC_SUBST([REPLACE_FMAF])
225   REPLACE_FMAL=0;              AC_SUBST([REPLACE_FMAL])
226   REPLACE_FMOD=0;              AC_SUBST([REPLACE_FMOD])
227   REPLACE_FMODF=0;             AC_SUBST([REPLACE_FMODF])
228   REPLACE_FMODL=0;             AC_SUBST([REPLACE_FMODL])
229   REPLACE_FREXPF=0;            AC_SUBST([REPLACE_FREXPF])
230   REPLACE_FREXP=0;             AC_SUBST([REPLACE_FREXP])
231   REPLACE_FREXPL=0;            AC_SUBST([REPLACE_FREXPL])
232   REPLACE_HUGE_VAL=0;          AC_SUBST([REPLACE_HUGE_VAL])
233   REPLACE_HYPOT=0;             AC_SUBST([REPLACE_HYPOT])
234   REPLACE_HYPOTF=0;            AC_SUBST([REPLACE_HYPOTF])
235   REPLACE_HYPOTL=0;            AC_SUBST([REPLACE_HYPOTL])
236   REPLACE_ISFINITE=0;          AC_SUBST([REPLACE_ISFINITE])
237   REPLACE_ISINF=0;             AC_SUBST([REPLACE_ISINF])
238   REPLACE_ISNAN=0;             AC_SUBST([REPLACE_ISNAN])
239   REPLACE_LDEXPL=0;            AC_SUBST([REPLACE_LDEXPL])
240   REPLACE_MODF=0;              AC_SUBST([REPLACE_MODF])
241   REPLACE_MODFF=0;             AC_SUBST([REPLACE_MODFF])
242   REPLACE_MODFL=0;             AC_SUBST([REPLACE_MODFL])
243   REPLACE_NAN=0;               AC_SUBST([REPLACE_NAN])
244   REPLACE_REMAINDER=0;         AC_SUBST([REPLACE_REMAINDER])
245   REPLACE_REMAINDERF=0;        AC_SUBST([REPLACE_REMAINDERF])
246   REPLACE_REMAINDERL=0;        AC_SUBST([REPLACE_REMAINDERL])
247   REPLACE_ROUND=0;             AC_SUBST([REPLACE_ROUND])
248   REPLACE_ROUNDF=0;            AC_SUBST([REPLACE_ROUNDF])
249   REPLACE_ROUNDL=0;            AC_SUBST([REPLACE_ROUNDL])
250   REPLACE_SIGNBIT=0;           AC_SUBST([REPLACE_SIGNBIT])
251   REPLACE_SIGNBIT_USING_GCC=0; AC_SUBST([REPLACE_SIGNBIT_USING_GCC])
252   REPLACE_TRUNC=0;             AC_SUBST([REPLACE_TRUNC])
253   REPLACE_TRUNCF=0;            AC_SUBST([REPLACE_TRUNCF])
254   REPLACE_TRUNCL=0;            AC_SUBST([REPLACE_TRUNCL])
255 ])
256
257 # gl_LONG_DOUBLE_VS_DOUBLE
258 # determines whether 'long double' and 'double' have the same representation.
259 # Sets variable HAVE_SAME_LONG_DOUBLE_AS_DOUBLE to 0 or 1, and defines
260 # HAVE_SAME_LONG_DOUBLE_AS_DOUBLE accordingly.
261 # The currently known platforms where this is the case are:
262 # Linux/HPPA, Minix 3.1.8, AIX 5, AIX 6 and 7 with xlc, MSVC 9.
263 AC_DEFUN([gl_LONG_DOUBLE_VS_DOUBLE],
264 [
265   AC_CACHE_CHECK([whether long double and double are the same],
266     [gl_cv_long_double_equals_double],
267     [AC_COMPILE_IFELSE(
268        [AC_LANG_PROGRAM([[#include <float.h>]],
269           [[typedef int check[sizeof (long double) == sizeof (double)
270                               && LDBL_MANT_DIG == DBL_MANT_DIG
271                               && LDBL_MAX_EXP == DBL_MAX_EXP
272                               && LDBL_MIN_EXP == DBL_MIN_EXP
273                               ? 1 : -1];
274           ]])],
275        [gl_cv_long_double_equals_double=yes],
276        [gl_cv_long_double_equals_double=no])
277     ])
278   if test $gl_cv_long_double_equals_double = yes; then
279     AC_DEFINE([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE], [1],
280       [Define to 1 if 'long double' and 'double' have the same representation.])
281     HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
282   else
283     HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
284   fi
285   AC_SUBST([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE])
286 ])