cbrt: Provide replacement on MSVC and Minix.
[gnulib.git] / m4 / math_h.m4
1 # math_h.m4 serial 76
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 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_CEIL=0;       AC_SUBST([GNULIB_CEIL])
72   GNULIB_CEILF=0;      AC_SUBST([GNULIB_CEILF])
73   GNULIB_CEILL=0;      AC_SUBST([GNULIB_CEILL])
74   GNULIB_COPYSIGN=0;   AC_SUBST([GNULIB_COPYSIGN])
75   GNULIB_COPYSIGNF=0;  AC_SUBST([GNULIB_COPYSIGNF])
76   GNULIB_COPYSIGNL=0;  AC_SUBST([GNULIB_COPYSIGNL])
77   GNULIB_COSF=0;       AC_SUBST([GNULIB_COSF])
78   GNULIB_COSL=0;       AC_SUBST([GNULIB_COSL])
79   GNULIB_COSHF=0;      AC_SUBST([GNULIB_COSHF])
80   GNULIB_EXPF=0;       AC_SUBST([GNULIB_EXPF])
81   GNULIB_EXPL=0;       AC_SUBST([GNULIB_EXPL])
82   GNULIB_FABSF=0;      AC_SUBST([GNULIB_FABSF])
83   GNULIB_FABSL=0;      AC_SUBST([GNULIB_FABSL])
84   GNULIB_FLOOR=0;      AC_SUBST([GNULIB_FLOOR])
85   GNULIB_FLOORF=0;     AC_SUBST([GNULIB_FLOORF])
86   GNULIB_FLOORL=0;     AC_SUBST([GNULIB_FLOORL])
87   GNULIB_FMA=0;        AC_SUBST([GNULIB_FMA])
88   GNULIB_FMAF=0;       AC_SUBST([GNULIB_FMAF])
89   GNULIB_FMAL=0;       AC_SUBST([GNULIB_FMAL])
90   GNULIB_FMOD=0;       AC_SUBST([GNULIB_FMOD])
91   GNULIB_FMODF=0;      AC_SUBST([GNULIB_FMODF])
92   GNULIB_FMODL=0;      AC_SUBST([GNULIB_FMODL])
93   GNULIB_FREXPF=0;     AC_SUBST([GNULIB_FREXPF])
94   GNULIB_FREXP=0;      AC_SUBST([GNULIB_FREXP])
95   GNULIB_FREXPL=0;     AC_SUBST([GNULIB_FREXPL])
96   GNULIB_HYPOT=0;      AC_SUBST([GNULIB_HYPOT])
97   GNULIB_HYPOTF=0;     AC_SUBST([GNULIB_HYPOTF])
98   GNULIB_HYPOTL=0;     AC_SUBST([GNULIB_HYPOTL])
99   GNULIB_ISFINITE=0;   AC_SUBST([GNULIB_ISFINITE])
100   GNULIB_ISINF=0;      AC_SUBST([GNULIB_ISINF])
101   GNULIB_ISNAN=0;      AC_SUBST([GNULIB_ISNAN])
102   GNULIB_ISNANF=0;     AC_SUBST([GNULIB_ISNANF])
103   GNULIB_ISNAND=0;     AC_SUBST([GNULIB_ISNAND])
104   GNULIB_ISNANL=0;     AC_SUBST([GNULIB_ISNANL])
105   GNULIB_LDEXPF=0;     AC_SUBST([GNULIB_LDEXPF])
106   GNULIB_LDEXPL=0;     AC_SUBST([GNULIB_LDEXPL])
107   GNULIB_LOGB=0;       AC_SUBST([GNULIB_LOGB])
108   GNULIB_LOGF=0;       AC_SUBST([GNULIB_LOGF])
109   GNULIB_LOGL=0;       AC_SUBST([GNULIB_LOGL])
110   GNULIB_LOG10F=0;     AC_SUBST([GNULIB_LOG10F])
111   GNULIB_LOG10L=0;     AC_SUBST([GNULIB_LOG10L])
112   GNULIB_MODF=0;       AC_SUBST([GNULIB_MODF])
113   GNULIB_MODFF=0;      AC_SUBST([GNULIB_MODFF])
114   GNULIB_MODFL=0;      AC_SUBST([GNULIB_MODFL])
115   GNULIB_POWF=0;       AC_SUBST([GNULIB_POWF])
116   GNULIB_REMAINDER=0;  AC_SUBST([GNULIB_REMAINDER])
117   GNULIB_REMAINDERF=0; AC_SUBST([GNULIB_REMAINDERF])
118   GNULIB_REMAINDERL=0; AC_SUBST([GNULIB_REMAINDERL])
119   GNULIB_RINT=0;       AC_SUBST([GNULIB_RINT])
120   GNULIB_RINTF=0;      AC_SUBST([GNULIB_RINTF])
121   GNULIB_RINTL=0;      AC_SUBST([GNULIB_RINTL])
122   GNULIB_ROUND=0;      AC_SUBST([GNULIB_ROUND])
123   GNULIB_ROUNDF=0;     AC_SUBST([GNULIB_ROUNDF])
124   GNULIB_ROUNDL=0;     AC_SUBST([GNULIB_ROUNDL])
125   GNULIB_SIGNBIT=0;    AC_SUBST([GNULIB_SIGNBIT])
126   GNULIB_SINF=0;       AC_SUBST([GNULIB_SINF])
127   GNULIB_SINL=0;       AC_SUBST([GNULIB_SINL])
128   GNULIB_SINHF=0;      AC_SUBST([GNULIB_SINHF])
129   GNULIB_SQRTF=0;      AC_SUBST([GNULIB_SQRTF])
130   GNULIB_SQRTL=0;      AC_SUBST([GNULIB_SQRTL])
131   GNULIB_TANF=0;       AC_SUBST([GNULIB_TANF])
132   GNULIB_TANL=0;       AC_SUBST([GNULIB_TANL])
133   GNULIB_TANHF=0;      AC_SUBST([GNULIB_TANHF])
134   GNULIB_TRUNC=0;      AC_SUBST([GNULIB_TRUNC])
135   GNULIB_TRUNCF=0;     AC_SUBST([GNULIB_TRUNCF])
136   GNULIB_TRUNCL=0;     AC_SUBST([GNULIB_TRUNCL])
137   dnl Assume proper GNU behavior unless another module says otherwise.
138   HAVE_ACOSF=1;                AC_SUBST([HAVE_ACOSF])
139   HAVE_ACOSL=1;                AC_SUBST([HAVE_ACOSL])
140   HAVE_ASINF=1;                AC_SUBST([HAVE_ASINF])
141   HAVE_ASINL=1;                AC_SUBST([HAVE_ASINL])
142   HAVE_ATANF=1;                AC_SUBST([HAVE_ATANF])
143   HAVE_ATANL=1;                AC_SUBST([HAVE_ATANL])
144   HAVE_ATAN2F=1;               AC_SUBST([HAVE_ATAN2F])
145   HAVE_CBRT=1;                 AC_SUBST([HAVE_CBRT])
146   HAVE_COPYSIGN=1;             AC_SUBST([HAVE_COPYSIGN])
147   HAVE_COPYSIGNF=1;            AC_SUBST([HAVE_COPYSIGNF])
148   HAVE_COPYSIGNL=1;            AC_SUBST([HAVE_COPYSIGNL])
149   HAVE_COSF=1;                 AC_SUBST([HAVE_COSF])
150   HAVE_COSL=1;                 AC_SUBST([HAVE_COSL])
151   HAVE_COSHF=1;                AC_SUBST([HAVE_COSHF])
152   HAVE_EXPF=1;                 AC_SUBST([HAVE_EXPF])
153   HAVE_EXPL=1;                 AC_SUBST([HAVE_EXPL])
154   HAVE_FABSF=1;                AC_SUBST([HAVE_FABSF])
155   HAVE_FABSL=1;                AC_SUBST([HAVE_FABSL])
156   HAVE_FMA=1;                  AC_SUBST([HAVE_FMA])
157   HAVE_FMAF=1;                 AC_SUBST([HAVE_FMAF])
158   HAVE_FMAL=1;                 AC_SUBST([HAVE_FMAL])
159   HAVE_FMODF=1;                AC_SUBST([HAVE_FMODF])
160   HAVE_FMODL=1;                AC_SUBST([HAVE_FMODL])
161   HAVE_FREXPF=1;               AC_SUBST([HAVE_FREXPF])
162   HAVE_HYPOTF=1;               AC_SUBST([HAVE_HYPOTF])
163   HAVE_HYPOTL=1;               AC_SUBST([HAVE_HYPOTL])
164   HAVE_ISNANF=1;               AC_SUBST([HAVE_ISNANF])
165   HAVE_ISNAND=1;               AC_SUBST([HAVE_ISNAND])
166   HAVE_ISNANL=1;               AC_SUBST([HAVE_ISNANL])
167   HAVE_LDEXPF=1;               AC_SUBST([HAVE_LDEXPF])
168   HAVE_LOGF=1;                 AC_SUBST([HAVE_LOGF])
169   HAVE_LOGL=1;                 AC_SUBST([HAVE_LOGL])
170   HAVE_LOG10F=1;               AC_SUBST([HAVE_LOG10F])
171   HAVE_LOG10L=1;               AC_SUBST([HAVE_LOG10L])
172   HAVE_MODFF=1;                AC_SUBST([HAVE_MODFF])
173   HAVE_MODFL=1;                AC_SUBST([HAVE_MODFL])
174   HAVE_POWF=1;                 AC_SUBST([HAVE_POWF])
175   HAVE_REMAINDER=1;            AC_SUBST([HAVE_REMAINDER])
176   HAVE_REMAINDERF=1;           AC_SUBST([HAVE_REMAINDERF])
177   HAVE_REMAINDERL=1;           AC_SUBST([HAVE_REMAINDERL])
178   HAVE_RINT=1;                 AC_SUBST([HAVE_RINT])
179   HAVE_RINTF=1;                AC_SUBST([HAVE_RINTF])
180   HAVE_RINTL=1;                AC_SUBST([HAVE_RINTL])
181   HAVE_SINF=1;                 AC_SUBST([HAVE_SINF])
182   HAVE_SINL=1;                 AC_SUBST([HAVE_SINL])
183   HAVE_SINHF=1;                AC_SUBST([HAVE_SINHF])
184   HAVE_SQRTF=1;                AC_SUBST([HAVE_SQRTF])
185   HAVE_SQRTL=1;                AC_SUBST([HAVE_SQRTL])
186   HAVE_TANF=1;                 AC_SUBST([HAVE_TANF])
187   HAVE_TANL=1;                 AC_SUBST([HAVE_TANL])
188   HAVE_TANHF=1;                AC_SUBST([HAVE_TANHF])
189   HAVE_DECL_ACOSL=1;           AC_SUBST([HAVE_DECL_ACOSL])
190   HAVE_DECL_ASINL=1;           AC_SUBST([HAVE_DECL_ASINL])
191   HAVE_DECL_ATANL=1;           AC_SUBST([HAVE_DECL_ATANL])
192   HAVE_DECL_CEILF=1;           AC_SUBST([HAVE_DECL_CEILF])
193   HAVE_DECL_CEILL=1;           AC_SUBST([HAVE_DECL_CEILL])
194   HAVE_DECL_COSL=1;            AC_SUBST([HAVE_DECL_COSL])
195   HAVE_DECL_EXPL=1;            AC_SUBST([HAVE_DECL_EXPL])
196   HAVE_DECL_FLOORF=1;          AC_SUBST([HAVE_DECL_FLOORF])
197   HAVE_DECL_FLOORL=1;          AC_SUBST([HAVE_DECL_FLOORL])
198   HAVE_DECL_FREXPL=1;          AC_SUBST([HAVE_DECL_FREXPL])
199   HAVE_DECL_LDEXPL=1;          AC_SUBST([HAVE_DECL_LDEXPL])
200   HAVE_DECL_LOGB=1;            AC_SUBST([HAVE_DECL_LOGB])
201   HAVE_DECL_LOGL=1;            AC_SUBST([HAVE_DECL_LOGL])
202   HAVE_DECL_LOG10L=1;          AC_SUBST([HAVE_DECL_LOG10L])
203   HAVE_DECL_REMAINDER=1;       AC_SUBST([HAVE_DECL_REMAINDER])
204   HAVE_DECL_ROUND=1;           AC_SUBST([HAVE_DECL_ROUND])
205   HAVE_DECL_ROUNDF=1;          AC_SUBST([HAVE_DECL_ROUNDF])
206   HAVE_DECL_ROUNDL=1;          AC_SUBST([HAVE_DECL_ROUNDL])
207   HAVE_DECL_SINL=1;            AC_SUBST([HAVE_DECL_SINL])
208   HAVE_DECL_SQRTL=1;           AC_SUBST([HAVE_DECL_SQRTL])
209   HAVE_DECL_TANL=1;            AC_SUBST([HAVE_DECL_TANL])
210   HAVE_DECL_TRUNC=1;           AC_SUBST([HAVE_DECL_TRUNC])
211   HAVE_DECL_TRUNCF=1;          AC_SUBST([HAVE_DECL_TRUNCF])
212   HAVE_DECL_TRUNCL=1;          AC_SUBST([HAVE_DECL_TRUNCL])
213   REPLACE_CEIL=0;              AC_SUBST([REPLACE_CEIL])
214   REPLACE_CEILF=0;             AC_SUBST([REPLACE_CEILF])
215   REPLACE_CEILL=0;             AC_SUBST([REPLACE_CEILL])
216   REPLACE_FABSL=0;             AC_SUBST([REPLACE_FABSL])
217   REPLACE_FLOOR=0;             AC_SUBST([REPLACE_FLOOR])
218   REPLACE_FLOORF=0;            AC_SUBST([REPLACE_FLOORF])
219   REPLACE_FLOORL=0;            AC_SUBST([REPLACE_FLOORL])
220   REPLACE_FMA=0;               AC_SUBST([REPLACE_FMA])
221   REPLACE_FMAF=0;              AC_SUBST([REPLACE_FMAF])
222   REPLACE_FMAL=0;              AC_SUBST([REPLACE_FMAL])
223   REPLACE_FMOD=0;              AC_SUBST([REPLACE_FMOD])
224   REPLACE_FMODF=0;             AC_SUBST([REPLACE_FMODF])
225   REPLACE_FMODL=0;             AC_SUBST([REPLACE_FMODL])
226   REPLACE_FREXPF=0;            AC_SUBST([REPLACE_FREXPF])
227   REPLACE_FREXP=0;             AC_SUBST([REPLACE_FREXP])
228   REPLACE_FREXPL=0;            AC_SUBST([REPLACE_FREXPL])
229   REPLACE_HUGE_VAL=0;          AC_SUBST([REPLACE_HUGE_VAL])
230   REPLACE_HYPOT=0;             AC_SUBST([REPLACE_HYPOT])
231   REPLACE_HYPOTF=0;            AC_SUBST([REPLACE_HYPOTF])
232   REPLACE_HYPOTL=0;            AC_SUBST([REPLACE_HYPOTL])
233   REPLACE_ISFINITE=0;          AC_SUBST([REPLACE_ISFINITE])
234   REPLACE_ISINF=0;             AC_SUBST([REPLACE_ISINF])
235   REPLACE_ISNAN=0;             AC_SUBST([REPLACE_ISNAN])
236   REPLACE_LDEXPL=0;            AC_SUBST([REPLACE_LDEXPL])
237   REPLACE_MODF=0;              AC_SUBST([REPLACE_MODF])
238   REPLACE_MODFF=0;             AC_SUBST([REPLACE_MODFF])
239   REPLACE_MODFL=0;             AC_SUBST([REPLACE_MODFL])
240   REPLACE_NAN=0;               AC_SUBST([REPLACE_NAN])
241   REPLACE_REMAINDER=0;         AC_SUBST([REPLACE_REMAINDER])
242   REPLACE_REMAINDERF=0;        AC_SUBST([REPLACE_REMAINDERF])
243   REPLACE_REMAINDERL=0;        AC_SUBST([REPLACE_REMAINDERL])
244   REPLACE_ROUND=0;             AC_SUBST([REPLACE_ROUND])
245   REPLACE_ROUNDF=0;            AC_SUBST([REPLACE_ROUNDF])
246   REPLACE_ROUNDL=0;            AC_SUBST([REPLACE_ROUNDL])
247   REPLACE_SIGNBIT=0;           AC_SUBST([REPLACE_SIGNBIT])
248   REPLACE_SIGNBIT_USING_GCC=0; AC_SUBST([REPLACE_SIGNBIT_USING_GCC])
249   REPLACE_TRUNC=0;             AC_SUBST([REPLACE_TRUNC])
250   REPLACE_TRUNCF=0;            AC_SUBST([REPLACE_TRUNCF])
251   REPLACE_TRUNCL=0;            AC_SUBST([REPLACE_TRUNCL])
252 ])
253
254 # gl_LONG_DOUBLE_VS_DOUBLE
255 # determines whether 'long double' and 'double' have the same representation.
256 # Sets variable HAVE_SAME_LONG_DOUBLE_AS_DOUBLE to 0 or 1, and defines
257 # HAVE_SAME_LONG_DOUBLE_AS_DOUBLE accordingly.
258 # The currently known platforms where this is the case are:
259 # Linux/HPPA, Minix 3.1.8, AIX 5, AIX 6 and 7 with xlc, MSVC 9.
260 AC_DEFUN([gl_LONG_DOUBLE_VS_DOUBLE],
261 [
262   AC_CACHE_CHECK([whether long double and double are the same],
263     [gl_cv_long_double_equals_double],
264     [AC_COMPILE_IFELSE(
265        [AC_LANG_PROGRAM([[#include <float.h>]],
266           [[typedef int check[sizeof (long double) == sizeof (double)
267                               && LDBL_MANT_DIG == DBL_MANT_DIG
268                               && LDBL_MAX_EXP == DBL_MAX_EXP
269                               && LDBL_MIN_EXP == DBL_MIN_EXP
270                               ? 1 : -1];
271           ]])],
272        [gl_cv_long_double_equals_double=yes],
273        [gl_cv_long_double_equals_double=no])
274     ])
275   if test $gl_cv_long_double_equals_double = yes; then
276     AC_DEFINE([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE], [1],
277       [Define to 1 if 'long double' and 'double' have the same representation.])
278     HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
279   else
280     HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
281   fi
282   AC_SUBST([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE])
283 ])