1// -*- C++ -*- C forwarding header.
2
3// Copyright (C) 1997-2020 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file include/cmath
26 *  This is a Standard C++ Library file.  You should @c #include this file
27 *  in your programs, rather than any of the @a *.h implementation files.
28 *
29 *  This is the C++ version of the Standard C Library header @c math.h,
30 *  and its contents are (mostly) the same as that header, but are all
31 *  contained in the namespace @c std (except for names which are defined
32 *  as macros in C).
33 */
34
35//
36// ISO C++ 14882: 26.5  C library
37//
38
39#ifndef _GLIBCXX_CMATH
40#define _GLIBCXX_CMATH 1
41
42#pragma GCC system_header
43
44#include <bits/c++config.h>
45#include <bits/cpp_type_traits.h>
46#include <ext/type_traits.h>
47
48#include <math.h>
49
50// Get rid of those macros defined in <math.h> in lieu of real functions.
51#undef abs
52#undef div
53#undef acos
54#undef asin
55#undef atan
56#undef atan2
57#undef ceil
58#undef cos
59#undef cosh
60#undef exp
61#undef fabs
62#undef floor
63#undef fmod
64#undef frexp
65#undef ldexp
66#undef log
67#undef log10
68#undef modf
69#undef pow
70#undef sin
71#undef sinh
72#undef sqrt
73#undef tan
74#undef tanh
75
76namespace std _GLIBCXX_VISIBILITY(default)
77{
78_GLIBCXX_BEGIN_NAMESPACE_VERSION
79
80  inline double
81  abs(double __x)
82  { return __builtin_fabs(__x); }
83
84  inline float
85  abs(float __x)
86  { return __builtin_fabsf(__x); }
87
88  inline long double
89  abs(long double __x)
90  { return __builtin_fabsl(__x); }
91
92  template<typename _Tp>
93    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
94					   double>::__type
95    abs(_Tp __x)
96    { return __builtin_fabs(__x); }
97
98  using ::acos;
99
100  inline float
101  acos(float __x)
102  { return __builtin_acosf(__x); }
103
104  inline long double
105  acos(long double __x)
106  { return __builtin_acosl(__x); }
107
108  template<typename _Tp>
109    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
110					   double>::__type
111    acos(_Tp __x)
112    { return __builtin_acos(__x); }
113
114  using ::asin;
115
116  inline float
117  asin(float __x)
118  { return __builtin_asinf(__x); }
119
120  inline long double
121  asin(long double __x)
122  { return __builtin_asinl(__x); }
123
124  template<typename _Tp>
125    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
126					   double>::__type
127    asin(_Tp __x)
128    { return __builtin_asin(__x); }
129
130  using ::atan;
131
132  inline float
133  atan(float __x)
134  { return __builtin_atanf(__x); }
135
136  inline long double
137  atan(long double __x)
138  { return __builtin_atanl(__x); }
139
140  template<typename _Tp>
141    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
142					   double>::__type
143    atan(_Tp __x)
144    { return __builtin_atan(__x); }
145
146  using ::atan2;
147
148  inline float
149  atan2(float __y, float __x)
150  { return __builtin_atan2f(__y, __x); }
151
152  inline long double
153  atan2(long double __y, long double __x)
154  { return __builtin_atan2l(__y, __x); }
155
156  template<typename _Tp, typename _Up>
157    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
158    					   && __is_integer<_Up>::__value,
159					   double>::__type
160    atan2(_Tp __y, _Up __x)
161    { return __builtin_atan2(__y, __x); }
162
163  using ::ceil;
164
165  inline float
166  ceil(float __x)
167  { return __builtin_ceilf(__x); }
168
169  inline long double
170  ceil(long double __x)
171  { return __builtin_ceill(__x); }
172
173  template<typename _Tp>
174    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
175					   double>::__type
176    ceil(_Tp __x)
177    { return __builtin_ceil(__x); }
178
179  using ::cos;
180
181  inline float
182  cos(float __x)
183  { return __builtin_cosf(__x); }
184
185  inline long double
186  cos(long double __x)
187  { return __builtin_cosl(__x); }
188
189  template<typename _Tp>
190    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
191					   double>::__type
192    cos(_Tp __x)
193    { return __builtin_cos(__x); }
194
195  using ::cosh;
196
197  inline float
198  cosh(float __x)
199  { return __builtin_coshf(__x); }
200
201  inline long double
202  cosh(long double __x)
203  { return __builtin_coshl(__x); }
204
205  template<typename _Tp>
206    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
207					   double>::__type
208    cosh(_Tp __x)
209    { return __builtin_cosh(__x); }
210
211  using ::exp;
212
213  inline float
214  exp(float __x)
215  { return __builtin_expf(__x); }
216
217  inline long double
218  exp(long double __x)
219  { return __builtin_expl(__x); }
220
221  template<typename _Tp>
222    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
223					   double>::__type
224    exp(_Tp __x)
225    { return __builtin_exp(__x); }
226
227  using ::fabs;
228
229  inline float
230  fabs(float __x)
231  { return __builtin_fabsf(__x); }
232
233  inline long double
234  fabs(long double __x)
235  { return __builtin_fabsl(__x); }
236
237  template<typename _Tp>
238    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
239					   double>::__type
240    fabs(_Tp __x)
241    { return __builtin_fabs(__x); }
242
243  using ::floor;
244
245  inline float
246  floor(float __x)
247  { return __builtin_floorf(__x); }
248
249  inline long double
250  floor(long double __x)
251  { return __builtin_floorl(__x); }
252
253  template<typename _Tp>
254    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
255					   double>::__type
256    floor(_Tp __x)
257    { return __builtin_floor(__x); }
258
259  using ::fmod;
260
261  inline float
262  fmod(float __x, float __y)
263  { return __builtin_fmodf(__x, __y); }
264
265  inline long double
266  fmod(long double __x, long double __y)
267  { return __builtin_fmodl(__x, __y); }
268
269  template<typename _Tp, typename _Up>
270    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value
271    					   && __is_integer<_Up>::__value,
272					   double>::__type
273    fmod(_Tp __x, _Up __y)
274    { return __builtin_fmod(__x, __y); }
275
276  using ::frexp;
277
278  inline float
279  frexp(float __x, int* __exp)
280  { return __builtin_frexpf(__x, __exp); }
281
282  inline long double
283  frexp(long double __x, int* __exp)
284  { return __builtin_frexpl(__x, __exp); }
285
286  template<typename _Tp>
287    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
288					   double>::__type
289    frexp(_Tp __x, int* __exp)
290    { return __builtin_frexp(__x, __exp); }
291
292  using ::ldexp;
293
294  inline float
295  ldexp(float __x, int __exp)
296  { return __builtin_ldexpf(__x, __exp); }
297
298  inline long double
299  ldexp(long double __x, int __exp)
300  { return __builtin_ldexpl(__x, __exp); }
301
302  template<typename _Tp>
303    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
304					   double>::__type
305    ldexp(_Tp __x, int __exp)
306    { return __builtin_ldexp(__x, __exp); }
307
308  using ::log;
309
310  inline float
311  log(float __x)
312  { return __builtin_logf(__x); }
313
314  inline long double
315  log(long double __x)
316  { return __builtin_logl(__x); }
317
318  template<typename _Tp>
319    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
320					   double>::__type
321    log(_Tp __x)
322    { return __builtin_log(__x); }
323
324  using ::log10;
325
326  inline float
327  log10(float __x)
328  { return __builtin_log10f(__x); }
329
330  inline long double
331  log10(long double __x)
332  { return __builtin_log10l(__x); }
333
334  template<typename _Tp>
335    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
336					   double>::__type
337    log10(_Tp __x)
338    { return __builtin_log10(__x); }
339
340  using ::modf;
341
342  inline float
343  modf(float __x, float* __iptr)
344  { return __builtin_modff(__x, __iptr); }
345
346  inline long double
347  modf(long double __x, long double* __iptr)
348  { return __builtin_modfl(__x, __iptr); }
349
350  using ::pow;
351
352  inline float
353  pow(float __x, float __y)
354  { return __builtin_powf(__x, __y); }
355
356  inline long double
357  pow(long double __x, long double __y)
358  { return __builtin_powl(__x, __y); }
359
360  inline double
361  pow(double __x, int __i)
362  { return __builtin_powi(__x, __i); }
363
364  inline float
365  pow(float __x, int __n)
366  { return __builtin_powif(__x, __n); }
367
368  inline long double
369  pow(long double __x, int __n)
370  { return __builtin_powil(__x, __n); }
371
372  using ::sin;
373
374  inline float
375  sin(float __x)
376  { return __builtin_sinf(__x); }
377
378  inline long double
379  sin(long double __x)
380  { return __builtin_sinl(__x); }
381
382  template<typename _Tp>
383    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
384					   double>::__type
385    sin(_Tp __x)
386    { return __builtin_sin(__x); }
387
388  using ::sinh;
389
390  inline float
391  sinh(float __x)
392  { return __builtin_sinhf(__x); }
393
394  inline long double
395  sinh(long double __x)
396  { return __builtin_sinhl(__x); }
397
398  template<typename _Tp>
399    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
400					   double>::__type
401    sinh(_Tp __x)
402    { return __builtin_sinh(__x); }
403
404  using ::sqrt;
405
406  inline float
407  sqrt(float __x)
408  { return __builtin_sqrtf(__x); }
409
410  inline long double
411  sqrt(long double __x)
412  { return __builtin_sqrtl(__x); }
413
414  template<typename _Tp>
415    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
416					   double>::__type
417    sqrt(_Tp __x)
418    { return __builtin_sqrt(__x); }
419
420  using ::tan;
421
422  inline float
423  tan(float __x)
424  { return __builtin_tanf(__x); }
425
426  inline long double
427  tan(long double __x)
428  { return __builtin_tanl(__x); }
429
430  template<typename _Tp>
431    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
432					   double>::__type
433    tan(_Tp __x)
434    { return __builtin_tan(__x); }
435
436  using ::tanh;
437
438  inline float
439  tanh(float __x)
440  { return __builtin_tanhf(__x); }
441
442  inline long double
443  tanh(long double __x)
444  { return __builtin_tanhl(__x); }
445
446  template<typename _Tp>
447    inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
448					   double>::__type
449    tanh(_Tp __x)
450    { return __builtin_tanh(__x); }
451
452#if _GLIBCXX_USE_C99_MATH
453#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
454
455// These are possible macros imported from C99-land.
456#undef fpclassify
457#undef isfinite
458#undef isinf
459#undef isnan
460#undef isnormal
461#undef signbit
462#undef isgreater
463#undef isgreaterequal
464#undef isless
465#undef islessequal
466#undef islessgreater
467#undef isunordered
468
469  template<typename _Tp>
470    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
471					   int>::__type
472    fpclassify(_Tp __f)
473    {
474      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
475      return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
476				  FP_SUBNORMAL, FP_ZERO, __type(__f));
477    }
478
479  template<typename _Tp>
480    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
481					   int>::__type
482    isfinite(_Tp __f)
483    {
484      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
485      return __builtin_isfinite(__type(__f));
486    }
487
488  template<typename _Tp>
489    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
490					   int>::__type
491    isinf(_Tp __f)
492    {
493      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
494      return __builtin_isinf(__type(__f));
495    }
496
497  template<typename _Tp>
498    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
499					   int>::__type
500    isnan(_Tp __f)
501    {
502      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
503      return __builtin_isnan(__type(__f));
504    }
505
506  template<typename _Tp>
507    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
508					   int>::__type
509    isnormal(_Tp __f)
510    {
511      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
512      return __builtin_isnormal(__type(__f));
513    }
514
515  template<typename _Tp>
516    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
517					   int>::__type
518    signbit(_Tp __f)
519    {
520      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
521      return __builtin_signbit(__type(__f));
522    }
523
524  template<typename _Tp>
525    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
526					   int>::__type
527    isgreater(_Tp __f1, _Tp __f2)
528    {
529      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
530      return __builtin_isgreater(__type(__f1), __type(__f2));
531    }
532
533  template<typename _Tp>
534    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
535					   int>::__type
536    isgreaterequal(_Tp __f1, _Tp __f2)
537    {
538      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
539      return __builtin_isgreaterequal(__type(__f1), __type(__f2));
540    }
541
542  template<typename _Tp>
543    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
544					   int>::__type
545    isless(_Tp __f1, _Tp __f2)
546    {
547      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
548      return __builtin_isless(__type(__f1), __type(__f2));
549    }
550
551  template<typename _Tp>
552    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
553					   int>::__type
554    islessequal(_Tp __f1, _Tp __f2)
555    {
556      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
557      return __builtin_islessequal(__type(__f1), __type(__f2));
558    }
559
560  template<typename _Tp>
561    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
562					   int>::__type
563    islessgreater(_Tp __f1, _Tp __f2)
564    {
565      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
566      return __builtin_islessgreater(__type(__f1), __type(__f2));
567    }
568
569  template<typename _Tp>
570    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
571					   int>::__type
572    isunordered(_Tp __f1, _Tp __f2)
573    {
574      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
575      return __builtin_isunordered(__type(__f1), __type(__f2));
576    }
577
578#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
579#endif /* _GLIBCXX_USE_C99_MATH */
580
581_GLIBCXX_END_NAMESPACE_VERSION
582} // namespace std
583
584#endif
585