1 // -*- C++ -*- C forwarding header.
3 // Copyright (C) 1997-2014 Free Software Foundation, Inc.
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)
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.
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
36 // ISO C++ 14882: 26.5 C library
39 #pragma GCC system_header
41 #include <bits/c++config.h>
42 #include <bits/cpp_type_traits.h>
43 #include <ext/type_traits.h>
46 #ifndef _GLIBCXX_CMATH
47 #define _GLIBCXX_CMATH 1
49 // Get rid of those macros defined in <math.h> in lieu of real functions.
75 namespace std _GLIBCXX_VISIBILITY(default)
77 _GLIBCXX_BEGIN_NAMESPACE_VERSION
79 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
80 inline _GLIBCXX_CONSTEXPR double
82 { return __builtin_fabs(__x); }
85 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
86 inline _GLIBCXX_CONSTEXPR float
88 { return __builtin_fabsf(__x); }
90 inline _GLIBCXX_CONSTEXPR long double
92 { return __builtin_fabsl(__x); }
95 template<typename _Tp>
96 inline _GLIBCXX_CONSTEXPR
97 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
100 { return __builtin_fabs(__x); }
104 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
105 inline _GLIBCXX_CONSTEXPR float
107 { return __builtin_acosf(__x); }
109 inline _GLIBCXX_CONSTEXPR long double
110 acos(long double __x)
111 { return __builtin_acosl(__x); }
114 template<typename _Tp>
115 inline _GLIBCXX_CONSTEXPR
116 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
119 { return __builtin_acos(__x); }
123 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
124 inline _GLIBCXX_CONSTEXPR float
126 { return __builtin_asinf(__x); }
128 inline _GLIBCXX_CONSTEXPR long double
129 asin(long double __x)
130 { return __builtin_asinl(__x); }
133 template<typename _Tp>
134 inline _GLIBCXX_CONSTEXPR
135 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
138 { return __builtin_asin(__x); }
142 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
143 inline _GLIBCXX_CONSTEXPR float
145 { return __builtin_atanf(__x); }
147 inline _GLIBCXX_CONSTEXPR long double
148 atan(long double __x)
149 { return __builtin_atanl(__x); }
152 template<typename _Tp>
153 inline _GLIBCXX_CONSTEXPR
154 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
157 { return __builtin_atan(__x); }
161 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
162 inline _GLIBCXX_CONSTEXPR float
163 atan2(float __y, float __x)
164 { return __builtin_atan2f(__y, __x); }
166 inline _GLIBCXX_CONSTEXPR long double
167 atan2(long double __y, long double __x)
168 { return __builtin_atan2l(__y, __x); }
171 template<typename _Tp, typename _Up>
172 inline _GLIBCXX_CONSTEXPR
173 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
174 atan2(_Tp __y, _Up __x)
176 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
177 return atan2(__type(__y), __type(__x));
182 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
183 inline _GLIBCXX_CONSTEXPR float
185 { return __builtin_ceilf(__x); }
187 inline _GLIBCXX_CONSTEXPR long double
188 ceil(long double __x)
189 { return __builtin_ceill(__x); }
192 template<typename _Tp>
193 inline _GLIBCXX_CONSTEXPR
194 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
197 { return __builtin_ceil(__x); }
201 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
202 inline _GLIBCXX_CONSTEXPR float
204 { return __builtin_cosf(__x); }
206 inline _GLIBCXX_CONSTEXPR long double
208 { return __builtin_cosl(__x); }
211 template<typename _Tp>
212 inline _GLIBCXX_CONSTEXPR
213 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
216 { return __builtin_cos(__x); }
220 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
221 inline _GLIBCXX_CONSTEXPR float
223 { return __builtin_coshf(__x); }
225 inline _GLIBCXX_CONSTEXPR long double
226 cosh(long double __x)
227 { return __builtin_coshl(__x); }
230 template<typename _Tp>
231 inline _GLIBCXX_CONSTEXPR
232 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
235 { return __builtin_cosh(__x); }
239 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
240 inline _GLIBCXX_CONSTEXPR float
242 { return __builtin_expf(__x); }
244 inline _GLIBCXX_CONSTEXPR long double
246 { return __builtin_expl(__x); }
249 template<typename _Tp>
250 inline _GLIBCXX_CONSTEXPR
251 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
254 { return __builtin_exp(__x); }
258 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
259 inline _GLIBCXX_CONSTEXPR float
261 { return __builtin_fabsf(__x); }
263 inline _GLIBCXX_CONSTEXPR long double
264 fabs(long double __x)
265 { return __builtin_fabsl(__x); }
268 template<typename _Tp>
269 inline _GLIBCXX_CONSTEXPR
270 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
273 { return __builtin_fabs(__x); }
277 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
278 inline _GLIBCXX_CONSTEXPR float
280 { return __builtin_floorf(__x); }
282 inline _GLIBCXX_CONSTEXPR long double
283 floor(long double __x)
284 { return __builtin_floorl(__x); }
287 template<typename _Tp>
288 inline _GLIBCXX_CONSTEXPR
289 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
292 { return __builtin_floor(__x); }
296 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
297 inline _GLIBCXX_CONSTEXPR float
298 fmod(float __x, float __y)
299 { return __builtin_fmodf(__x, __y); }
301 inline _GLIBCXX_CONSTEXPR long double
302 fmod(long double __x, long double __y)
303 { return __builtin_fmodl(__x, __y); }
306 template<typename _Tp, typename _Up>
307 inline _GLIBCXX_CONSTEXPR
308 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
309 fmod(_Tp __x, _Up __y)
311 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
312 return fmod(__type(__x), __type(__y));
317 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
319 frexp(float __x, int* __exp)
320 { return __builtin_frexpf(__x, __exp); }
323 frexp(long double __x, int* __exp)
324 { return __builtin_frexpl(__x, __exp); }
327 template<typename _Tp>
328 inline _GLIBCXX_CONSTEXPR
329 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
331 frexp(_Tp __x, int* __exp)
332 { return __builtin_frexp(__x, __exp); }
336 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
337 inline _GLIBCXX_CONSTEXPR float
338 ldexp(float __x, int __exp)
339 { return __builtin_ldexpf(__x, __exp); }
341 inline _GLIBCXX_CONSTEXPR long double
342 ldexp(long double __x, int __exp)
343 { return __builtin_ldexpl(__x, __exp); }
346 template<typename _Tp>
347 inline _GLIBCXX_CONSTEXPR
348 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
350 ldexp(_Tp __x, int __exp)
351 { return __builtin_ldexp(__x, __exp); }
355 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
356 inline _GLIBCXX_CONSTEXPR float
358 { return __builtin_logf(__x); }
360 inline _GLIBCXX_CONSTEXPR long double
362 { return __builtin_logl(__x); }
365 template<typename _Tp>
366 inline _GLIBCXX_CONSTEXPR
367 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
370 { return __builtin_log(__x); }
374 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
375 inline _GLIBCXX_CONSTEXPR float
377 { return __builtin_log10f(__x); }
379 inline _GLIBCXX_CONSTEXPR long double
380 log10(long double __x)
381 { return __builtin_log10l(__x); }
384 template<typename _Tp>
385 inline _GLIBCXX_CONSTEXPR
386 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
389 { return __builtin_log10(__x); }
393 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
395 modf(float __x, float* __iptr)
396 { return __builtin_modff(__x, __iptr); }
399 modf(long double __x, long double* __iptr)
400 { return __builtin_modfl(__x, __iptr); }
405 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
406 inline _GLIBCXX_CONSTEXPR float
407 pow(float __x, float __y)
408 { return __builtin_powf(__x, __y); }
410 inline _GLIBCXX_CONSTEXPR long double
411 pow(long double __x, long double __y)
412 { return __builtin_powl(__x, __y); }
414 #if __cplusplus < 201103L
415 // _GLIBCXX_RESOLVE_LIB_DEFECTS
416 // DR 550. What should the return type of pow(float,int) be?
418 pow(double __x, int __i)
419 { return __builtin_powi(__x, __i); }
422 pow(float __x, int __n)
423 { return __builtin_powif(__x, __n); }
426 pow(long double __x, int __n)
427 { return __builtin_powil(__x, __n); }
431 template<typename _Tp, typename _Up>
432 inline _GLIBCXX_CONSTEXPR
433 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
434 pow(_Tp __x, _Up __y)
436 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
437 return pow(__type(__x), __type(__y));
442 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
443 inline _GLIBCXX_CONSTEXPR float
445 { return __builtin_sinf(__x); }
447 inline _GLIBCXX_CONSTEXPR long double
449 { return __builtin_sinl(__x); }
452 template<typename _Tp>
453 inline _GLIBCXX_CONSTEXPR
454 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
457 { return __builtin_sin(__x); }
461 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
462 inline _GLIBCXX_CONSTEXPR float
464 { return __builtin_sinhf(__x); }
466 inline _GLIBCXX_CONSTEXPR long double
467 sinh(long double __x)
468 { return __builtin_sinhl(__x); }
471 template<typename _Tp>
472 inline _GLIBCXX_CONSTEXPR
473 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
476 { return __builtin_sinh(__x); }
480 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
481 inline _GLIBCXX_CONSTEXPR float
483 { return __builtin_sqrtf(__x); }
485 inline _GLIBCXX_CONSTEXPR long double
486 sqrt(long double __x)
487 { return __builtin_sqrtl(__x); }
490 template<typename _Tp>
491 inline _GLIBCXX_CONSTEXPR
492 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
495 { return __builtin_sqrt(__x); }
499 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
500 inline _GLIBCXX_CONSTEXPR float
502 { return __builtin_tanf(__x); }
504 inline _GLIBCXX_CONSTEXPR long double
506 { return __builtin_tanl(__x); }
509 template<typename _Tp>
510 inline _GLIBCXX_CONSTEXPR
511 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
514 { return __builtin_tan(__x); }
518 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
519 inline _GLIBCXX_CONSTEXPR float
521 { return __builtin_tanhf(__x); }
523 inline _GLIBCXX_CONSTEXPR long double
524 tanh(long double __x)
525 { return __builtin_tanhl(__x); }
528 template<typename _Tp>
529 inline _GLIBCXX_CONSTEXPR
530 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
533 { return __builtin_tanh(__x); }
535 _GLIBCXX_END_NAMESPACE_VERSION
538 #if _GLIBCXX_USE_C99_MATH
539 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
541 // These are possible macros imported from C99-land.
549 #undef isgreaterequal
555 namespace std _GLIBCXX_VISIBILITY(default)
557 _GLIBCXX_BEGIN_NAMESPACE_VERSION
559 #if __cplusplus >= 201103L
561 fpclassify(float __x)
562 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
563 FP_SUBNORMAL, FP_ZERO, __x); }
566 fpclassify(double __x)
567 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
568 FP_SUBNORMAL, FP_ZERO, __x); }
571 fpclassify(long double __x)
572 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
573 FP_SUBNORMAL, FP_ZERO, __x); }
575 template<typename _Tp>
576 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
579 { return __x != 0 ? FP_NORMAL : FP_ZERO; }
583 { return __builtin_isfinite(__x); }
587 { return __builtin_isfinite(__x); }
590 isfinite(long double __x)
591 { return __builtin_isfinite(__x); }
593 template<typename _Tp>
594 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
601 { return __builtin_isinf(__x); }
605 { return __builtin_isinf(__x); }
608 isinf(long double __x)
609 { return __builtin_isinf(__x); }
611 template<typename _Tp>
612 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
619 { return __builtin_isnan(__x); }
623 { return __builtin_isnan(__x); }
626 isnan(long double __x)
627 { return __builtin_isnan(__x); }
629 template<typename _Tp>
630 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
637 { return __builtin_isnormal(__x); }
641 { return __builtin_isnormal(__x); }
644 isnormal(long double __x)
645 { return __builtin_isnormal(__x); }
647 template<typename _Tp>
648 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
651 { return __x != 0 ? true : false; }
653 // The front-end doesn't provide a type generic builtin (libstdc++/58625).
656 { return __builtin_signbitf(__x); }
660 { return __builtin_signbit(__x); }
663 signbit(long double __x)
664 { return __builtin_signbitl(__x); }
666 template<typename _Tp>
667 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
670 { return __x < 0 ? true : false; }
673 isgreater(float __x, float __y)
674 { return __builtin_isgreater(__x, __y); }
677 isgreater(double __x, double __y)
678 { return __builtin_isgreater(__x, __y); }
681 isgreater(long double __x, long double __y)
682 { return __builtin_isgreater(__x, __y); }
684 template<typename _Tp, typename _Up>
686 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
687 && __is_arithmetic<_Up>::__value), bool>::__type
688 isgreater(_Tp __x, _Up __y)
690 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
691 return __builtin_isgreater(__type(__x), __type(__y));
695 isgreaterequal(float __x, float __y)
696 { return __builtin_isgreaterequal(__x, __y); }
699 isgreaterequal(double __x, double __y)
700 { return __builtin_isgreaterequal(__x, __y); }
703 isgreaterequal(long double __x, long double __y)
704 { return __builtin_isgreaterequal(__x, __y); }
706 template<typename _Tp, typename _Up>
708 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
709 && __is_arithmetic<_Up>::__value), bool>::__type
710 isgreaterequal(_Tp __x, _Up __y)
712 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
713 return __builtin_isgreaterequal(__type(__x), __type(__y));
717 isless(float __x, float __y)
718 { return __builtin_isless(__x, __y); }
721 isless(double __x, double __y)
722 { return __builtin_isless(__x, __y); }
725 isless(long double __x, long double __y)
726 { return __builtin_isless(__x, __y); }
728 template<typename _Tp, typename _Up>
730 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
731 && __is_arithmetic<_Up>::__value), bool>::__type
732 isless(_Tp __x, _Up __y)
734 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
735 return __builtin_isless(__type(__x), __type(__y));
739 islessequal(float __x, float __y)
740 { return __builtin_islessequal(__x, __y); }
743 islessequal(double __x, double __y)
744 { return __builtin_islessequal(__x, __y); }
747 islessequal(long double __x, long double __y)
748 { return __builtin_islessequal(__x, __y); }
750 template<typename _Tp, typename _Up>
752 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
753 && __is_arithmetic<_Up>::__value), bool>::__type
754 islessequal(_Tp __x, _Up __y)
756 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
757 return __builtin_islessequal(__type(__x), __type(__y));
761 islessgreater(float __x, float __y)
762 { return __builtin_islessgreater(__x, __y); }
765 islessgreater(double __x, double __y)
766 { return __builtin_islessgreater(__x, __y); }
769 islessgreater(long double __x, long double __y)
770 { return __builtin_islessgreater(__x, __y); }
772 template<typename _Tp, typename _Up>
774 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
775 && __is_arithmetic<_Up>::__value), bool>::__type
776 islessgreater(_Tp __x, _Up __y)
778 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
779 return __builtin_islessgreater(__type(__x), __type(__y));
783 isunordered(float __x, float __y)
784 { return __builtin_isunordered(__x, __y); }
787 isunordered(double __x, double __y)
788 { return __builtin_isunordered(__x, __y); }
791 isunordered(long double __x, long double __y)
792 { return __builtin_isunordered(__x, __y); }
794 template<typename _Tp, typename _Up>
796 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
797 && __is_arithmetic<_Up>::__value), bool>::__type
798 isunordered(_Tp __x, _Up __y)
800 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
801 return __builtin_isunordered(__type(__x), __type(__y));
806 template<typename _Tp>
807 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
811 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
812 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
813 FP_SUBNORMAL, FP_ZERO, __type(__f));
816 template<typename _Tp>
817 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
821 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
822 return __builtin_isfinite(__type(__f));
825 template<typename _Tp>
826 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
830 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
831 return __builtin_isinf(__type(__f));
834 template<typename _Tp>
835 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
839 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
840 return __builtin_isnan(__type(__f));
843 template<typename _Tp>
844 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
848 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
849 return __builtin_isnormal(__type(__f));
852 template<typename _Tp>
853 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
857 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
858 return sizeof(__type) == sizeof(float)
859 ? __builtin_signbitf(__type(__f))
860 : sizeof(__type) == sizeof(double)
861 ? __builtin_signbit(__type(__f))
862 : __builtin_signbitl(__type(__f));
865 template<typename _Tp>
866 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
868 isgreater(_Tp __f1, _Tp __f2)
870 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
871 return __builtin_isgreater(__type(__f1), __type(__f2));
874 template<typename _Tp>
875 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
877 isgreaterequal(_Tp __f1, _Tp __f2)
879 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
880 return __builtin_isgreaterequal(__type(__f1), __type(__f2));
883 template<typename _Tp>
884 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
886 isless(_Tp __f1, _Tp __f2)
888 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
889 return __builtin_isless(__type(__f1), __type(__f2));
892 template<typename _Tp>
893 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
895 islessequal(_Tp __f1, _Tp __f2)
897 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
898 return __builtin_islessequal(__type(__f1), __type(__f2));
901 template<typename _Tp>
902 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
904 islessgreater(_Tp __f1, _Tp __f2)
906 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
907 return __builtin_islessgreater(__type(__f1), __type(__f2));
910 template<typename _Tp>
911 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
913 isunordered(_Tp __f1, _Tp __f2)
915 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
916 return __builtin_isunordered(__type(__f1), __type(__f2));
921 _GLIBCXX_END_NAMESPACE_VERSION
924 #endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
927 #if __cplusplus >= 201103L
929 #ifdef _GLIBCXX_USE_C99_MATH_TR1
1037 namespace std _GLIBCXX_VISIBILITY(default)
1039 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1151 using ::nexttowardf;
1152 using ::nexttowardl;
1186 /// Additional overloads.
1189 { return __builtin_acoshf(__x); }
1191 constexpr long double
1192 acosh(long double __x)
1193 { return __builtin_acoshl(__x); }
1195 template<typename _Tp>
1196 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1199 { return __builtin_acosh(__x); }
1203 { return __builtin_asinhf(__x); }
1205 constexpr long double
1206 asinh(long double __x)
1207 { return __builtin_asinhl(__x); }
1209 template<typename _Tp>
1210 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1213 { return __builtin_asinh(__x); }
1217 { return __builtin_atanhf(__x); }
1219 constexpr long double
1220 atanh(long double __x)
1221 { return __builtin_atanhl(__x); }
1223 template<typename _Tp>
1224 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1227 { return __builtin_atanh(__x); }
1231 { return __builtin_cbrtf(__x); }
1233 constexpr long double
1234 cbrt(long double __x)
1235 { return __builtin_cbrtl(__x); }
1237 template<typename _Tp>
1238 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1241 { return __builtin_cbrt(__x); }
1244 copysign(float __x, float __y)
1245 { return __builtin_copysignf(__x, __y); }
1247 constexpr long double
1248 copysign(long double __x, long double __y)
1249 { return __builtin_copysignl(__x, __y); }
1251 template<typename _Tp, typename _Up>
1252 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1253 copysign(_Tp __x, _Up __y)
1255 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1256 return copysign(__type(__x), __type(__y));
1261 { return __builtin_erff(__x); }
1263 constexpr long double
1264 erf(long double __x)
1265 { return __builtin_erfl(__x); }
1267 template<typename _Tp>
1268 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1271 { return __builtin_erf(__x); }
1275 { return __builtin_erfcf(__x); }
1277 constexpr long double
1278 erfc(long double __x)
1279 { return __builtin_erfcl(__x); }
1281 template<typename _Tp>
1282 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1285 { return __builtin_erfc(__x); }
1289 { return __builtin_exp2f(__x); }
1291 constexpr long double
1292 exp2(long double __x)
1293 { return __builtin_exp2l(__x); }
1295 template<typename _Tp>
1296 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1299 { return __builtin_exp2(__x); }
1303 { return __builtin_expm1f(__x); }
1305 constexpr long double
1306 expm1(long double __x)
1307 { return __builtin_expm1l(__x); }
1309 template<typename _Tp>
1310 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1313 { return __builtin_expm1(__x); }
1316 fdim(float __x, float __y)
1317 { return __builtin_fdimf(__x, __y); }
1319 constexpr long double
1320 fdim(long double __x, long double __y)
1321 { return __builtin_fdiml(__x, __y); }
1323 template<typename _Tp, typename _Up>
1324 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1325 fdim(_Tp __x, _Up __y)
1327 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1328 return fdim(__type(__x), __type(__y));
1332 fma(float __x, float __y, float __z)
1333 { return __builtin_fmaf(__x, __y, __z); }
1335 constexpr long double
1336 fma(long double __x, long double __y, long double __z)
1337 { return __builtin_fmal(__x, __y, __z); }
1339 template<typename _Tp, typename _Up, typename _Vp>
1340 constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
1341 fma(_Tp __x, _Up __y, _Vp __z)
1343 typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
1344 return fma(__type(__x), __type(__y), __type(__z));
1348 fmax(float __x, float __y)
1349 { return __builtin_fmaxf(__x, __y); }
1351 constexpr long double
1352 fmax(long double __x, long double __y)
1353 { return __builtin_fmaxl(__x, __y); }
1355 template<typename _Tp, typename _Up>
1356 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1357 fmax(_Tp __x, _Up __y)
1359 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1360 return fmax(__type(__x), __type(__y));
1364 fmin(float __x, float __y)
1365 { return __builtin_fminf(__x, __y); }
1367 constexpr long double
1368 fmin(long double __x, long double __y)
1369 { return __builtin_fminl(__x, __y); }
1371 template<typename _Tp, typename _Up>
1372 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1373 fmin(_Tp __x, _Up __y)
1375 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1376 return fmin(__type(__x), __type(__y));
1380 hypot(float __x, float __y)
1381 { return __builtin_hypotf(__x, __y); }
1383 constexpr long double
1384 hypot(long double __x, long double __y)
1385 { return __builtin_hypotl(__x, __y); }
1387 template<typename _Tp, typename _Up>
1388 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1389 hypot(_Tp __x, _Up __y)
1391 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1392 return hypot(__type(__x), __type(__y));
1397 { return __builtin_ilogbf(__x); }
1400 ilogb(long double __x)
1401 { return __builtin_ilogbl(__x); }
1403 template<typename _Tp>
1405 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1408 { return __builtin_ilogb(__x); }
1412 { return __builtin_lgammaf(__x); }
1414 constexpr long double
1415 lgamma(long double __x)
1416 { return __builtin_lgammal(__x); }
1418 template<typename _Tp>
1419 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1422 { return __builtin_lgamma(__x); }
1426 { return __builtin_llrintf(__x); }
1429 llrint(long double __x)
1430 { return __builtin_llrintl(__x); }
1432 template<typename _Tp>
1433 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1436 { return __builtin_llrint(__x); }
1440 { return __builtin_llroundf(__x); }
1443 llround(long double __x)
1444 { return __builtin_llroundl(__x); }
1446 template<typename _Tp>
1447 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1450 { return __builtin_llround(__x); }
1454 { return __builtin_log1pf(__x); }
1456 constexpr long double
1457 log1p(long double __x)
1458 { return __builtin_log1pl(__x); }
1460 template<typename _Tp>
1461 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1464 { return __builtin_log1p(__x); }
1469 { return __builtin_log2f(__x); }
1471 constexpr long double
1472 log2(long double __x)
1473 { return __builtin_log2l(__x); }
1475 template<typename _Tp>
1476 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1479 { return __builtin_log2(__x); }
1483 { return __builtin_logbf(__x); }
1485 constexpr long double
1486 logb(long double __x)
1487 { return __builtin_logbl(__x); }
1489 template<typename _Tp>
1490 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1493 { return __builtin_logb(__x); }
1497 { return __builtin_lrintf(__x); }
1500 lrint(long double __x)
1501 { return __builtin_lrintl(__x); }
1503 template<typename _Tp>
1504 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1507 { return __builtin_lrint(__x); }
1511 { return __builtin_lroundf(__x); }
1514 lround(long double __x)
1515 { return __builtin_lroundl(__x); }
1517 template<typename _Tp>
1518 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1521 { return __builtin_lround(__x); }
1524 nearbyint(float __x)
1525 { return __builtin_nearbyintf(__x); }
1527 constexpr long double
1528 nearbyint(long double __x)
1529 { return __builtin_nearbyintl(__x); }
1531 template<typename _Tp>
1532 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1535 { return __builtin_nearbyint(__x); }
1538 nextafter(float __x, float __y)
1539 { return __builtin_nextafterf(__x, __y); }
1541 constexpr long double
1542 nextafter(long double __x, long double __y)
1543 { return __builtin_nextafterl(__x, __y); }
1545 template<typename _Tp, typename _Up>
1546 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1547 nextafter(_Tp __x, _Up __y)
1549 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1550 return nextafter(__type(__x), __type(__y));
1554 nexttoward(float __x, long double __y)
1555 { return __builtin_nexttowardf(__x, __y); }
1557 constexpr long double
1558 nexttoward(long double __x, long double __y)
1559 { return __builtin_nexttowardl(__x, __y); }
1561 template<typename _Tp>
1562 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1564 nexttoward(_Tp __x, long double __y)
1565 { return __builtin_nexttoward(__x, __y); }
1568 remainder(float __x, float __y)
1569 { return __builtin_remainderf(__x, __y); }
1571 constexpr long double
1572 remainder(long double __x, long double __y)
1573 { return __builtin_remainderl(__x, __y); }
1575 template<typename _Tp, typename _Up>
1576 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1577 remainder(_Tp __x, _Up __y)
1579 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1580 return remainder(__type(__x), __type(__y));
1584 remquo(float __x, float __y, int* __pquo)
1585 { return __builtin_remquof(__x, __y, __pquo); }
1588 remquo(long double __x, long double __y, int* __pquo)
1589 { return __builtin_remquol(__x, __y, __pquo); }
1591 template<typename _Tp, typename _Up>
1592 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1593 remquo(_Tp __x, _Up __y, int* __pquo)
1595 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1596 return remquo(__type(__x), __type(__y), __pquo);
1601 { return __builtin_rintf(__x); }
1603 constexpr long double
1604 rint(long double __x)
1605 { return __builtin_rintl(__x); }
1607 template<typename _Tp>
1608 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1611 { return __builtin_rint(__x); }
1615 { return __builtin_roundf(__x); }
1617 constexpr long double
1618 round(long double __x)
1619 { return __builtin_roundl(__x); }
1621 template<typename _Tp>
1622 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1625 { return __builtin_round(__x); }
1628 scalbln(float __x, long __ex)
1629 { return __builtin_scalblnf(__x, __ex); }
1631 constexpr long double
1632 scalbln(long double __x, long __ex)
1633 { return __builtin_scalblnl(__x, __ex); }
1635 template<typename _Tp>
1636 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1638 scalbln(_Tp __x, long __ex)
1639 { return __builtin_scalbln(__x, __ex); }
1642 scalbn(float __x, int __ex)
1643 { return __builtin_scalbnf(__x, __ex); }
1645 constexpr long double
1646 scalbn(long double __x, int __ex)
1647 { return __builtin_scalbnl(__x, __ex); }
1649 template<typename _Tp>
1650 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1652 scalbn(_Tp __x, int __ex)
1653 { return __builtin_scalbn(__x, __ex); }
1657 { return __builtin_tgammaf(__x); }
1659 constexpr long double
1660 tgamma(long double __x)
1661 { return __builtin_tgammal(__x); }
1663 template<typename _Tp>
1664 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1667 { return __builtin_tgamma(__x); }
1671 { return __builtin_truncf(__x); }
1673 constexpr long double
1674 trunc(long double __x)
1675 { return __builtin_truncl(__x); }
1677 template<typename _Tp>
1678 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1681 { return __builtin_trunc(__x); }
1683 _GLIBCXX_END_NAMESPACE_VERSION
1686 #endif // _GLIBCXX_USE_C99_MATH_TR1