xref: /llvm-project/libcxx/include/__cxx03/math.h (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser // -*- C++ -*-
2e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
3e78f53d1SNikolas Klauser //
4e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
6e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7e78f53d1SNikolas Klauser //
8e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
9e78f53d1SNikolas Klauser 
10*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03_MATH_H
11*ce777190SNikolas Klauser #  define _LIBCPP___CXX03_MATH_H
12e78f53d1SNikolas Klauser 
13e78f53d1SNikolas Klauser /*
14e78f53d1SNikolas Klauser     math.h synopsis
15e78f53d1SNikolas Klauser 
16e78f53d1SNikolas Klauser Macros:
17e78f53d1SNikolas Klauser 
18e78f53d1SNikolas Klauser     HUGE_VAL
19e78f53d1SNikolas Klauser     HUGE_VALF               // C99
20e78f53d1SNikolas Klauser     HUGE_VALL               // C99
21e78f53d1SNikolas Klauser     INFINITY                // C99
22e78f53d1SNikolas Klauser     NAN                     // C99
23e78f53d1SNikolas Klauser     FP_INFINITE             // C99
24e78f53d1SNikolas Klauser     FP_NAN                  // C99
25e78f53d1SNikolas Klauser     FP_NORMAL               // C99
26e78f53d1SNikolas Klauser     FP_SUBNORMAL            // C99
27e78f53d1SNikolas Klauser     FP_ZERO                 // C99
28e78f53d1SNikolas Klauser     FP_FAST_FMA             // C99
29e78f53d1SNikolas Klauser     FP_FAST_FMAF            // C99
30e78f53d1SNikolas Klauser     FP_FAST_FMAL            // C99
31e78f53d1SNikolas Klauser     FP_ILOGB0               // C99
32e78f53d1SNikolas Klauser     FP_ILOGBNAN             // C99
33e78f53d1SNikolas Klauser     MATH_ERRNO              // C99
34e78f53d1SNikolas Klauser     MATH_ERREXCEPT          // C99
35e78f53d1SNikolas Klauser     math_errhandling        // C99
36e78f53d1SNikolas Klauser 
37e78f53d1SNikolas Klauser Types:
38e78f53d1SNikolas Klauser 
39e78f53d1SNikolas Klauser     float_t                 // C99
40e78f53d1SNikolas Klauser     double_t                // C99
41e78f53d1SNikolas Klauser 
42e78f53d1SNikolas Klauser // C90
43e78f53d1SNikolas Klauser 
44e78f53d1SNikolas Klauser floating_point abs(floating_point x);
45e78f53d1SNikolas Klauser 
46e78f53d1SNikolas Klauser floating_point acos (arithmetic x);
47e78f53d1SNikolas Klauser float          acosf(float x);
48e78f53d1SNikolas Klauser long double    acosl(long double x);
49e78f53d1SNikolas Klauser 
50e78f53d1SNikolas Klauser floating_point asin (arithmetic x);
51e78f53d1SNikolas Klauser float          asinf(float x);
52e78f53d1SNikolas Klauser long double    asinl(long double x);
53e78f53d1SNikolas Klauser 
54e78f53d1SNikolas Klauser floating_point atan (arithmetic x);
55e78f53d1SNikolas Klauser float          atanf(float x);
56e78f53d1SNikolas Klauser long double    atanl(long double x);
57e78f53d1SNikolas Klauser 
58e78f53d1SNikolas Klauser floating_point atan2 (arithmetic y, arithmetic x);
59e78f53d1SNikolas Klauser float          atan2f(float y, float x);
60e78f53d1SNikolas Klauser long double    atan2l(long double y, long double x);
61e78f53d1SNikolas Klauser 
62e78f53d1SNikolas Klauser floating_point ceil (arithmetic x);
63e78f53d1SNikolas Klauser float          ceilf(float x);
64e78f53d1SNikolas Klauser long double    ceill(long double x);
65e78f53d1SNikolas Klauser 
66e78f53d1SNikolas Klauser floating_point cos (arithmetic x);
67e78f53d1SNikolas Klauser float          cosf(float x);
68e78f53d1SNikolas Klauser long double    cosl(long double x);
69e78f53d1SNikolas Klauser 
70e78f53d1SNikolas Klauser floating_point cosh (arithmetic x);
71e78f53d1SNikolas Klauser float          coshf(float x);
72e78f53d1SNikolas Klauser long double    coshl(long double x);
73e78f53d1SNikolas Klauser 
74e78f53d1SNikolas Klauser floating_point exp (arithmetic x);
75e78f53d1SNikolas Klauser float          expf(float x);
76e78f53d1SNikolas Klauser long double    expl(long double x);
77e78f53d1SNikolas Klauser 
78e78f53d1SNikolas Klauser floating_point fabs (arithmetic x);
79e78f53d1SNikolas Klauser float          fabsf(float x);
80e78f53d1SNikolas Klauser long double    fabsl(long double x);
81e78f53d1SNikolas Klauser 
82e78f53d1SNikolas Klauser floating_point floor (arithmetic x);
83e78f53d1SNikolas Klauser float          floorf(float x);
84e78f53d1SNikolas Klauser long double    floorl(long double x);
85e78f53d1SNikolas Klauser 
86e78f53d1SNikolas Klauser floating_point fmod (arithmetic x, arithmetic y);
87e78f53d1SNikolas Klauser float          fmodf(float x, float y);
88e78f53d1SNikolas Klauser long double    fmodl(long double x, long double y);
89e78f53d1SNikolas Klauser 
90e78f53d1SNikolas Klauser floating_point frexp (arithmetic value, int* exp);
91e78f53d1SNikolas Klauser float          frexpf(float value, int* exp);
92e78f53d1SNikolas Klauser long double    frexpl(long double value, int* exp);
93e78f53d1SNikolas Klauser 
94e78f53d1SNikolas Klauser floating_point ldexp (arithmetic value, int exp);
95e78f53d1SNikolas Klauser float          ldexpf(float value, int exp);
96e78f53d1SNikolas Klauser long double    ldexpl(long double value, int exp);
97e78f53d1SNikolas Klauser 
98e78f53d1SNikolas Klauser floating_point log (arithmetic x);
99e78f53d1SNikolas Klauser float          logf(float x);
100e78f53d1SNikolas Klauser long double    logl(long double x);
101e78f53d1SNikolas Klauser 
102e78f53d1SNikolas Klauser floating_point log10 (arithmetic x);
103e78f53d1SNikolas Klauser float          log10f(float x);
104e78f53d1SNikolas Klauser long double    log10l(long double x);
105e78f53d1SNikolas Klauser 
106e78f53d1SNikolas Klauser floating_point modf (floating_point value, floating_point* iptr);
107e78f53d1SNikolas Klauser float          modff(float value, float* iptr);
108e78f53d1SNikolas Klauser long double    modfl(long double value, long double* iptr);
109e78f53d1SNikolas Klauser 
110e78f53d1SNikolas Klauser floating_point pow (arithmetic x, arithmetic y);
111e78f53d1SNikolas Klauser float          powf(float x, float y);
112e78f53d1SNikolas Klauser long double    powl(long double x, long double y);
113e78f53d1SNikolas Klauser 
114e78f53d1SNikolas Klauser floating_point sin (arithmetic x);
115e78f53d1SNikolas Klauser float          sinf(float x);
116e78f53d1SNikolas Klauser long double    sinl(long double x);
117e78f53d1SNikolas Klauser 
118e78f53d1SNikolas Klauser floating_point sinh (arithmetic x);
119e78f53d1SNikolas Klauser float          sinhf(float x);
120e78f53d1SNikolas Klauser long double    sinhl(long double x);
121e78f53d1SNikolas Klauser 
122e78f53d1SNikolas Klauser floating_point sqrt (arithmetic x);
123e78f53d1SNikolas Klauser float          sqrtf(float x);
124e78f53d1SNikolas Klauser long double    sqrtl(long double x);
125e78f53d1SNikolas Klauser 
126e78f53d1SNikolas Klauser floating_point tan (arithmetic x);
127e78f53d1SNikolas Klauser float          tanf(float x);
128e78f53d1SNikolas Klauser long double    tanl(long double x);
129e78f53d1SNikolas Klauser 
130e78f53d1SNikolas Klauser floating_point tanh (arithmetic x);
131e78f53d1SNikolas Klauser float          tanhf(float x);
132e78f53d1SNikolas Klauser long double    tanhl(long double x);
133e78f53d1SNikolas Klauser 
134e78f53d1SNikolas Klauser //  C99
135e78f53d1SNikolas Klauser 
136e78f53d1SNikolas Klauser bool signbit(arithmetic x);
137e78f53d1SNikolas Klauser 
138e78f53d1SNikolas Klauser int fpclassify(arithmetic x);
139e78f53d1SNikolas Klauser 
140e78f53d1SNikolas Klauser bool isfinite(arithmetic x);
141e78f53d1SNikolas Klauser bool isinf(arithmetic x);
142e78f53d1SNikolas Klauser bool isnan(arithmetic x);
143e78f53d1SNikolas Klauser bool isnormal(arithmetic x);
144e78f53d1SNikolas Klauser 
145e78f53d1SNikolas Klauser bool isgreater(arithmetic x, arithmetic y);
146e78f53d1SNikolas Klauser bool isgreaterequal(arithmetic x, arithmetic y);
147e78f53d1SNikolas Klauser bool isless(arithmetic x, arithmetic y);
148e78f53d1SNikolas Klauser bool islessequal(arithmetic x, arithmetic y);
149e78f53d1SNikolas Klauser bool islessgreater(arithmetic x, arithmetic y);
150e78f53d1SNikolas Klauser bool isunordered(arithmetic x, arithmetic y);
151e78f53d1SNikolas Klauser 
152e78f53d1SNikolas Klauser floating_point acosh (arithmetic x);
153e78f53d1SNikolas Klauser float          acoshf(float x);
154e78f53d1SNikolas Klauser long double    acoshl(long double x);
155e78f53d1SNikolas Klauser 
156e78f53d1SNikolas Klauser floating_point asinh (arithmetic x);
157e78f53d1SNikolas Klauser float          asinhf(float x);
158e78f53d1SNikolas Klauser long double    asinhl(long double x);
159e78f53d1SNikolas Klauser 
160e78f53d1SNikolas Klauser floating_point atanh (arithmetic x);
161e78f53d1SNikolas Klauser float          atanhf(float x);
162e78f53d1SNikolas Klauser long double    atanhl(long double x);
163e78f53d1SNikolas Klauser 
164e78f53d1SNikolas Klauser floating_point cbrt (arithmetic x);
165e78f53d1SNikolas Klauser float          cbrtf(float x);
166e78f53d1SNikolas Klauser long double    cbrtl(long double x);
167e78f53d1SNikolas Klauser 
168e78f53d1SNikolas Klauser floating_point copysign (arithmetic x, arithmetic y);
169e78f53d1SNikolas Klauser float          copysignf(float x, float y);
170e78f53d1SNikolas Klauser long double    copysignl(long double x, long double y);
171e78f53d1SNikolas Klauser 
172e78f53d1SNikolas Klauser floating_point erf (arithmetic x);
173e78f53d1SNikolas Klauser float          erff(float x);
174e78f53d1SNikolas Klauser long double    erfl(long double x);
175e78f53d1SNikolas Klauser 
176e78f53d1SNikolas Klauser floating_point erfc (arithmetic x);
177e78f53d1SNikolas Klauser float          erfcf(float x);
178e78f53d1SNikolas Klauser long double    erfcl(long double x);
179e78f53d1SNikolas Klauser 
180e78f53d1SNikolas Klauser floating_point exp2 (arithmetic x);
181e78f53d1SNikolas Klauser float          exp2f(float x);
182e78f53d1SNikolas Klauser long double    exp2l(long double x);
183e78f53d1SNikolas Klauser 
184e78f53d1SNikolas Klauser floating_point expm1 (arithmetic x);
185e78f53d1SNikolas Klauser float          expm1f(float x);
186e78f53d1SNikolas Klauser long double    expm1l(long double x);
187e78f53d1SNikolas Klauser 
188e78f53d1SNikolas Klauser floating_point fdim (arithmetic x, arithmetic y);
189e78f53d1SNikolas Klauser float          fdimf(float x, float y);
190e78f53d1SNikolas Klauser long double    fdiml(long double x, long double y);
191e78f53d1SNikolas Klauser 
192e78f53d1SNikolas Klauser floating_point fma (arithmetic x, arithmetic y, arithmetic z);
193e78f53d1SNikolas Klauser float          fmaf(float x, float y, float z);
194e78f53d1SNikolas Klauser long double    fmal(long double x, long double y, long double z);
195e78f53d1SNikolas Klauser 
196e78f53d1SNikolas Klauser floating_point fmax (arithmetic x, arithmetic y);
197e78f53d1SNikolas Klauser float          fmaxf(float x, float y);
198e78f53d1SNikolas Klauser long double    fmaxl(long double x, long double y);
199e78f53d1SNikolas Klauser 
200e78f53d1SNikolas Klauser floating_point fmin (arithmetic x, arithmetic y);
201e78f53d1SNikolas Klauser float          fminf(float x, float y);
202e78f53d1SNikolas Klauser long double    fminl(long double x, long double y);
203e78f53d1SNikolas Klauser 
204e78f53d1SNikolas Klauser floating_point hypot (arithmetic x, arithmetic y);
205e78f53d1SNikolas Klauser float          hypotf(float x, float y);
206e78f53d1SNikolas Klauser long double    hypotl(long double x, long double y);
207e78f53d1SNikolas Klauser 
208e78f53d1SNikolas Klauser int ilogb (arithmetic x);
209e78f53d1SNikolas Klauser int ilogbf(float x);
210e78f53d1SNikolas Klauser int ilogbl(long double x);
211e78f53d1SNikolas Klauser 
212e78f53d1SNikolas Klauser floating_point lgamma (arithmetic x);
213e78f53d1SNikolas Klauser float          lgammaf(float x);
214e78f53d1SNikolas Klauser long double    lgammal(long double x);
215e78f53d1SNikolas Klauser 
216e78f53d1SNikolas Klauser long long llrint (arithmetic x);
217e78f53d1SNikolas Klauser long long llrintf(float x);
218e78f53d1SNikolas Klauser long long llrintl(long double x);
219e78f53d1SNikolas Klauser 
220e78f53d1SNikolas Klauser long long llround (arithmetic x);
221e78f53d1SNikolas Klauser long long llroundf(float x);
222e78f53d1SNikolas Klauser long long llroundl(long double x);
223e78f53d1SNikolas Klauser 
224e78f53d1SNikolas Klauser floating_point log1p (arithmetic x);
225e78f53d1SNikolas Klauser float          log1pf(float x);
226e78f53d1SNikolas Klauser long double    log1pl(long double x);
227e78f53d1SNikolas Klauser 
228e78f53d1SNikolas Klauser floating_point log2 (arithmetic x);
229e78f53d1SNikolas Klauser float          log2f(float x);
230e78f53d1SNikolas Klauser long double    log2l(long double x);
231e78f53d1SNikolas Klauser 
232e78f53d1SNikolas Klauser floating_point logb (arithmetic x);
233e78f53d1SNikolas Klauser float          logbf(float x);
234e78f53d1SNikolas Klauser long double    logbl(long double x);
235e78f53d1SNikolas Klauser 
236e78f53d1SNikolas Klauser long lrint (arithmetic x);
237e78f53d1SNikolas Klauser long lrintf(float x);
238e78f53d1SNikolas Klauser long lrintl(long double x);
239e78f53d1SNikolas Klauser 
240e78f53d1SNikolas Klauser long lround (arithmetic x);
241e78f53d1SNikolas Klauser long lroundf(float x);
242e78f53d1SNikolas Klauser long lroundl(long double x);
243e78f53d1SNikolas Klauser 
244e78f53d1SNikolas Klauser double      nan (const char* str);
245e78f53d1SNikolas Klauser float       nanf(const char* str);
246e78f53d1SNikolas Klauser long double nanl(const char* str);
247e78f53d1SNikolas Klauser 
248e78f53d1SNikolas Klauser floating_point nearbyint (arithmetic x);
249e78f53d1SNikolas Klauser float          nearbyintf(float x);
250e78f53d1SNikolas Klauser long double    nearbyintl(long double x);
251e78f53d1SNikolas Klauser 
252e78f53d1SNikolas Klauser floating_point nextafter (arithmetic x, arithmetic y);
253e78f53d1SNikolas Klauser float          nextafterf(float x, float y);
254e78f53d1SNikolas Klauser long double    nextafterl(long double x, long double y);
255e78f53d1SNikolas Klauser 
256e78f53d1SNikolas Klauser floating_point nexttoward (arithmetic x, long double y);
257e78f53d1SNikolas Klauser float          nexttowardf(float x, long double y);
258e78f53d1SNikolas Klauser long double    nexttowardl(long double x, long double y);
259e78f53d1SNikolas Klauser 
260e78f53d1SNikolas Klauser floating_point remainder (arithmetic x, arithmetic y);
261e78f53d1SNikolas Klauser float          remainderf(float x, float y);
262e78f53d1SNikolas Klauser long double    remainderl(long double x, long double y);
263e78f53d1SNikolas Klauser 
264e78f53d1SNikolas Klauser floating_point remquo (arithmetic x, arithmetic y, int* pquo);
265e78f53d1SNikolas Klauser float          remquof(float x, float y, int* pquo);
266e78f53d1SNikolas Klauser long double    remquol(long double x, long double y, int* pquo);
267e78f53d1SNikolas Klauser 
268e78f53d1SNikolas Klauser floating_point rint (arithmetic x);
269e78f53d1SNikolas Klauser float          rintf(float x);
270e78f53d1SNikolas Klauser long double    rintl(long double x);
271e78f53d1SNikolas Klauser 
272e78f53d1SNikolas Klauser floating_point round (arithmetic x);
273e78f53d1SNikolas Klauser float          roundf(float x);
274e78f53d1SNikolas Klauser long double    roundl(long double x);
275e78f53d1SNikolas Klauser 
276e78f53d1SNikolas Klauser floating_point scalbln (arithmetic x, long ex);
277e78f53d1SNikolas Klauser float          scalblnf(float x, long ex);
278e78f53d1SNikolas Klauser long double    scalblnl(long double x, long ex);
279e78f53d1SNikolas Klauser 
280e78f53d1SNikolas Klauser floating_point scalbn (arithmetic x, int ex);
281e78f53d1SNikolas Klauser float          scalbnf(float x, int ex);
282e78f53d1SNikolas Klauser long double    scalbnl(long double x, int ex);
283e78f53d1SNikolas Klauser 
284e78f53d1SNikolas Klauser floating_point tgamma (arithmetic x);
285e78f53d1SNikolas Klauser float          tgammaf(float x);
286e78f53d1SNikolas Klauser long double    tgammal(long double x);
287e78f53d1SNikolas Klauser 
288e78f53d1SNikolas Klauser floating_point trunc (arithmetic x);
289e78f53d1SNikolas Klauser float          truncf(float x);
290e78f53d1SNikolas Klauser long double    truncl(long double x);
291e78f53d1SNikolas Klauser 
292e78f53d1SNikolas Klauser */
293e78f53d1SNikolas Klauser 
29473fbae83SNikolas Klauser #  include <__cxx03/__config>
295e78f53d1SNikolas Klauser 
296e78f53d1SNikolas Klauser #  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
297e78f53d1SNikolas Klauser #    pragma GCC system_header
298e78f53d1SNikolas Klauser #  endif
299e78f53d1SNikolas Klauser 
300e78f53d1SNikolas Klauser #  if __has_include_next(<math.h>)
301e78f53d1SNikolas Klauser #    include_next <math.h>
302e78f53d1SNikolas Klauser #  endif
303e78f53d1SNikolas Klauser 
304e78f53d1SNikolas Klauser #  ifdef __cplusplus
305e78f53d1SNikolas Klauser 
306e78f53d1SNikolas Klauser // We support including .h headers inside 'extern "C"' contexts, so switch
307e78f53d1SNikolas Klauser // back to C++ linkage before including these C++ headers.
308e78f53d1SNikolas Klauser extern "C++" {
309e78f53d1SNikolas Klauser 
310e78f53d1SNikolas Klauser #    ifdef fpclassify
311e78f53d1SNikolas Klauser #      undef fpclassify
312e78f53d1SNikolas Klauser #    endif
313e78f53d1SNikolas Klauser 
314e78f53d1SNikolas Klauser #    ifdef signbit
315e78f53d1SNikolas Klauser #      undef signbit
316e78f53d1SNikolas Klauser #    endif
317e78f53d1SNikolas Klauser 
318e78f53d1SNikolas Klauser #    ifdef isfinite
319e78f53d1SNikolas Klauser #      undef isfinite
320e78f53d1SNikolas Klauser #    endif
321e78f53d1SNikolas Klauser 
322e78f53d1SNikolas Klauser #    ifdef isinf
323e78f53d1SNikolas Klauser #      undef isinf
324e78f53d1SNikolas Klauser #    endif
325e78f53d1SNikolas Klauser 
326e78f53d1SNikolas Klauser #    ifdef isnan
327e78f53d1SNikolas Klauser #      undef isnan
328e78f53d1SNikolas Klauser #    endif
329e78f53d1SNikolas Klauser 
330e78f53d1SNikolas Klauser #    ifdef isnormal
331e78f53d1SNikolas Klauser #      undef isnormal
332e78f53d1SNikolas Klauser #    endif
333e78f53d1SNikolas Klauser 
334e78f53d1SNikolas Klauser #    ifdef isgreater
335e78f53d1SNikolas Klauser #      undef isgreater
336e78f53d1SNikolas Klauser #    endif
337e78f53d1SNikolas Klauser 
338e78f53d1SNikolas Klauser #    ifdef isgreaterequal
339e78f53d1SNikolas Klauser #      undef isgreaterequal
340e78f53d1SNikolas Klauser #    endif
341e78f53d1SNikolas Klauser 
342e78f53d1SNikolas Klauser #    ifdef isless
343e78f53d1SNikolas Klauser #      undef isless
344e78f53d1SNikolas Klauser #    endif
345e78f53d1SNikolas Klauser 
346e78f53d1SNikolas Klauser #    ifdef islessequal
347e78f53d1SNikolas Klauser #      undef islessequal
348e78f53d1SNikolas Klauser #    endif
349e78f53d1SNikolas Klauser 
350e78f53d1SNikolas Klauser #    ifdef islessgreater
351e78f53d1SNikolas Klauser #      undef islessgreater
352e78f53d1SNikolas Klauser #    endif
353e78f53d1SNikolas Klauser 
354e78f53d1SNikolas Klauser #    ifdef isunordered
355e78f53d1SNikolas Klauser #      undef isunordered
356e78f53d1SNikolas Klauser #    endif
357e78f53d1SNikolas Klauser 
35873fbae83SNikolas Klauser #    include <__cxx03/__math/abs.h>
35973fbae83SNikolas Klauser #    include <__cxx03/__math/copysign.h>
36073fbae83SNikolas Klauser #    include <__cxx03/__math/error_functions.h>
36173fbae83SNikolas Klauser #    include <__cxx03/__math/exponential_functions.h>
36273fbae83SNikolas Klauser #    include <__cxx03/__math/fdim.h>
36373fbae83SNikolas Klauser #    include <__cxx03/__math/fma.h>
36473fbae83SNikolas Klauser #    include <__cxx03/__math/gamma.h>
36573fbae83SNikolas Klauser #    include <__cxx03/__math/hyperbolic_functions.h>
36673fbae83SNikolas Klauser #    include <__cxx03/__math/hypot.h>
36773fbae83SNikolas Klauser #    include <__cxx03/__math/inverse_hyperbolic_functions.h>
36873fbae83SNikolas Klauser #    include <__cxx03/__math/inverse_trigonometric_functions.h>
36973fbae83SNikolas Klauser #    include <__cxx03/__math/logarithms.h>
37073fbae83SNikolas Klauser #    include <__cxx03/__math/min_max.h>
37173fbae83SNikolas Klauser #    include <__cxx03/__math/modulo.h>
37273fbae83SNikolas Klauser #    include <__cxx03/__math/remainder.h>
37373fbae83SNikolas Klauser #    include <__cxx03/__math/roots.h>
37473fbae83SNikolas Klauser #    include <__cxx03/__math/rounding_functions.h>
37573fbae83SNikolas Klauser #    include <__cxx03/__math/traits.h>
37673fbae83SNikolas Klauser #    include <__cxx03/__math/trigonometric_functions.h>
37773fbae83SNikolas Klauser #    include <__cxx03/__type_traits/enable_if.h>
37873fbae83SNikolas Klauser #    include <__cxx03/__type_traits/is_floating_point.h>
37973fbae83SNikolas Klauser #    include <__cxx03/__type_traits/is_integral.h>
38073fbae83SNikolas Klauser #    include <__cxx03/stdlib.h>
381e78f53d1SNikolas Klauser 
382e78f53d1SNikolas Klauser // fpclassify relies on implementation-defined constants, so we can't move it to a detail header
383e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
384e78f53d1SNikolas Klauser 
385e78f53d1SNikolas Klauser namespace __math {
386e78f53d1SNikolas Klauser 
387e78f53d1SNikolas Klauser // fpclassify
388e78f53d1SNikolas Klauser 
389e78f53d1SNikolas Klauser // template on non-double overloads to make them weaker than same overloads from MSVC runtime
390e78f53d1SNikolas Klauser template <class = int>
391e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(float __x) _NOEXCEPT {
392e78f53d1SNikolas Klauser   return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
393e78f53d1SNikolas Klauser }
394e78f53d1SNikolas Klauser 
395e78f53d1SNikolas Klauser template <class = int>
396e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(double __x) _NOEXCEPT {
397e78f53d1SNikolas Klauser   return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
398e78f53d1SNikolas Klauser }
399e78f53d1SNikolas Klauser 
400e78f53d1SNikolas Klauser template <class = int>
401e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(long double __x) _NOEXCEPT {
402e78f53d1SNikolas Klauser   return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
403e78f53d1SNikolas Klauser }
404e78f53d1SNikolas Klauser 
405e78f53d1SNikolas Klauser template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0>
406e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT {
407e78f53d1SNikolas Klauser   return __x == 0 ? FP_ZERO : FP_NORMAL;
408e78f53d1SNikolas Klauser }
409e78f53d1SNikolas Klauser 
410e78f53d1SNikolas Klauser } // namespace __math
411e78f53d1SNikolas Klauser 
412e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
413e78f53d1SNikolas Klauser 
414e78f53d1SNikolas Klauser using std::__math::fpclassify;
415e78f53d1SNikolas Klauser using std::__math::signbit;
416e78f53d1SNikolas Klauser 
417e78f53d1SNikolas Klauser // The MSVC runtime already provides these functions as templates
418e78f53d1SNikolas Klauser #    ifndef _LIBCPP_MSVCRT
419e78f53d1SNikolas Klauser using std::__math::isfinite;
420e78f53d1SNikolas Klauser using std::__math::isgreater;
421e78f53d1SNikolas Klauser using std::__math::isgreaterequal;
422e78f53d1SNikolas Klauser using std::__math::isinf;
423e78f53d1SNikolas Klauser using std::__math::isless;
424e78f53d1SNikolas Klauser using std::__math::islessequal;
425e78f53d1SNikolas Klauser using std::__math::islessgreater;
426e78f53d1SNikolas Klauser using std::__math::isnan;
427e78f53d1SNikolas Klauser using std::__math::isnormal;
428e78f53d1SNikolas Klauser using std::__math::isunordered;
429e78f53d1SNikolas Klauser #    endif // _LIBCPP_MSVCRT
430e78f53d1SNikolas Klauser 
431e78f53d1SNikolas Klauser // abs
432e78f53d1SNikolas Klauser //
433e78f53d1SNikolas Klauser // handled in stdlib.h
434e78f53d1SNikolas Klauser 
435e78f53d1SNikolas Klauser // div
436e78f53d1SNikolas Klauser //
437e78f53d1SNikolas Klauser // handled in stdlib.h
438e78f53d1SNikolas Klauser 
439e78f53d1SNikolas Klauser // We have to provide double overloads for <math.h> to work on platforms that don't provide the full set of math
440e78f53d1SNikolas Klauser // functions. To make the overload set work with multiple functions that take the same arguments, we make our overloads
441e78f53d1SNikolas Klauser // templates. Functions are preferred over function templates during overload resolution, which means that our overload
442e78f53d1SNikolas Klauser // will only be selected when the C library doesn't provide one.
443e78f53d1SNikolas Klauser 
444e78f53d1SNikolas Klauser using std::__math::acos;
445e78f53d1SNikolas Klauser using std::__math::acosh;
446e78f53d1SNikolas Klauser using std::__math::asin;
447e78f53d1SNikolas Klauser using std::__math::asinh;
448e78f53d1SNikolas Klauser using std::__math::atan;
449e78f53d1SNikolas Klauser using std::__math::atan2;
450e78f53d1SNikolas Klauser using std::__math::atanh;
451e78f53d1SNikolas Klauser using std::__math::cbrt;
452e78f53d1SNikolas Klauser using std::__math::ceil;
453e78f53d1SNikolas Klauser using std::__math::copysign;
454e78f53d1SNikolas Klauser using std::__math::cos;
455e78f53d1SNikolas Klauser using std::__math::cosh;
456e78f53d1SNikolas Klauser using std::__math::erf;
457e78f53d1SNikolas Klauser using std::__math::erfc;
458e78f53d1SNikolas Klauser using std::__math::exp;
459e78f53d1SNikolas Klauser using std::__math::exp2;
460e78f53d1SNikolas Klauser using std::__math::expm1;
461e78f53d1SNikolas Klauser using std::__math::fabs;
462e78f53d1SNikolas Klauser using std::__math::fdim;
463e78f53d1SNikolas Klauser using std::__math::floor;
464e78f53d1SNikolas Klauser using std::__math::fma;
465e78f53d1SNikolas Klauser using std::__math::fmax;
466e78f53d1SNikolas Klauser using std::__math::fmin;
467e78f53d1SNikolas Klauser using std::__math::fmod;
468e78f53d1SNikolas Klauser using std::__math::frexp;
469e78f53d1SNikolas Klauser using std::__math::hypot;
470e78f53d1SNikolas Klauser using std::__math::ilogb;
471e78f53d1SNikolas Klauser using std::__math::ldexp;
472e78f53d1SNikolas Klauser using std::__math::lgamma;
473e78f53d1SNikolas Klauser using std::__math::llrint;
474e78f53d1SNikolas Klauser using std::__math::llround;
475e78f53d1SNikolas Klauser using std::__math::log;
476e78f53d1SNikolas Klauser using std::__math::log10;
477e78f53d1SNikolas Klauser using std::__math::log1p;
478e78f53d1SNikolas Klauser using std::__math::log2;
479e78f53d1SNikolas Klauser using std::__math::logb;
480e78f53d1SNikolas Klauser using std::__math::lrint;
481e78f53d1SNikolas Klauser using std::__math::lround;
482e78f53d1SNikolas Klauser using std::__math::modf;
483e78f53d1SNikolas Klauser using std::__math::nearbyint;
484e78f53d1SNikolas Klauser using std::__math::nextafter;
485e78f53d1SNikolas Klauser using std::__math::nexttoward;
486e78f53d1SNikolas Klauser using std::__math::pow;
487e78f53d1SNikolas Klauser using std::__math::remainder;
488e78f53d1SNikolas Klauser using std::__math::remquo;
489e78f53d1SNikolas Klauser using std::__math::rint;
490e78f53d1SNikolas Klauser using std::__math::round;
491e78f53d1SNikolas Klauser using std::__math::scalbln;
492e78f53d1SNikolas Klauser using std::__math::scalbn;
493e78f53d1SNikolas Klauser using std::__math::signbit;
494e78f53d1SNikolas Klauser using std::__math::sin;
495e78f53d1SNikolas Klauser using std::__math::sinh;
496e78f53d1SNikolas Klauser using std::__math::sqrt;
497e78f53d1SNikolas Klauser using std::__math::tan;
498e78f53d1SNikolas Klauser using std::__math::tanh;
499e78f53d1SNikolas Klauser using std::__math::tgamma;
500e78f53d1SNikolas Klauser using std::__math::trunc;
501e78f53d1SNikolas Klauser 
502e78f53d1SNikolas Klauser } // extern "C++"
503e78f53d1SNikolas Klauser 
504e78f53d1SNikolas Klauser #  endif // __cplusplus
505e78f53d1SNikolas Klauser 
506*ce777190SNikolas Klauser #else // _LIBCPP___CXX03_MATH_H
507e78f53d1SNikolas Klauser 
508e78f53d1SNikolas Klauser // This include lives outside the header guard in order to support an MSVC
509e78f53d1SNikolas Klauser // extension which allows users to do:
510e78f53d1SNikolas Klauser //
511e78f53d1SNikolas Klauser // #define _USE_MATH_DEFINES
51273fbae83SNikolas Klauser // #include <__cxx03/math.h>
513e78f53d1SNikolas Klauser //
514e78f53d1SNikolas Klauser // and receive the definitions of mathematical constants, even if <math.h>
515e78f53d1SNikolas Klauser // has previously been included.
516e78f53d1SNikolas Klauser #  if defined(_LIBCPP_MSVCRT) && defined(_USE_MATH_DEFINES)
517e78f53d1SNikolas Klauser #    include_next <math.h>
518e78f53d1SNikolas Klauser #  endif
519e78f53d1SNikolas Klauser 
520*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03_MATH_H
521