1 // -*- C++ -*- C forwarding header.
3 // Copyright (C) 1997-2015 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 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
563 fpclassify(float __x)
564 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
565 FP_SUBNORMAL, FP_ZERO, __x); }
568 fpclassify(double __x)
569 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
570 FP_SUBNORMAL, FP_ZERO, __x); }
573 fpclassify(long double __x)
574 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
575 FP_SUBNORMAL, FP_ZERO, __x); }
578 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
579 template<typename _Tp>
580 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
583 { return __x != 0 ? FP_NORMAL : FP_ZERO; }
586 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
589 { return __builtin_isfinite(__x); }
593 { return __builtin_isfinite(__x); }
596 isfinite(long double __x)
597 { return __builtin_isfinite(__x); }
600 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
601 template<typename _Tp>
602 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
608 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
611 { return __builtin_isinf(__x); }
615 { return __builtin_isinf(__x); }
618 isinf(long double __x)
619 { return __builtin_isinf(__x); }
622 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
623 template<typename _Tp>
624 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
630 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
633 { return __builtin_isnan(__x); }
637 { return __builtin_isnan(__x); }
640 isnan(long double __x)
641 { return __builtin_isnan(__x); }
644 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
645 template<typename _Tp>
646 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
652 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
655 { return __builtin_isnormal(__x); }
659 { return __builtin_isnormal(__x); }
662 isnormal(long double __x)
663 { return __builtin_isnormal(__x); }
666 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
667 template<typename _Tp>
668 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
671 { return __x != 0 ? true : false; }
674 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
675 // The front-end doesn't provide a type generic builtin (libstdc++/58625).
678 { return __builtin_signbitf(__x); }
682 { return __builtin_signbit(__x); }
685 signbit(long double __x)
686 { return __builtin_signbitl(__x); }
689 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
690 template<typename _Tp>
691 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
694 { return __x < 0 ? true : false; }
697 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
699 isgreater(float __x, float __y)
700 { return __builtin_isgreater(__x, __y); }
703 isgreater(double __x, double __y)
704 { return __builtin_isgreater(__x, __y); }
707 isgreater(long double __x, long double __y)
708 { return __builtin_isgreater(__x, __y); }
711 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
712 template<typename _Tp, typename _Up>
714 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
715 && __is_arithmetic<_Up>::__value), bool>::__type
716 isgreater(_Tp __x, _Up __y)
718 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
719 return __builtin_isgreater(__type(__x), __type(__y));
723 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
725 isgreaterequal(float __x, float __y)
726 { return __builtin_isgreaterequal(__x, __y); }
729 isgreaterequal(double __x, double __y)
730 { return __builtin_isgreaterequal(__x, __y); }
733 isgreaterequal(long double __x, long double __y)
734 { return __builtin_isgreaterequal(__x, __y); }
737 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
738 template<typename _Tp, typename _Up>
740 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
741 && __is_arithmetic<_Up>::__value), bool>::__type
742 isgreaterequal(_Tp __x, _Up __y)
744 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
745 return __builtin_isgreaterequal(__type(__x), __type(__y));
749 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
751 isless(float __x, float __y)
752 { return __builtin_isless(__x, __y); }
755 isless(double __x, double __y)
756 { return __builtin_isless(__x, __y); }
759 isless(long double __x, long double __y)
760 { return __builtin_isless(__x, __y); }
763 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
764 template<typename _Tp, typename _Up>
766 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
767 && __is_arithmetic<_Up>::__value), bool>::__type
768 isless(_Tp __x, _Up __y)
770 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
771 return __builtin_isless(__type(__x), __type(__y));
775 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
777 islessequal(float __x, float __y)
778 { return __builtin_islessequal(__x, __y); }
781 islessequal(double __x, double __y)
782 { return __builtin_islessequal(__x, __y); }
785 islessequal(long double __x, long double __y)
786 { return __builtin_islessequal(__x, __y); }
789 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
790 template<typename _Tp, typename _Up>
792 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
793 && __is_arithmetic<_Up>::__value), bool>::__type
794 islessequal(_Tp __x, _Up __y)
796 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
797 return __builtin_islessequal(__type(__x), __type(__y));
801 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
803 islessgreater(float __x, float __y)
804 { return __builtin_islessgreater(__x, __y); }
807 islessgreater(double __x, double __y)
808 { return __builtin_islessgreater(__x, __y); }
811 islessgreater(long double __x, long double __y)
812 { return __builtin_islessgreater(__x, __y); }
815 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
816 template<typename _Tp, typename _Up>
818 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
819 && __is_arithmetic<_Up>::__value), bool>::__type
820 islessgreater(_Tp __x, _Up __y)
822 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
823 return __builtin_islessgreater(__type(__x), __type(__y));
827 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
829 isunordered(float __x, float __y)
830 { return __builtin_isunordered(__x, __y); }
833 isunordered(double __x, double __y)
834 { return __builtin_isunordered(__x, __y); }
837 isunordered(long double __x, long double __y)
838 { return __builtin_isunordered(__x, __y); }
841 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
842 template<typename _Tp, typename _Up>
844 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
845 && __is_arithmetic<_Up>::__value), bool>::__type
846 isunordered(_Tp __x, _Up __y)
848 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
849 return __builtin_isunordered(__type(__x), __type(__y));
855 template<typename _Tp>
856 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
860 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
861 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
862 FP_SUBNORMAL, FP_ZERO, __type(__f));
865 template<typename _Tp>
866 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
870 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
871 return __builtin_isfinite(__type(__f));
874 template<typename _Tp>
875 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
879 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
880 return __builtin_isinf(__type(__f));
883 template<typename _Tp>
884 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
888 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
889 return __builtin_isnan(__type(__f));
892 template<typename _Tp>
893 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
897 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
898 return __builtin_isnormal(__type(__f));
901 template<typename _Tp>
902 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
906 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
907 return sizeof(__type) == sizeof(float)
908 ? __builtin_signbitf(__type(__f))
909 : sizeof(__type) == sizeof(double)
910 ? __builtin_signbit(__type(__f))
911 : __builtin_signbitl(__type(__f));
914 template<typename _Tp>
915 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
917 isgreater(_Tp __f1, _Tp __f2)
919 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
920 return __builtin_isgreater(__type(__f1), __type(__f2));
923 template<typename _Tp>
924 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
926 isgreaterequal(_Tp __f1, _Tp __f2)
928 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
929 return __builtin_isgreaterequal(__type(__f1), __type(__f2));
932 template<typename _Tp>
933 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
935 isless(_Tp __f1, _Tp __f2)
937 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
938 return __builtin_isless(__type(__f1), __type(__f2));
941 template<typename _Tp>
942 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
944 islessequal(_Tp __f1, _Tp __f2)
946 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
947 return __builtin_islessequal(__type(__f1), __type(__f2));
950 template<typename _Tp>
951 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
953 islessgreater(_Tp __f1, _Tp __f2)
955 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
956 return __builtin_islessgreater(__type(__f1), __type(__f2));
959 template<typename _Tp>
960 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
962 isunordered(_Tp __f1, _Tp __f2)
964 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
965 return __builtin_isunordered(__type(__f1), __type(__f2));
970 _GLIBCXX_END_NAMESPACE_VERSION
973 #endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
976 #if __cplusplus >= 201103L
978 #ifdef _GLIBCXX_USE_C99_MATH_TR1
1086 namespace std _GLIBCXX_VISIBILITY(default)
1088 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1200 using ::nexttowardf;
1201 using ::nexttowardl;
1235 /// Additional overloads.
1236 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1239 { return __builtin_acoshf(__x); }
1241 constexpr long double
1242 acosh(long double __x)
1243 { return __builtin_acoshl(__x); }
1246 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1247 template<typename _Tp>
1248 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1251 { return __builtin_acosh(__x); }
1254 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1257 { return __builtin_asinhf(__x); }
1259 constexpr long double
1260 asinh(long double __x)
1261 { return __builtin_asinhl(__x); }
1264 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1265 template<typename _Tp>
1266 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1269 { return __builtin_asinh(__x); }
1272 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1275 { return __builtin_atanhf(__x); }
1277 constexpr long double
1278 atanh(long double __x)
1279 { return __builtin_atanhl(__x); }
1282 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1283 template<typename _Tp>
1284 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1287 { return __builtin_atanh(__x); }
1290 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1293 { return __builtin_cbrtf(__x); }
1295 constexpr long double
1296 cbrt(long double __x)
1297 { return __builtin_cbrtl(__x); }
1300 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1301 template<typename _Tp>
1302 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1305 { return __builtin_cbrt(__x); }
1308 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1310 copysign(float __x, float __y)
1311 { return __builtin_copysignf(__x, __y); }
1313 constexpr long double
1314 copysign(long double __x, long double __y)
1315 { return __builtin_copysignl(__x, __y); }
1318 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1319 template<typename _Tp, typename _Up>
1320 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1321 copysign(_Tp __x, _Up __y)
1323 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1324 return copysign(__type(__x), __type(__y));
1328 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1331 { return __builtin_erff(__x); }
1333 constexpr long double
1334 erf(long double __x)
1335 { return __builtin_erfl(__x); }
1338 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1339 template<typename _Tp>
1340 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1343 { return __builtin_erf(__x); }
1346 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1349 { return __builtin_erfcf(__x); }
1351 constexpr long double
1352 erfc(long double __x)
1353 { return __builtin_erfcl(__x); }
1356 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1357 template<typename _Tp>
1358 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1361 { return __builtin_erfc(__x); }
1364 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1367 { return __builtin_exp2f(__x); }
1369 constexpr long double
1370 exp2(long double __x)
1371 { return __builtin_exp2l(__x); }
1374 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1375 template<typename _Tp>
1376 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1379 { return __builtin_exp2(__x); }
1382 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1385 { return __builtin_expm1f(__x); }
1387 constexpr long double
1388 expm1(long double __x)
1389 { return __builtin_expm1l(__x); }
1392 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1393 template<typename _Tp>
1394 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1397 { return __builtin_expm1(__x); }
1400 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1402 fdim(float __x, float __y)
1403 { return __builtin_fdimf(__x, __y); }
1405 constexpr long double
1406 fdim(long double __x, long double __y)
1407 { return __builtin_fdiml(__x, __y); }
1410 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1411 template<typename _Tp, typename _Up>
1412 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1413 fdim(_Tp __x, _Up __y)
1415 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1416 return fdim(__type(__x), __type(__y));
1420 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1422 fma(float __x, float __y, float __z)
1423 { return __builtin_fmaf(__x, __y, __z); }
1425 constexpr long double
1426 fma(long double __x, long double __y, long double __z)
1427 { return __builtin_fmal(__x, __y, __z); }
1430 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1431 template<typename _Tp, typename _Up, typename _Vp>
1432 constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
1433 fma(_Tp __x, _Up __y, _Vp __z)
1435 typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
1436 return fma(__type(__x), __type(__y), __type(__z));
1440 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1442 fmax(float __x, float __y)
1443 { return __builtin_fmaxf(__x, __y); }
1445 constexpr long double
1446 fmax(long double __x, long double __y)
1447 { return __builtin_fmaxl(__x, __y); }
1450 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1451 template<typename _Tp, typename _Up>
1452 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1453 fmax(_Tp __x, _Up __y)
1455 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1456 return fmax(__type(__x), __type(__y));
1460 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1462 fmin(float __x, float __y)
1463 { return __builtin_fminf(__x, __y); }
1465 constexpr long double
1466 fmin(long double __x, long double __y)
1467 { return __builtin_fminl(__x, __y); }
1470 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1471 template<typename _Tp, typename _Up>
1472 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1473 fmin(_Tp __x, _Up __y)
1475 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1476 return fmin(__type(__x), __type(__y));
1480 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1482 hypot(float __x, float __y)
1483 { return __builtin_hypotf(__x, __y); }
1485 constexpr long double
1486 hypot(long double __x, long double __y)
1487 { return __builtin_hypotl(__x, __y); }
1490 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1491 template<typename _Tp, typename _Up>
1492 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1493 hypot(_Tp __x, _Up __y)
1495 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1496 return hypot(__type(__x), __type(__y));
1500 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1503 { return __builtin_ilogbf(__x); }
1506 ilogb(long double __x)
1507 { return __builtin_ilogbl(__x); }
1510 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1511 template<typename _Tp>
1513 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1516 { return __builtin_ilogb(__x); }
1519 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1522 { return __builtin_lgammaf(__x); }
1524 constexpr long double
1525 lgamma(long double __x)
1526 { return __builtin_lgammal(__x); }
1529 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1530 template<typename _Tp>
1531 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1534 { return __builtin_lgamma(__x); }
1537 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1540 { return __builtin_llrintf(__x); }
1543 llrint(long double __x)
1544 { return __builtin_llrintl(__x); }
1547 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1548 template<typename _Tp>
1549 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1552 { return __builtin_llrint(__x); }
1555 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1558 { return __builtin_llroundf(__x); }
1561 llround(long double __x)
1562 { return __builtin_llroundl(__x); }
1565 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1566 template<typename _Tp>
1567 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1570 { return __builtin_llround(__x); }
1573 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1576 { return __builtin_log1pf(__x); }
1578 constexpr long double
1579 log1p(long double __x)
1580 { return __builtin_log1pl(__x); }
1583 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1584 template<typename _Tp>
1585 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1588 { return __builtin_log1p(__x); }
1591 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1595 { return __builtin_log2f(__x); }
1597 constexpr long double
1598 log2(long double __x)
1599 { return __builtin_log2l(__x); }
1602 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1603 template<typename _Tp>
1604 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1607 { return __builtin_log2(__x); }
1610 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1613 { return __builtin_logbf(__x); }
1615 constexpr long double
1616 logb(long double __x)
1617 { return __builtin_logbl(__x); }
1620 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1621 template<typename _Tp>
1622 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1625 { return __builtin_logb(__x); }
1628 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1631 { return __builtin_lrintf(__x); }
1634 lrint(long double __x)
1635 { return __builtin_lrintl(__x); }
1638 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1639 template<typename _Tp>
1640 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1643 { return __builtin_lrint(__x); }
1646 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1649 { return __builtin_lroundf(__x); }
1652 lround(long double __x)
1653 { return __builtin_lroundl(__x); }
1656 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1657 template<typename _Tp>
1658 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1661 { return __builtin_lround(__x); }
1664 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1666 nearbyint(float __x)
1667 { return __builtin_nearbyintf(__x); }
1669 constexpr long double
1670 nearbyint(long double __x)
1671 { return __builtin_nearbyintl(__x); }
1674 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1675 template<typename _Tp>
1676 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1679 { return __builtin_nearbyint(__x); }
1682 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1684 nextafter(float __x, float __y)
1685 { return __builtin_nextafterf(__x, __y); }
1687 constexpr long double
1688 nextafter(long double __x, long double __y)
1689 { return __builtin_nextafterl(__x, __y); }
1692 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1693 template<typename _Tp, typename _Up>
1694 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1695 nextafter(_Tp __x, _Up __y)
1697 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1698 return nextafter(__type(__x), __type(__y));
1702 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1704 nexttoward(float __x, long double __y)
1705 { return __builtin_nexttowardf(__x, __y); }
1707 constexpr long double
1708 nexttoward(long double __x, long double __y)
1709 { return __builtin_nexttowardl(__x, __y); }
1712 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1713 template<typename _Tp>
1714 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1716 nexttoward(_Tp __x, long double __y)
1717 { return __builtin_nexttoward(__x, __y); }
1720 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1722 remainder(float __x, float __y)
1723 { return __builtin_remainderf(__x, __y); }
1725 constexpr long double
1726 remainder(long double __x, long double __y)
1727 { return __builtin_remainderl(__x, __y); }
1730 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1731 template<typename _Tp, typename _Up>
1732 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1733 remainder(_Tp __x, _Up __y)
1735 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1736 return remainder(__type(__x), __type(__y));
1740 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1742 remquo(float __x, float __y, int* __pquo)
1743 { return __builtin_remquof(__x, __y, __pquo); }
1746 remquo(long double __x, long double __y, int* __pquo)
1747 { return __builtin_remquol(__x, __y, __pquo); }
1750 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1751 template<typename _Tp, typename _Up>
1752 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1753 remquo(_Tp __x, _Up __y, int* __pquo)
1755 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1756 return remquo(__type(__x), __type(__y), __pquo);
1760 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1763 { return __builtin_rintf(__x); }
1765 constexpr long double
1766 rint(long double __x)
1767 { return __builtin_rintl(__x); }
1770 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1771 template<typename _Tp>
1772 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1775 { return __builtin_rint(__x); }
1778 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1781 { return __builtin_roundf(__x); }
1783 constexpr long double
1784 round(long double __x)
1785 { return __builtin_roundl(__x); }
1788 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1789 template<typename _Tp>
1790 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1793 { return __builtin_round(__x); }
1796 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1798 scalbln(float __x, long __ex)
1799 { return __builtin_scalblnf(__x, __ex); }
1801 constexpr long double
1802 scalbln(long double __x, long __ex)
1803 { return __builtin_scalblnl(__x, __ex); }
1806 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1807 template<typename _Tp>
1808 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1810 scalbln(_Tp __x, long __ex)
1811 { return __builtin_scalbln(__x, __ex); }
1814 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1816 scalbn(float __x, int __ex)
1817 { return __builtin_scalbnf(__x, __ex); }
1819 constexpr long double
1820 scalbn(long double __x, int __ex)
1821 { return __builtin_scalbnl(__x, __ex); }
1824 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1825 template<typename _Tp>
1826 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1828 scalbn(_Tp __x, int __ex)
1829 { return __builtin_scalbn(__x, __ex); }
1832 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1835 { return __builtin_tgammaf(__x); }
1837 constexpr long double
1838 tgamma(long double __x)
1839 { return __builtin_tgammal(__x); }
1842 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1843 template<typename _Tp>
1844 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1847 { return __builtin_tgamma(__x); }
1850 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1853 { return __builtin_truncf(__x); }
1855 constexpr long double
1856 trunc(long double __x)
1857 { return __builtin_truncl(__x); }
1860 #ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1861 template<typename _Tp>
1862 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1865 { return __builtin_trunc(__x); }
1868 _GLIBCXX_END_NAMESPACE_VERSION
1871 #endif // _GLIBCXX_USE_C99_MATH_TR1