modf-ieee: Work around test failures on *BSD, IRIX, OSF/1, Cygwin.
[gnulib.git] / m4 / math_h.m4
1 # math_h.m4 serial 64
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      ceilf ceill copysign copysignf copysignl cosf cosl coshf
44      expf expl fabsf fabsl floorf floorl fma fmaf fmal fmodf fmodl frexpf frexpl
45      ldexpf ldexpl logb logf logl log10f log10l modf modff modfl powf
46      remainder remainderf remainderl
47      rint rintf rintl round roundf roundl sinf sinl sinhf sqrtf sqrtl
48      tanf tanl tanhf trunc truncf truncl])
49 ])
50
51 AC_DEFUN([gl_MATH_MODULE_INDICATOR],
52 [
53   dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
54   AC_REQUIRE([gl_MATH_H_DEFAULTS])
55   gl_MODULE_INDICATOR_SET_VARIABLE([$1])
56   dnl Define it also as a C macro, for the benefit of the unit tests.
57   gl_MODULE_INDICATOR_FOR_TESTS([$1])
58 ])
59
60 AC_DEFUN([gl_MATH_H_DEFAULTS],
61 [
62   GNULIB_ACOSF=0;      AC_SUBST([GNULIB_ACOSF])
63   GNULIB_ACOSL=0;      AC_SUBST([GNULIB_ACOSL])
64   GNULIB_ASINF=0;      AC_SUBST([GNULIB_ASINF])
65   GNULIB_ASINL=0;      AC_SUBST([GNULIB_ASINL])
66   GNULIB_ATANF=0;      AC_SUBST([GNULIB_ATANF])
67   GNULIB_ATANL=0;      AC_SUBST([GNULIB_ATANL])
68   GNULIB_ATAN2F=0;     AC_SUBST([GNULIB_ATAN2F])
69   GNULIB_CEIL=0;       AC_SUBST([GNULIB_CEIL])
70   GNULIB_CEILF=0;      AC_SUBST([GNULIB_CEILF])
71   GNULIB_CEILL=0;      AC_SUBST([GNULIB_CEILL])
72   GNULIB_COPYSIGN=0;   AC_SUBST([GNULIB_COPYSIGN])
73   GNULIB_COPYSIGNF=0;  AC_SUBST([GNULIB_COPYSIGNF])
74   GNULIB_COPYSIGNL=0;  AC_SUBST([GNULIB_COPYSIGNL])
75   GNULIB_COSF=0;       AC_SUBST([GNULIB_COSF])
76   GNULIB_COSL=0;       AC_SUBST([GNULIB_COSL])
77   GNULIB_COSHF=0;      AC_SUBST([GNULIB_COSHF])
78   GNULIB_EXPF=0;       AC_SUBST([GNULIB_EXPF])
79   GNULIB_EXPL=0;       AC_SUBST([GNULIB_EXPL])
80   GNULIB_FABSF=0;      AC_SUBST([GNULIB_FABSF])
81   GNULIB_FABSL=0;      AC_SUBST([GNULIB_FABSL])
82   GNULIB_FLOOR=0;      AC_SUBST([GNULIB_FLOOR])
83   GNULIB_FLOORF=0;     AC_SUBST([GNULIB_FLOORF])
84   GNULIB_FLOORL=0;     AC_SUBST([GNULIB_FLOORL])
85   GNULIB_FMA=0;        AC_SUBST([GNULIB_FMA])
86   GNULIB_FMAF=0;       AC_SUBST([GNULIB_FMAF])
87   GNULIB_FMAL=0;       AC_SUBST([GNULIB_FMAL])
88   GNULIB_FMODF=0;      AC_SUBST([GNULIB_FMODF])
89   GNULIB_FMODL=0;      AC_SUBST([GNULIB_FMODL])
90   GNULIB_FREXPF=0;     AC_SUBST([GNULIB_FREXPF])
91   GNULIB_FREXP=0;      AC_SUBST([GNULIB_FREXP])
92   GNULIB_FREXPL=0;     AC_SUBST([GNULIB_FREXPL])
93   GNULIB_ISFINITE=0;   AC_SUBST([GNULIB_ISFINITE])
94   GNULIB_ISINF=0;      AC_SUBST([GNULIB_ISINF])
95   GNULIB_ISNAN=0;      AC_SUBST([GNULIB_ISNAN])
96   GNULIB_ISNANF=0;     AC_SUBST([GNULIB_ISNANF])
97   GNULIB_ISNAND=0;     AC_SUBST([GNULIB_ISNAND])
98   GNULIB_ISNANL=0;     AC_SUBST([GNULIB_ISNANL])
99   GNULIB_LDEXPF=0;     AC_SUBST([GNULIB_LDEXPF])
100   GNULIB_LDEXPL=0;     AC_SUBST([GNULIB_LDEXPL])
101   GNULIB_LOGB=0;       AC_SUBST([GNULIB_LOGB])
102   GNULIB_LOGF=0;       AC_SUBST([GNULIB_LOGF])
103   GNULIB_LOGL=0;       AC_SUBST([GNULIB_LOGL])
104   GNULIB_LOG10F=0;     AC_SUBST([GNULIB_LOG10F])
105   GNULIB_LOG10L=0;     AC_SUBST([GNULIB_LOG10L])
106   GNULIB_MODF=0;       AC_SUBST([GNULIB_MODF])
107   GNULIB_MODFF=0;      AC_SUBST([GNULIB_MODFF])
108   GNULIB_MODFL=0;      AC_SUBST([GNULIB_MODFL])
109   GNULIB_POWF=0;       AC_SUBST([GNULIB_POWF])
110   GNULIB_REMAINDER=0;  AC_SUBST([GNULIB_REMAINDER])
111   GNULIB_REMAINDERF=0; AC_SUBST([GNULIB_REMAINDERF])
112   GNULIB_REMAINDERL=0; AC_SUBST([GNULIB_REMAINDERL])
113   GNULIB_RINT=0;       AC_SUBST([GNULIB_RINT])
114   GNULIB_RINTF=0;      AC_SUBST([GNULIB_RINTF])
115   GNULIB_RINTL=0;      AC_SUBST([GNULIB_RINTL])
116   GNULIB_ROUND=0;      AC_SUBST([GNULIB_ROUND])
117   GNULIB_ROUNDF=0;     AC_SUBST([GNULIB_ROUNDF])
118   GNULIB_ROUNDL=0;     AC_SUBST([GNULIB_ROUNDL])
119   GNULIB_SIGNBIT=0;    AC_SUBST([GNULIB_SIGNBIT])
120   GNULIB_SINF=0;       AC_SUBST([GNULIB_SINF])
121   GNULIB_SINL=0;       AC_SUBST([GNULIB_SINL])
122   GNULIB_SINHF=0;      AC_SUBST([GNULIB_SINHF])
123   GNULIB_SQRTF=0;      AC_SUBST([GNULIB_SQRTF])
124   GNULIB_SQRTL=0;      AC_SUBST([GNULIB_SQRTL])
125   GNULIB_TANF=0;       AC_SUBST([GNULIB_TANF])
126   GNULIB_TANL=0;       AC_SUBST([GNULIB_TANL])
127   GNULIB_TANHF=0;      AC_SUBST([GNULIB_TANHF])
128   GNULIB_TRUNC=0;      AC_SUBST([GNULIB_TRUNC])
129   GNULIB_TRUNCF=0;     AC_SUBST([GNULIB_TRUNCF])
130   GNULIB_TRUNCL=0;     AC_SUBST([GNULIB_TRUNCL])
131   dnl Assume proper GNU behavior unless another module says otherwise.
132   HAVE_ACOSF=1;                AC_SUBST([HAVE_ACOSF])
133   HAVE_ACOSL=1;                AC_SUBST([HAVE_ACOSL])
134   HAVE_ASINF=1;                AC_SUBST([HAVE_ASINF])
135   HAVE_ASINL=1;                AC_SUBST([HAVE_ASINL])
136   HAVE_ATANF=1;                AC_SUBST([HAVE_ATANF])
137   HAVE_ATANL=1;                AC_SUBST([HAVE_ATANL])
138   HAVE_ATAN2F=1;               AC_SUBST([HAVE_ATAN2F])
139   HAVE_COPYSIGN=1;             AC_SUBST([HAVE_COPYSIGN])
140   HAVE_COPYSIGNF=1;            AC_SUBST([HAVE_COPYSIGNF])
141   HAVE_COPYSIGNL=1;            AC_SUBST([HAVE_COPYSIGNL])
142   HAVE_COSF=1;                 AC_SUBST([HAVE_COSF])
143   HAVE_COSL=1;                 AC_SUBST([HAVE_COSL])
144   HAVE_COSHF=1;                AC_SUBST([HAVE_COSHF])
145   HAVE_EXPF=1;                 AC_SUBST([HAVE_EXPF])
146   HAVE_EXPL=1;                 AC_SUBST([HAVE_EXPL])
147   HAVE_FABSF=1;                AC_SUBST([HAVE_FABSF])
148   HAVE_FABSL=1;                AC_SUBST([HAVE_FABSL])
149   HAVE_FMA=1;                  AC_SUBST([HAVE_FMA])
150   HAVE_FMAF=1;                 AC_SUBST([HAVE_FMAF])
151   HAVE_FMAL=1;                 AC_SUBST([HAVE_FMAL])
152   HAVE_FMODF=1;                AC_SUBST([HAVE_FMODF])
153   HAVE_FMODL=1;                AC_SUBST([HAVE_FMODL])
154   HAVE_FREXPF=1;               AC_SUBST([HAVE_FREXPF])
155   HAVE_ISNANF=1;               AC_SUBST([HAVE_ISNANF])
156   HAVE_ISNAND=1;               AC_SUBST([HAVE_ISNAND])
157   HAVE_ISNANL=1;               AC_SUBST([HAVE_ISNANL])
158   HAVE_LDEXPF=1;               AC_SUBST([HAVE_LDEXPF])
159   HAVE_LOGF=1;                 AC_SUBST([HAVE_LOGF])
160   HAVE_LOGL=1;                 AC_SUBST([HAVE_LOGL])
161   HAVE_LOG10F=1;               AC_SUBST([HAVE_LOG10F])
162   HAVE_LOG10L=1;               AC_SUBST([HAVE_LOG10L])
163   HAVE_MODFF=1;                AC_SUBST([HAVE_MODFF])
164   HAVE_MODFL=1;                AC_SUBST([HAVE_MODFL])
165   HAVE_POWF=1;                 AC_SUBST([HAVE_POWF])
166   HAVE_REMAINDER=1;            AC_SUBST([HAVE_REMAINDER])
167   HAVE_REMAINDERF=1;           AC_SUBST([HAVE_REMAINDERF])
168   HAVE_REMAINDERL=1;           AC_SUBST([HAVE_REMAINDERL])
169   HAVE_RINT=1;                 AC_SUBST([HAVE_RINT])
170   HAVE_RINTF=1;                AC_SUBST([HAVE_RINTF])
171   HAVE_RINTL=1;                AC_SUBST([HAVE_RINTL])
172   HAVE_SINF=1;                 AC_SUBST([HAVE_SINF])
173   HAVE_SINL=1;                 AC_SUBST([HAVE_SINL])
174   HAVE_SINHF=1;                AC_SUBST([HAVE_SINHF])
175   HAVE_SQRTF=1;                AC_SUBST([HAVE_SQRTF])
176   HAVE_SQRTL=1;                AC_SUBST([HAVE_SQRTL])
177   HAVE_TANF=1;                 AC_SUBST([HAVE_TANF])
178   HAVE_TANL=1;                 AC_SUBST([HAVE_TANL])
179   HAVE_TANHF=1;                AC_SUBST([HAVE_TANHF])
180   HAVE_DECL_ACOSL=1;           AC_SUBST([HAVE_DECL_ACOSL])
181   HAVE_DECL_ASINL=1;           AC_SUBST([HAVE_DECL_ASINL])
182   HAVE_DECL_ATANL=1;           AC_SUBST([HAVE_DECL_ATANL])
183   HAVE_DECL_CEILF=1;           AC_SUBST([HAVE_DECL_CEILF])
184   HAVE_DECL_CEILL=1;           AC_SUBST([HAVE_DECL_CEILL])
185   HAVE_DECL_COSL=1;            AC_SUBST([HAVE_DECL_COSL])
186   HAVE_DECL_EXPL=1;            AC_SUBST([HAVE_DECL_EXPL])
187   HAVE_DECL_FLOORF=1;          AC_SUBST([HAVE_DECL_FLOORF])
188   HAVE_DECL_FLOORL=1;          AC_SUBST([HAVE_DECL_FLOORL])
189   HAVE_DECL_FREXPL=1;          AC_SUBST([HAVE_DECL_FREXPL])
190   HAVE_DECL_LDEXPL=1;          AC_SUBST([HAVE_DECL_LDEXPL])
191   HAVE_DECL_LOGB=1;            AC_SUBST([HAVE_DECL_LOGB])
192   HAVE_DECL_LOGL=1;            AC_SUBST([HAVE_DECL_LOGL])
193   HAVE_DECL_LOG10L=1;          AC_SUBST([HAVE_DECL_LOG10L])
194   HAVE_DECL_REMAINDER=1;       AC_SUBST([HAVE_DECL_REMAINDER])
195   HAVE_DECL_ROUND=1;           AC_SUBST([HAVE_DECL_ROUND])
196   HAVE_DECL_ROUNDF=1;          AC_SUBST([HAVE_DECL_ROUNDF])
197   HAVE_DECL_ROUNDL=1;          AC_SUBST([HAVE_DECL_ROUNDL])
198   HAVE_DECL_SINL=1;            AC_SUBST([HAVE_DECL_SINL])
199   HAVE_DECL_SQRTL=1;           AC_SUBST([HAVE_DECL_SQRTL])
200   HAVE_DECL_TANL=1;            AC_SUBST([HAVE_DECL_TANL])
201   HAVE_DECL_TRUNC=1;           AC_SUBST([HAVE_DECL_TRUNC])
202   HAVE_DECL_TRUNCF=1;          AC_SUBST([HAVE_DECL_TRUNCF])
203   HAVE_DECL_TRUNCL=1;          AC_SUBST([HAVE_DECL_TRUNCL])
204   REPLACE_CEIL=0;              AC_SUBST([REPLACE_CEIL])
205   REPLACE_CEILF=0;             AC_SUBST([REPLACE_CEILF])
206   REPLACE_CEILL=0;             AC_SUBST([REPLACE_CEILL])
207   REPLACE_FABSL=0;             AC_SUBST([REPLACE_FABSL])
208   REPLACE_FLOOR=0;             AC_SUBST([REPLACE_FLOOR])
209   REPLACE_FLOORF=0;            AC_SUBST([REPLACE_FLOORF])
210   REPLACE_FLOORL=0;            AC_SUBST([REPLACE_FLOORL])
211   REPLACE_FMA=0;               AC_SUBST([REPLACE_FMA])
212   REPLACE_FMAF=0;              AC_SUBST([REPLACE_FMAF])
213   REPLACE_FMAL=0;              AC_SUBST([REPLACE_FMAL])
214   REPLACE_FMODL=0;             AC_SUBST([REPLACE_FMODL])
215   REPLACE_FREXPF=0;            AC_SUBST([REPLACE_FREXPF])
216   REPLACE_FREXP=0;             AC_SUBST([REPLACE_FREXP])
217   REPLACE_FREXPL=0;            AC_SUBST([REPLACE_FREXPL])
218   REPLACE_HUGE_VAL=0;          AC_SUBST([REPLACE_HUGE_VAL])
219   REPLACE_ISFINITE=0;          AC_SUBST([REPLACE_ISFINITE])
220   REPLACE_ISINF=0;             AC_SUBST([REPLACE_ISINF])
221   REPLACE_ISNAN=0;             AC_SUBST([REPLACE_ISNAN])
222   REPLACE_LDEXPL=0;            AC_SUBST([REPLACE_LDEXPL])
223   REPLACE_MODF=0;              AC_SUBST([REPLACE_MODF])
224   REPLACE_NAN=0;               AC_SUBST([REPLACE_NAN])
225   REPLACE_ROUND=0;             AC_SUBST([REPLACE_ROUND])
226   REPLACE_ROUNDF=0;            AC_SUBST([REPLACE_ROUNDF])
227   REPLACE_ROUNDL=0;            AC_SUBST([REPLACE_ROUNDL])
228   REPLACE_SIGNBIT=0;           AC_SUBST([REPLACE_SIGNBIT])
229   REPLACE_SIGNBIT_USING_GCC=0; AC_SUBST([REPLACE_SIGNBIT_USING_GCC])
230   REPLACE_TRUNC=0;             AC_SUBST([REPLACE_TRUNC])
231   REPLACE_TRUNCF=0;            AC_SUBST([REPLACE_TRUNCF])
232   REPLACE_TRUNCL=0;            AC_SUBST([REPLACE_TRUNCL])
233 ])
234
235 # gl_LONG_DOUBLE_VS_DOUBLE
236 # determines whether 'long double' and 'double' have the same representation.
237 # Sets variable HAVE_SAME_LONG_DOUBLE_AS_DOUBLE to 0 or 1, and defines
238 # HAVE_SAME_LONG_DOUBLE_AS_DOUBLE accordingly.
239 # The currently known platforms where this is the case are:
240 # Linux/HPPA, Minix 3.1.8, AIX 5, AIX 6 and 7 with xlc, MSVC 9.
241 AC_DEFUN([gl_LONG_DOUBLE_VS_DOUBLE],
242 [
243   AC_CACHE_CHECK([whether long double and double are the same],
244     [gl_cv_long_double_equals_double],
245     [AC_COMPILE_IFELSE(
246        [AC_LANG_PROGRAM([[#include <float.h>]],
247           [[typedef int check[sizeof (long double) == sizeof (double)
248                               && LDBL_MANT_DIG == DBL_MANT_DIG
249                               && LDBL_MAX_EXP == DBL_MAX_EXP
250                               && LDBL_MIN_EXP == DBL_MIN_EXP
251                               ? 1 : -1];
252           ]])],
253        [gl_cv_long_double_equals_double=yes],
254        [gl_cv_long_double_equals_double=no])
255     ])
256   if test $gl_cv_long_double_equals_double = yes; then
257     AC_DEFINE([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE], [1],
258       [Define to 1 if 'long double' and 'double' have the same representation.])
259     HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=1
260   else
261     HAVE_SAME_LONG_DOUBLE_AS_DOUBLE=0
262   fi
263   AC_SUBST([HAVE_SAME_LONG_DOUBLE_AS_DOUBLE])
264 ])