LWG 3035. std::allocator's constructors should be constexpr
[official-gcc.git] / libstdc++-v3 / include / c_std / cmath
blobc16637129452ecb98324299a89cb08b273d2dbde
1 // -*- C++ -*- C forwarding header.
3 // Copyright (C) 1997-2018 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.
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.
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.
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/>.
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  */
36 // ISO C++ 14882: 26.5  C library
39 #ifndef _GLIBCXX_CMATH
40 #define _GLIBCXX_CMATH 1
42 #pragma GCC system_header
44 #include <bits/c++config.h>
45 #include <bits/cpp_type_traits.h>
46 #include <ext/type_traits.h>
48 #include <math.h>
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
76 namespace std _GLIBCXX_VISIBILITY(default)
78 _GLIBCXX_BEGIN_NAMESPACE_VERSION
80   inline double
81   abs(double __x)
82   { return __builtin_fabs(__x); }
84   inline float
85   abs(float __x)
86   { return __builtin_fabsf(__x); }
88   inline long double
89   abs(long double __x)
90   { return __builtin_fabsl(__x); }
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); }
98   using ::acos;
100   inline float
101   acos(float __x)
102   { return __builtin_acosf(__x); }
104   inline long double
105   acos(long double __x)
106   { return __builtin_acosl(__x); }
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); }
114   using ::asin;
116   inline float
117   asin(float __x)
118   { return __builtin_asinf(__x); }
120   inline long double
121   asin(long double __x)
122   { return __builtin_asinl(__x); }
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); }
130   using ::atan;
132   inline float
133   atan(float __x)
134   { return __builtin_atanf(__x); }
136   inline long double
137   atan(long double __x)
138   { return __builtin_atanl(__x); }
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); }
146   using ::atan2;
148   inline float
149   atan2(float __y, float __x)
150   { return __builtin_atan2f(__y, __x); }
152   inline long double
153   atan2(long double __y, long double __x)
154   { return __builtin_atan2l(__y, __x); }
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); }
163   using ::ceil;
165   inline float
166   ceil(float __x)
167   { return __builtin_ceilf(__x); }
169   inline long double
170   ceil(long double __x)
171   { return __builtin_ceill(__x); }
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); }
179   using ::cos;
181   inline float
182   cos(float __x)
183   { return __builtin_cosf(__x); }
185   inline long double
186   cos(long double __x)
187   { return __builtin_cosl(__x); }
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); }
195   using ::cosh;
197   inline float
198   cosh(float __x)
199   { return __builtin_coshf(__x); }
201   inline long double
202   cosh(long double __x)
203   { return __builtin_coshl(__x); }
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); }
211   using ::exp;
213   inline float
214   exp(float __x)
215   { return __builtin_expf(__x); }
217   inline long double
218   exp(long double __x)
219   { return __builtin_expl(__x); }
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); }
227   using ::fabs;
229   inline float
230   fabs(float __x)
231   { return __builtin_fabsf(__x); }
233   inline long double
234   fabs(long double __x)
235   { return __builtin_fabsl(__x); }
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); }
243   using ::floor;
245   inline float
246   floor(float __x)
247   { return __builtin_floorf(__x); }
249   inline long double
250   floor(long double __x)
251   { return __builtin_floorl(__x); }
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); }
259   using ::fmod;
261   inline float
262   fmod(float __x, float __y)
263   { return __builtin_fmodf(__x, __y); }
265   inline long double
266   fmod(long double __x, long double __y)
267   { return __builtin_fmodl(__x, __y); }
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); }
276   using ::frexp;
278   inline float
279   frexp(float __x, int* __exp)
280   { return __builtin_frexpf(__x, __exp); }
282   inline long double
283   frexp(long double __x, int* __exp)
284   { return __builtin_frexpl(__x, __exp); }
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); }
292   using ::ldexp;
294   inline float
295   ldexp(float __x, int __exp)
296   { return __builtin_ldexpf(__x, __exp); }
298   inline long double
299   ldexp(long double __x, int __exp)
300   { return __builtin_ldexpl(__x, __exp); }
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); }
308   using ::log;
310   inline float
311   log(float __x)
312   { return __builtin_logf(__x); }
314   inline long double
315   log(long double __x)
316   { return __builtin_logl(__x); }
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); }
324   using ::log10;
326   inline float
327   log10(float __x)
328   { return __builtin_log10f(__x); }
330   inline long double
331   log10(long double __x)
332   { return __builtin_log10l(__x); }
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); }
340   using ::modf;
342   inline float
343   modf(float __x, float* __iptr)
344   { return __builtin_modff(__x, __iptr); }
346   inline long double
347   modf(long double __x, long double* __iptr)
348   { return __builtin_modfl(__x, __iptr); }
350   using ::pow;
352   inline float
353   pow(float __x, float __y)
354   { return __builtin_powf(__x, __y); }
356   inline long double
357   pow(long double __x, long double __y)
358   { return __builtin_powl(__x, __y); }
360   inline double
361   pow(double __x, int __i)
362   { return __builtin_powi(__x, __i); }
364   inline float
365   pow(float __x, int __n)
366   { return __builtin_powif(__x, __n); }
368   inline long double
369   pow(long double __x, int __n)
370   { return __builtin_powil(__x, __n); }
372   using ::sin;
374   inline float
375   sin(float __x)
376   { return __builtin_sinf(__x); }
378   inline long double
379   sin(long double __x)
380   { return __builtin_sinl(__x); }
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); }
388   using ::sinh;
390   inline float
391   sinh(float __x)
392   { return __builtin_sinhf(__x); }
394   inline long double
395   sinh(long double __x)
396   { return __builtin_sinhl(__x); }
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); }
404   using ::sqrt;
406   inline float
407   sqrt(float __x)
408   { return __builtin_sqrtf(__x); }
410   inline long double
411   sqrt(long double __x)
412   { return __builtin_sqrtl(__x); }
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); }
420   using ::tan;
422   inline float
423   tan(float __x)
424   { return __builtin_tanf(__x); }
426   inline long double
427   tan(long double __x)
428   { return __builtin_tanl(__x); }
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); }
436   using ::tanh;
438   inline float
439   tanh(float __x)
440   { return __builtin_tanhf(__x); }
442   inline long double
443   tanh(long double __x)
444   { return __builtin_tanhl(__x); }
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); }
452 #if _GLIBCXX_USE_C99_MATH
453 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
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
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     }
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     }
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     }
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     }
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     }
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     }
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     }
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     }
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     }
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     }
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     }
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     }
578 #endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
579 #endif /* _GLIBCXX_USE_C99_MATH */
581 _GLIBCXX_END_NAMESPACE_VERSION
582 } // namespace std
584 #endif