cmath revision 1.1.1.9
1// -*- C++ -*- C forwarding header.
2
3// Copyright (C) 1997-2017 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#pragma GCC system_header
40
41#include <bits/c++config.h>
42#include <bits/cpp_type_traits.h>
43#include <ext/type_traits.h>
44#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
45#include_next <math.h>
46#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
47#include <bits/std_abs.h>
48
49#ifndef _GLIBCXX_CMATH
50#define _GLIBCXX_CMATH 1
51
52// Get rid of those macros defined in <math.h> in lieu of real functions.
53#undef div
54#undef acos
55#undef asin
56#undef atan
57#undef atan2
58#undef ceil
59#undef cos
60#undef cosh
61#undef exp
62#undef fabs
63#undef floor
64#undef fmod
65#undef frexp
66#undef ldexp
67#undef log
68#undef log10
69#undef modf
70#undef pow
71#undef sin
72#undef sinh
73#undef sqrt
74#undef tan
75#undef tanh
76
77extern "C++"
78{
79namespace std _GLIBCXX_VISIBILITY(default)
80{
81_GLIBCXX_BEGIN_NAMESPACE_VERSION
82
83  using ::acos;
84
85#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
86  inline _GLIBCXX_CONSTEXPR float
87  acos(float __x)
88  { return __builtin_acosf(__x); }
89
90  inline _GLIBCXX_CONSTEXPR long double
91  acos(long double __x)
92  { return __builtin_acosl(__x); }
93#endif
94
95  template<typename _Tp>
96    inline _GLIBCXX_CONSTEXPR
97    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
98                                    double>::__type
99    acos(_Tp __x)
100    { return __builtin_acos(__x); }
101
102  using ::asin;
103
104#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
105  inline _GLIBCXX_CONSTEXPR float
106  asin(float __x)
107  { return __builtin_asinf(__x); }
108
109  inline _GLIBCXX_CONSTEXPR long double
110  asin(long double __x)
111  { return __builtin_asinl(__x); }
112#endif
113
114  template<typename _Tp>
115    inline _GLIBCXX_CONSTEXPR
116    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
117                                    double>::__type
118    asin(_Tp __x)
119    { return __builtin_asin(__x); }
120
121  using ::atan;
122
123#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
124  inline _GLIBCXX_CONSTEXPR float
125  atan(float __x)
126  { return __builtin_atanf(__x); }
127
128  inline _GLIBCXX_CONSTEXPR long double
129  atan(long double __x)
130  { return __builtin_atanl(__x); }
131#endif
132
133  template<typename _Tp>
134    inline _GLIBCXX_CONSTEXPR
135    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
136                                    double>::__type
137    atan(_Tp __x)
138    { return __builtin_atan(__x); }
139
140  using ::atan2;
141
142#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
143  inline _GLIBCXX_CONSTEXPR float
144  atan2(float __y, float __x)
145  { return __builtin_atan2f(__y, __x); }
146
147  inline _GLIBCXX_CONSTEXPR long double
148  atan2(long double __y, long double __x)
149  { return __builtin_atan2l(__y, __x); }
150#endif
151
152  template<typename _Tp, typename _Up>
153    inline _GLIBCXX_CONSTEXPR
154    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
155    atan2(_Tp __y, _Up __x)
156    {
157      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
158      return atan2(__type(__y), __type(__x));
159    }
160
161  using ::ceil;
162
163#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
164  inline _GLIBCXX_CONSTEXPR float
165  ceil(float __x)
166  { return __builtin_ceilf(__x); }
167
168  inline _GLIBCXX_CONSTEXPR long double
169  ceil(long double __x)
170  { return __builtin_ceill(__x); }
171#endif
172
173  template<typename _Tp>
174    inline _GLIBCXX_CONSTEXPR
175    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
176                                    double>::__type
177    ceil(_Tp __x)
178    { return __builtin_ceil(__x); }
179
180  using ::cos;
181
182#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
183  inline _GLIBCXX_CONSTEXPR float
184  cos(float __x)
185  { return __builtin_cosf(__x); }
186
187  inline _GLIBCXX_CONSTEXPR long double
188  cos(long double __x)
189  { return __builtin_cosl(__x); }
190#endif
191
192  template<typename _Tp>
193    inline _GLIBCXX_CONSTEXPR
194    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
195                                    double>::__type
196    cos(_Tp __x)
197    { return __builtin_cos(__x); }
198
199  using ::cosh;
200
201#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
202  inline _GLIBCXX_CONSTEXPR float
203  cosh(float __x)
204  { return __builtin_coshf(__x); }
205
206  inline _GLIBCXX_CONSTEXPR long double
207  cosh(long double __x)
208  { return __builtin_coshl(__x); }
209#endif
210
211  template<typename _Tp>
212    inline _GLIBCXX_CONSTEXPR
213    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
214                                    double>::__type
215    cosh(_Tp __x)
216    { return __builtin_cosh(__x); }
217
218  using ::exp;
219
220#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
221  inline _GLIBCXX_CONSTEXPR float
222  exp(float __x)
223  { return __builtin_expf(__x); }
224
225  inline _GLIBCXX_CONSTEXPR long double
226  exp(long double __x)
227  { return __builtin_expl(__x); }
228#endif
229
230  template<typename _Tp>
231    inline _GLIBCXX_CONSTEXPR
232    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
233                                    double>::__type
234    exp(_Tp __x)
235    { return __builtin_exp(__x); }
236
237  using ::fabs;
238
239#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
240  inline _GLIBCXX_CONSTEXPR float
241  fabs(float __x)
242  { return __builtin_fabsf(__x); }
243
244  inline _GLIBCXX_CONSTEXPR long double
245  fabs(long double __x)
246  { return __builtin_fabsl(__x); }
247#endif
248
249  template<typename _Tp>
250    inline _GLIBCXX_CONSTEXPR
251    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
252                                    double>::__type
253    fabs(_Tp __x)
254    { return __builtin_fabs(__x); }
255
256  using ::floor;
257
258#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
259  inline _GLIBCXX_CONSTEXPR float
260  floor(float __x)
261  { return __builtin_floorf(__x); }
262
263  inline _GLIBCXX_CONSTEXPR long double
264  floor(long double __x)
265  { return __builtin_floorl(__x); }
266#endif
267
268  template<typename _Tp>
269    inline _GLIBCXX_CONSTEXPR
270    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
271                                    double>::__type
272    floor(_Tp __x)
273    { return __builtin_floor(__x); }
274
275  using ::fmod;
276
277#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
278  inline _GLIBCXX_CONSTEXPR float
279  fmod(float __x, float __y)
280  { return __builtin_fmodf(__x, __y); }
281
282  inline _GLIBCXX_CONSTEXPR long double
283  fmod(long double __x, long double __y)
284  { return __builtin_fmodl(__x, __y); }
285#endif
286
287  template<typename _Tp, typename _Up>
288    inline _GLIBCXX_CONSTEXPR
289    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
290    fmod(_Tp __x, _Up __y)
291    {
292      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
293      return fmod(__type(__x), __type(__y));
294    }
295
296  using ::frexp;
297
298#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
299  inline float
300  frexp(float __x, int* __exp)
301  { return __builtin_frexpf(__x, __exp); }
302
303  inline long double
304  frexp(long double __x, int* __exp)
305  { return __builtin_frexpl(__x, __exp); }
306#endif
307
308  template<typename _Tp>
309    inline _GLIBCXX_CONSTEXPR
310    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
311                                    double>::__type
312    frexp(_Tp __x, int* __exp)
313    { return __builtin_frexp(__x, __exp); }
314
315  using ::ldexp;
316
317#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
318  inline _GLIBCXX_CONSTEXPR float
319  ldexp(float __x, int __exp)
320  { return __builtin_ldexpf(__x, __exp); }
321
322  inline _GLIBCXX_CONSTEXPR long double
323  ldexp(long double __x, int __exp)
324  { return __builtin_ldexpl(__x, __exp); }
325#endif
326
327  template<typename _Tp>
328    inline _GLIBCXX_CONSTEXPR
329    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
330                                    double>::__type
331    ldexp(_Tp __x, int __exp)
332    { return __builtin_ldexp(__x, __exp); }
333
334  using ::log;
335
336#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
337  inline _GLIBCXX_CONSTEXPR float
338  log(float __x)
339  { return __builtin_logf(__x); }
340
341  inline _GLIBCXX_CONSTEXPR long double
342  log(long double __x)
343  { return __builtin_logl(__x); }
344#endif
345
346  template<typename _Tp>
347    inline _GLIBCXX_CONSTEXPR
348    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
349                                    double>::__type
350    log(_Tp __x)
351    { return __builtin_log(__x); }
352
353  using ::log10;
354
355#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
356  inline _GLIBCXX_CONSTEXPR float
357  log10(float __x)
358  { return __builtin_log10f(__x); }
359
360  inline _GLIBCXX_CONSTEXPR long double
361  log10(long double __x)
362  { return __builtin_log10l(__x); }
363#endif
364
365  template<typename _Tp>
366    inline _GLIBCXX_CONSTEXPR
367    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
368                                    double>::__type
369    log10(_Tp __x)
370    { return __builtin_log10(__x); }
371
372  using ::modf;
373
374#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
375  inline float
376  modf(float __x, float* __iptr)
377  { return __builtin_modff(__x, __iptr); }
378
379  inline long double
380  modf(long double __x, long double* __iptr)
381  { return __builtin_modfl(__x, __iptr); }
382#endif
383
384  using ::pow;
385
386#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
387  inline _GLIBCXX_CONSTEXPR float
388  pow(float __x, float __y)
389  { return __builtin_powf(__x, __y); }
390
391  inline _GLIBCXX_CONSTEXPR long double
392  pow(long double __x, long double __y)
393  { return __builtin_powl(__x, __y); }
394
395#if __cplusplus < 201103L
396  // _GLIBCXX_RESOLVE_LIB_DEFECTS
397  // DR 550. What should the return type of pow(float,int) be?
398  inline double
399  pow(double __x, int __i)
400  { return __builtin_powi(__x, __i); }
401
402  inline float
403  pow(float __x, int __n)
404  { return __builtin_powif(__x, __n); }
405
406  inline long double
407  pow(long double __x, int __n)
408  { return __builtin_powil(__x, __n); }
409#endif
410#endif
411
412  template<typename _Tp, typename _Up>
413    inline _GLIBCXX_CONSTEXPR
414    typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
415    pow(_Tp __x, _Up __y)
416    {
417      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
418      return pow(__type(__x), __type(__y));
419    }
420
421  using ::sin;
422
423#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
424  inline _GLIBCXX_CONSTEXPR float
425  sin(float __x)
426  { return __builtin_sinf(__x); }
427
428  inline _GLIBCXX_CONSTEXPR long double
429  sin(long double __x)
430  { return __builtin_sinl(__x); }
431#endif
432
433  template<typename _Tp>
434    inline _GLIBCXX_CONSTEXPR
435    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
436                                    double>::__type
437    sin(_Tp __x)
438    { return __builtin_sin(__x); }
439
440  using ::sinh;
441
442#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
443  inline _GLIBCXX_CONSTEXPR float
444  sinh(float __x)
445  { return __builtin_sinhf(__x); }
446
447  inline _GLIBCXX_CONSTEXPR long double
448  sinh(long double __x)
449  { return __builtin_sinhl(__x); }
450#endif
451
452  template<typename _Tp>
453    inline _GLIBCXX_CONSTEXPR
454    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
455                                    double>::__type
456    sinh(_Tp __x)
457    { return __builtin_sinh(__x); }
458
459  using ::sqrt;
460
461#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
462  inline _GLIBCXX_CONSTEXPR float
463  sqrt(float __x)
464  { return __builtin_sqrtf(__x); }
465
466  inline _GLIBCXX_CONSTEXPR long double
467  sqrt(long double __x)
468  { return __builtin_sqrtl(__x); }
469#endif
470
471  template<typename _Tp>
472    inline _GLIBCXX_CONSTEXPR
473    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
474                                    double>::__type
475    sqrt(_Tp __x)
476    { return __builtin_sqrt(__x); }
477
478  using ::tan;
479
480#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
481  inline _GLIBCXX_CONSTEXPR float
482  tan(float __x)
483  { return __builtin_tanf(__x); }
484
485  inline _GLIBCXX_CONSTEXPR long double
486  tan(long double __x)
487  { return __builtin_tanl(__x); }
488#endif
489
490  template<typename _Tp>
491    inline _GLIBCXX_CONSTEXPR
492    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
493                                    double>::__type
494    tan(_Tp __x)
495    { return __builtin_tan(__x); }
496
497  using ::tanh;
498
499#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
500  inline _GLIBCXX_CONSTEXPR float
501  tanh(float __x)
502  { return __builtin_tanhf(__x); }
503
504  inline _GLIBCXX_CONSTEXPR long double
505  tanh(long double __x)
506  { return __builtin_tanhl(__x); }
507#endif
508
509  template<typename _Tp>
510    inline _GLIBCXX_CONSTEXPR
511    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
512                                    double>::__type
513    tanh(_Tp __x)
514    { return __builtin_tanh(__x); }
515
516_GLIBCXX_END_NAMESPACE_VERSION
517} // namespace
518
519#if _GLIBCXX_USE_C99_MATH
520#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
521
522// These are possible macros imported from C99-land.
523#undef fpclassify
524#undef isfinite
525#undef isinf
526#undef isnan
527#undef isnormal
528#undef signbit
529#undef isgreater
530#undef isgreaterequal
531#undef isless
532#undef islessequal
533#undef islessgreater
534#undef isunordered
535
536namespace std _GLIBCXX_VISIBILITY(default)
537{
538_GLIBCXX_BEGIN_NAMESPACE_VERSION
539
540#if __cplusplus >= 201103L
541
542#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
543  constexpr int
544  fpclassify(float __x)
545  { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
546				FP_SUBNORMAL, FP_ZERO, __x); }
547
548  constexpr int
549  fpclassify(double __x)
550  { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
551				FP_SUBNORMAL, FP_ZERO, __x); }
552
553  constexpr int
554  fpclassify(long double __x)
555  { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
556				FP_SUBNORMAL, FP_ZERO, __x); }
557#endif
558
559#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
560  template<typename _Tp>
561    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
562                                              int>::__type
563    fpclassify(_Tp __x)
564    { return __x != 0 ? FP_NORMAL : FP_ZERO; }
565#endif
566
567#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
568  constexpr bool
569  isfinite(float __x)
570  { return __builtin_isfinite(__x); }
571
572  constexpr bool
573  isfinite(double __x)
574  { return __builtin_isfinite(__x); }
575
576  constexpr bool
577  isfinite(long double __x)
578  { return __builtin_isfinite(__x); }
579#endif
580
581#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
582  template<typename _Tp>
583    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
584                                              bool>::__type
585    isfinite(_Tp __x)
586    { return true; }
587#endif
588
589#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
590  constexpr bool
591  isinf(float __x)
592  { return __builtin_isinf(__x); }
593
594#if _GLIBCXX_HAVE_OBSOLETE_ISINF \
595  && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC
596  using ::isinf;
597#else
598  constexpr bool
599  isinf(double __x)
600  { return __builtin_isinf(__x); }
601#endif
602
603  constexpr bool
604  isinf(long double __x)
605  { return __builtin_isinf(__x); }
606#endif
607
608#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
609  template<typename _Tp>
610    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
611                                              bool>::__type
612    isinf(_Tp __x)
613    { return false; }
614#endif
615
616#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
617  constexpr bool
618  isnan(float __x)
619  { return __builtin_isnan(__x); }
620
621#if _GLIBCXX_HAVE_OBSOLETE_ISNAN \
622  && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC
623  using ::isnan;
624#else
625  constexpr bool
626  isnan(double __x)
627  { return __builtin_isnan(__x); }
628#endif
629
630  constexpr bool
631  isnan(long double __x)
632  { return __builtin_isnan(__x); }
633#endif
634
635#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
636  template<typename _Tp>
637    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
638                                              bool>::__type
639    isnan(_Tp __x)
640    { return false; }
641#endif
642
643#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
644  constexpr bool
645  isnormal(float __x)
646  { return __builtin_isnormal(__x); }
647
648  constexpr bool
649  isnormal(double __x)
650  { return __builtin_isnormal(__x); }
651
652  constexpr bool
653  isnormal(long double __x)
654  { return __builtin_isnormal(__x); }
655#endif
656
657#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
658  template<typename _Tp>
659    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
660                                              bool>::__type
661    isnormal(_Tp __x)
662    { return __x != 0 ? true : false; }
663#endif
664
665#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
666  // Note: middle-end/36757 is fixed, __builtin_signbit is type-generic.
667  constexpr bool
668  signbit(float __x)
669  { return __builtin_signbit(__x); }
670
671  constexpr bool
672  signbit(double __x)
673  { return __builtin_signbit(__x); }
674
675  constexpr bool
676  signbit(long double __x)
677  { return __builtin_signbit(__x); }
678#endif
679
680#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
681  template<typename _Tp>
682    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
683                                              bool>::__type
684    signbit(_Tp __x)
685    { return __x < 0 ? true : false; }
686#endif
687
688#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
689  constexpr bool
690  isgreater(float __x, float __y)
691  { return __builtin_isgreater(__x, __y); }
692
693  constexpr bool
694  isgreater(double __x, double __y)
695  { return __builtin_isgreater(__x, __y); }
696
697  constexpr bool
698  isgreater(long double __x, long double __y)
699  { return __builtin_isgreater(__x, __y); }
700#endif
701
702#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
703  template<typename _Tp, typename _Up>
704    constexpr typename
705    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
706			    && __is_arithmetic<_Up>::__value), bool>::__type
707    isgreater(_Tp __x, _Up __y)
708    {
709      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
710      return __builtin_isgreater(__type(__x), __type(__y));
711    }
712#endif
713
714#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
715  constexpr bool
716  isgreaterequal(float __x, float __y)
717  { return __builtin_isgreaterequal(__x, __y); }
718
719  constexpr bool
720  isgreaterequal(double __x, double __y)
721  { return __builtin_isgreaterequal(__x, __y); }
722
723  constexpr bool
724  isgreaterequal(long double __x, long double __y)
725  { return __builtin_isgreaterequal(__x, __y); }
726#endif
727
728#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
729  template<typename _Tp, typename _Up>
730    constexpr typename
731    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
732			    && __is_arithmetic<_Up>::__value), bool>::__type
733    isgreaterequal(_Tp __x, _Up __y)
734    {
735      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
736      return __builtin_isgreaterequal(__type(__x), __type(__y));
737    }
738#endif
739
740#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
741  constexpr bool
742  isless(float __x, float __y)
743  { return __builtin_isless(__x, __y); }
744
745  constexpr bool
746  isless(double __x, double __y)
747  { return __builtin_isless(__x, __y); }
748
749  constexpr bool
750  isless(long double __x, long double __y)
751  { return __builtin_isless(__x, __y); }
752#endif
753
754#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
755  template<typename _Tp, typename _Up>
756    constexpr typename
757    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
758			    && __is_arithmetic<_Up>::__value), bool>::__type
759    isless(_Tp __x, _Up __y)
760    {
761      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
762      return __builtin_isless(__type(__x), __type(__y));
763    }
764#endif
765
766#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
767  constexpr bool
768  islessequal(float __x, float __y)
769  { return __builtin_islessequal(__x, __y); }
770
771  constexpr bool
772  islessequal(double __x, double __y)
773  { return __builtin_islessequal(__x, __y); }
774
775  constexpr bool
776  islessequal(long double __x, long double __y)
777  { return __builtin_islessequal(__x, __y); }
778#endif
779
780#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
781  template<typename _Tp, typename _Up>
782    constexpr typename
783    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
784			    && __is_arithmetic<_Up>::__value), bool>::__type
785    islessequal(_Tp __x, _Up __y)
786    {
787      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
788      return __builtin_islessequal(__type(__x), __type(__y));
789    }
790#endif
791
792#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
793  constexpr bool
794  islessgreater(float __x, float __y)
795  { return __builtin_islessgreater(__x, __y); }
796
797  constexpr bool
798  islessgreater(double __x, double __y)
799  { return __builtin_islessgreater(__x, __y); }
800
801  constexpr bool
802  islessgreater(long double __x, long double __y)
803  { return __builtin_islessgreater(__x, __y); }
804#endif
805
806#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
807  template<typename _Tp, typename _Up>
808    constexpr typename
809    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
810			    && __is_arithmetic<_Up>::__value), bool>::__type
811    islessgreater(_Tp __x, _Up __y)
812    {
813      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
814      return __builtin_islessgreater(__type(__x), __type(__y));
815    }
816#endif
817
818#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
819  constexpr bool
820  isunordered(float __x, float __y)
821  { return __builtin_isunordered(__x, __y); }
822
823  constexpr bool
824  isunordered(double __x, double __y)
825  { return __builtin_isunordered(__x, __y); }
826
827  constexpr bool
828  isunordered(long double __x, long double __y)
829  { return __builtin_isunordered(__x, __y); }
830#endif
831
832#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
833  template<typename _Tp, typename _Up>
834    constexpr typename
835    __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
836			    && __is_arithmetic<_Up>::__value), bool>::__type
837    isunordered(_Tp __x, _Up __y)
838    {
839      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
840      return __builtin_isunordered(__type(__x), __type(__y));
841    }
842#endif
843
844#else
845
846  template<typename _Tp>
847    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
848					   int>::__type
849    fpclassify(_Tp __f)
850    {
851      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
852      return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
853				  FP_SUBNORMAL, FP_ZERO, __type(__f));
854    }
855
856  template<typename _Tp>
857    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
858					   int>::__type
859    isfinite(_Tp __f)
860    {
861      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
862      return __builtin_isfinite(__type(__f));
863    }
864
865  template<typename _Tp>
866    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
867					   int>::__type
868    isinf(_Tp __f)
869    {
870      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
871      return __builtin_isinf(__type(__f));
872    }
873
874  template<typename _Tp>
875    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
876					   int>::__type
877    isnan(_Tp __f)
878    {
879      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
880      return __builtin_isnan(__type(__f));
881    }
882
883  template<typename _Tp>
884    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
885					   int>::__type
886    isnormal(_Tp __f)
887    {
888      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
889      return __builtin_isnormal(__type(__f));
890    }
891
892  template<typename _Tp>
893    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
894					   int>::__type
895    signbit(_Tp __f)
896    {
897      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
898      return __builtin_signbit(__type(__f));
899    }
900
901  template<typename _Tp>
902    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
903					   int>::__type
904    isgreater(_Tp __f1, _Tp __f2)
905    {
906      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
907      return __builtin_isgreater(__type(__f1), __type(__f2));
908    }
909
910  template<typename _Tp>
911    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
912					   int>::__type
913    isgreaterequal(_Tp __f1, _Tp __f2)
914    {
915      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
916      return __builtin_isgreaterequal(__type(__f1), __type(__f2));
917    }
918
919  template<typename _Tp>
920    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
921					   int>::__type
922    isless(_Tp __f1, _Tp __f2)
923    {
924      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
925      return __builtin_isless(__type(__f1), __type(__f2));
926    }
927
928  template<typename _Tp>
929    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
930					   int>::__type
931    islessequal(_Tp __f1, _Tp __f2)
932    {
933      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
934      return __builtin_islessequal(__type(__f1), __type(__f2));
935    }
936
937  template<typename _Tp>
938    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
939					   int>::__type
940    islessgreater(_Tp __f1, _Tp __f2)
941    {
942      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
943      return __builtin_islessgreater(__type(__f1), __type(__f2));
944    }
945
946  template<typename _Tp>
947    inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
948					   int>::__type
949    isunordered(_Tp __f1, _Tp __f2)
950    {
951      typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
952      return __builtin_isunordered(__type(__f1), __type(__f2));
953    }
954
955#endif
956
957_GLIBCXX_END_NAMESPACE_VERSION
958} // namespace
959
960#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
961#endif
962
963#if __cplusplus >= 201103L
964
965#ifdef _GLIBCXX_USE_C99_MATH_TR1
966
967#undef acosh
968#undef acoshf
969#undef acoshl
970#undef asinh
971#undef asinhf
972#undef asinhl
973#undef atanh
974#undef atanhf
975#undef atanhl
976#undef cbrt
977#undef cbrtf
978#undef cbrtl
979#undef copysign
980#undef copysignf
981#undef copysignl
982#undef erf
983#undef erff
984#undef erfl
985#undef erfc
986#undef erfcf
987#undef erfcl
988#undef exp2
989#undef exp2f
990#undef exp2l
991#undef expm1
992#undef expm1f
993#undef expm1l
994#undef fdim
995#undef fdimf
996#undef fdiml
997#undef fma
998#undef fmaf
999#undef fmal
1000#undef fmax
1001#undef fmaxf
1002#undef fmaxl
1003#undef fmin
1004#undef fminf
1005#undef fminl
1006#undef hypot
1007#undef hypotf
1008#undef hypotl
1009#undef ilogb
1010#undef ilogbf
1011#undef ilogbl
1012#undef lgamma
1013#undef lgammaf
1014#undef lgammal
1015#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS
1016#undef llrint
1017#undef llrintf
1018#undef llrintl
1019#undef llround
1020#undef llroundf
1021#undef llroundl
1022#endif
1023#undef log1p
1024#undef log1pf
1025#undef log1pl
1026#undef log2
1027#undef log2f
1028#undef log2l
1029#undef logb
1030#undef logbf
1031#undef logbl
1032#undef lrint
1033#undef lrintf
1034#undef lrintl
1035#undef lround
1036#undef lroundf
1037#undef lroundl
1038#undef nan
1039#undef nanf
1040#undef nanl
1041#undef nearbyint
1042#undef nearbyintf
1043#undef nearbyintl
1044#undef nextafter
1045#undef nextafterf
1046#undef nextafterl
1047#undef nexttoward
1048#undef nexttowardf
1049#undef nexttowardl
1050#undef remainder
1051#undef remainderf
1052#undef remainderl
1053#undef remquo
1054#undef remquof
1055#undef remquol
1056#undef rint
1057#undef rintf
1058#undef rintl
1059#undef round
1060#undef roundf
1061#undef roundl
1062#undef scalbln
1063#undef scalblnf
1064#undef scalblnl
1065#undef scalbn
1066#undef scalbnf
1067#undef scalbnl
1068#undef tgamma
1069#undef tgammaf
1070#undef tgammal
1071#undef trunc
1072#undef truncf
1073#undef truncl
1074
1075namespace std _GLIBCXX_VISIBILITY(default)
1076{
1077_GLIBCXX_BEGIN_NAMESPACE_VERSION
1078
1079  // types
1080  using ::double_t;
1081  using ::float_t;
1082
1083  // functions
1084  using ::acosh;
1085  using ::acoshf;
1086  using ::acoshl;
1087
1088  using ::asinh;
1089  using ::asinhf;
1090  using ::asinhl;
1091
1092  using ::atanh;
1093  using ::atanhf;
1094  using ::atanhl;
1095
1096  using ::cbrt;
1097  using ::cbrtf;
1098  using ::cbrtl;
1099
1100  using ::copysign;
1101  using ::copysignf;
1102  using ::copysignl;
1103
1104  using ::erf;
1105  using ::erff;
1106  using ::erfl;
1107
1108  using ::erfc;
1109  using ::erfcf;
1110  using ::erfcl;
1111
1112  using ::exp2;
1113  using ::exp2f;
1114  using ::exp2l;
1115
1116  using ::expm1;
1117  using ::expm1f;
1118  using ::expm1l;
1119
1120  using ::fdim;
1121  using ::fdimf;
1122  using ::fdiml;
1123
1124  using ::fma;
1125  using ::fmaf;
1126  using ::fmal;
1127
1128  using ::fmax;
1129  using ::fmaxf;
1130  using ::fmaxl;
1131
1132  using ::fmin;
1133  using ::fminf;
1134  using ::fminl;
1135
1136  using ::hypot;
1137  using ::hypotf;
1138  using ::hypotl;
1139
1140  using ::ilogb;
1141  using ::ilogbf;
1142  using ::ilogbl;
1143
1144  using ::lgamma;
1145  using ::lgammaf;
1146  using ::lgammal;
1147
1148#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS
1149  using ::llrint;
1150  using ::llrintf;
1151  using ::llrintl;
1152
1153  using ::llround;
1154  using ::llroundf;
1155  using ::llroundl;
1156#endif
1157
1158  using ::log1p;
1159  using ::log1pf;
1160  using ::log1pl;
1161
1162  using ::log2;
1163  using ::log2f;
1164  using ::log2l;
1165
1166  using ::logb;
1167  using ::logbf;
1168  using ::logbl;
1169
1170  using ::lrint;
1171  using ::lrintf;
1172  using ::lrintl;
1173
1174  using ::lround;
1175  using ::lroundf;
1176  using ::lroundl;
1177
1178  using ::nan;
1179  using ::nanf;
1180  using ::nanl;
1181
1182  using ::nearbyint;
1183  using ::nearbyintf;
1184  using ::nearbyintl;
1185
1186  using ::nextafter;
1187  using ::nextafterf;
1188  using ::nextafterl;
1189
1190  using ::nexttoward;
1191  using ::nexttowardf;
1192  using ::nexttowardl;
1193
1194  using ::remainder;
1195  using ::remainderf;
1196  using ::remainderl;
1197
1198  using ::remquo;
1199  using ::remquof;
1200  using ::remquol;
1201
1202  using ::rint;
1203  using ::rintf;
1204  using ::rintl;
1205
1206  using ::round;
1207  using ::roundf;
1208  using ::roundl;
1209
1210  using ::scalbln;
1211  using ::scalblnf;
1212  using ::scalblnl;
1213
1214  using ::scalbn;
1215  using ::scalbnf;
1216  using ::scalbnl;
1217
1218  using ::tgamma;
1219  using ::tgammaf;
1220  using ::tgammal;
1221
1222  using ::trunc;
1223  using ::truncf;
1224  using ::truncl;
1225
1226  /// Additional overloads.
1227#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1228  constexpr float
1229  acosh(float __x)
1230  { return __builtin_acoshf(__x); }
1231
1232  constexpr long double
1233  acosh(long double __x)
1234  { return __builtin_acoshl(__x); }
1235#endif
1236
1237#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1238  template<typename _Tp>
1239    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1240                                              double>::__type
1241    acosh(_Tp __x)
1242    { return __builtin_acosh(__x); }
1243#endif
1244
1245#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1246  constexpr float
1247  asinh(float __x)
1248  { return __builtin_asinhf(__x); }
1249
1250  constexpr long double
1251  asinh(long double __x)
1252  { return __builtin_asinhl(__x); }
1253#endif
1254
1255#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1256  template<typename _Tp>
1257    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1258                                              double>::__type
1259    asinh(_Tp __x)
1260    { return __builtin_asinh(__x); }
1261#endif
1262
1263#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1264  constexpr float
1265  atanh(float __x)
1266  { return __builtin_atanhf(__x); }
1267
1268  constexpr long double
1269  atanh(long double __x)
1270  { return __builtin_atanhl(__x); }
1271#endif
1272
1273#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1274  template<typename _Tp>
1275    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1276                                              double>::__type
1277    atanh(_Tp __x)
1278    { return __builtin_atanh(__x); }
1279#endif
1280
1281#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1282  constexpr float
1283  cbrt(float __x)
1284  { return __builtin_cbrtf(__x); }
1285
1286  constexpr long double
1287  cbrt(long double __x)
1288  { return __builtin_cbrtl(__x); }
1289#endif
1290
1291#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1292  template<typename _Tp>
1293    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1294                                              double>::__type
1295    cbrt(_Tp __x)
1296    { return __builtin_cbrt(__x); }
1297#endif
1298
1299#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1300  constexpr float
1301  copysign(float __x, float __y)
1302  { return __builtin_copysignf(__x, __y); }
1303
1304  constexpr long double
1305  copysign(long double __x, long double __y)
1306  { return __builtin_copysignl(__x, __y); }
1307#endif
1308
1309#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1310  template<typename _Tp, typename _Up>
1311    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1312    copysign(_Tp __x, _Up __y)
1313    {
1314      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1315      return copysign(__type(__x), __type(__y));
1316    }
1317#endif
1318
1319#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1320  constexpr float
1321  erf(float __x)
1322  { return __builtin_erff(__x); }
1323
1324  constexpr long double
1325  erf(long double __x)
1326  { return __builtin_erfl(__x); }
1327#endif
1328
1329#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1330  template<typename _Tp>
1331    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1332                                              double>::__type
1333    erf(_Tp __x)
1334    { return __builtin_erf(__x); }
1335#endif
1336
1337#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1338  constexpr float
1339  erfc(float __x)
1340  { return __builtin_erfcf(__x); }
1341
1342  constexpr long double
1343  erfc(long double __x)
1344  { return __builtin_erfcl(__x); }
1345#endif
1346
1347#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1348  template<typename _Tp>
1349    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1350                                              double>::__type
1351    erfc(_Tp __x)
1352    { return __builtin_erfc(__x); }
1353#endif
1354
1355#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1356  constexpr float
1357  exp2(float __x)
1358  { return __builtin_exp2f(__x); }
1359
1360  constexpr long double
1361  exp2(long double __x)
1362  { return __builtin_exp2l(__x); }
1363#endif
1364
1365#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1366  template<typename _Tp>
1367    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1368                                              double>::__type
1369    exp2(_Tp __x)
1370    { return __builtin_exp2(__x); }
1371#endif
1372
1373#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1374  constexpr float
1375  expm1(float __x)
1376  { return __builtin_expm1f(__x); }
1377
1378  constexpr long double
1379  expm1(long double __x)
1380  { return __builtin_expm1l(__x); }
1381#endif
1382
1383#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1384  template<typename _Tp>
1385    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1386                                              double>::__type
1387    expm1(_Tp __x)
1388    { return __builtin_expm1(__x); }
1389#endif
1390
1391#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1392  constexpr float
1393  fdim(float __x, float __y)
1394  { return __builtin_fdimf(__x, __y); }
1395
1396  constexpr long double
1397  fdim(long double __x, long double __y)
1398  { return __builtin_fdiml(__x, __y); }
1399#endif
1400
1401#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1402  template<typename _Tp, typename _Up>
1403    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1404    fdim(_Tp __x, _Up __y)
1405    {
1406      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1407      return fdim(__type(__x), __type(__y));
1408    }
1409#endif
1410
1411#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1412  constexpr float
1413  fma(float __x, float __y, float __z)
1414  { return __builtin_fmaf(__x, __y, __z); }
1415
1416  constexpr long double
1417  fma(long double __x, long double __y, long double __z)
1418  { return __builtin_fmal(__x, __y, __z); }
1419#endif
1420
1421#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1422  template<typename _Tp, typename _Up, typename _Vp>
1423    constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
1424    fma(_Tp __x, _Up __y, _Vp __z)
1425    {
1426      typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
1427      return fma(__type(__x), __type(__y), __type(__z));
1428    }
1429#endif
1430
1431#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1432  constexpr float
1433  fmax(float __x, float __y)
1434  { return __builtin_fmaxf(__x, __y); }
1435
1436  constexpr long double
1437  fmax(long double __x, long double __y)
1438  { return __builtin_fmaxl(__x, __y); }
1439#endif
1440
1441#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1442  template<typename _Tp, typename _Up>
1443    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1444    fmax(_Tp __x, _Up __y)
1445    {
1446      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1447      return fmax(__type(__x), __type(__y));
1448    }
1449#endif
1450
1451#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1452  constexpr float
1453  fmin(float __x, float __y)
1454  { return __builtin_fminf(__x, __y); }
1455
1456  constexpr long double
1457  fmin(long double __x, long double __y)
1458  { return __builtin_fminl(__x, __y); }
1459#endif
1460
1461#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1462  template<typename _Tp, typename _Up>
1463    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1464    fmin(_Tp __x, _Up __y)
1465    {
1466      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1467      return fmin(__type(__x), __type(__y));
1468    }
1469#endif
1470
1471#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1472  constexpr float
1473  hypot(float __x, float __y)
1474  { return __builtin_hypotf(__x, __y); }
1475
1476  constexpr long double
1477  hypot(long double __x, long double __y)
1478  { return __builtin_hypotl(__x, __y); }
1479#endif
1480
1481#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1482  template<typename _Tp, typename _Up>
1483    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1484    hypot(_Tp __x, _Up __y)
1485    {
1486      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1487      return hypot(__type(__x), __type(__y));
1488    }
1489#endif
1490
1491#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1492  constexpr int
1493  ilogb(float __x)
1494  { return __builtin_ilogbf(__x); }
1495
1496  constexpr int
1497  ilogb(long double __x)
1498  { return __builtin_ilogbl(__x); }
1499#endif
1500
1501#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1502  template<typename _Tp>
1503    constexpr
1504    typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1505                                    int>::__type
1506    ilogb(_Tp __x)
1507    { return __builtin_ilogb(__x); }
1508#endif
1509
1510#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1511  constexpr float
1512  lgamma(float __x)
1513  { return __builtin_lgammaf(__x); }
1514
1515  constexpr long double
1516  lgamma(long double __x)
1517  { return __builtin_lgammal(__x); }
1518#endif
1519
1520#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1521  template<typename _Tp>
1522    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1523                                              double>::__type
1524    lgamma(_Tp __x)
1525    { return __builtin_lgamma(__x); }
1526#endif
1527
1528#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1529  constexpr long long
1530  llrint(float __x)
1531  { return __builtin_llrintf(__x); }
1532
1533  constexpr long long
1534  llrint(long double __x)
1535  { return __builtin_llrintl(__x); }
1536#endif
1537
1538#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1539  template<typename _Tp>
1540    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1541                                              long long>::__type
1542    llrint(_Tp __x)
1543    { return __builtin_llrint(__x); }
1544#endif
1545
1546#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1547  constexpr long long
1548  llround(float __x)
1549  { return __builtin_llroundf(__x); }
1550
1551  constexpr long long
1552  llround(long double __x)
1553  { return __builtin_llroundl(__x); }
1554#endif
1555
1556#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1557  template<typename _Tp>
1558    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1559                                              long long>::__type
1560    llround(_Tp __x)
1561    { return __builtin_llround(__x); }
1562#endif
1563
1564#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1565  constexpr float
1566  log1p(float __x)
1567  { return __builtin_log1pf(__x); }
1568
1569  constexpr long double
1570  log1p(long double __x)
1571  { return __builtin_log1pl(__x); }
1572#endif
1573
1574#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1575  template<typename _Tp>
1576    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1577                                              double>::__type
1578    log1p(_Tp __x)
1579    { return __builtin_log1p(__x); }
1580#endif
1581
1582#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1583  // DR 568.
1584  constexpr float
1585  log2(float __x)
1586  { return __builtin_log2f(__x); }
1587
1588  constexpr long double
1589  log2(long double __x)
1590  { return __builtin_log2l(__x); }
1591#endif
1592
1593#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1594  template<typename _Tp>
1595    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1596                                              double>::__type
1597    log2(_Tp __x)
1598    { return __builtin_log2(__x); }
1599#endif
1600
1601#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1602  constexpr float
1603  logb(float __x)
1604  { return __builtin_logbf(__x); }
1605
1606  constexpr long double
1607  logb(long double __x)
1608  { return __builtin_logbl(__x); }
1609#endif
1610
1611#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1612  template<typename _Tp>
1613    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1614                                              double>::__type
1615    logb(_Tp __x)
1616    { return __builtin_logb(__x); }
1617#endif
1618
1619#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1620  constexpr long
1621  lrint(float __x)
1622  { return __builtin_lrintf(__x); }
1623
1624  constexpr long
1625  lrint(long double __x)
1626  { return __builtin_lrintl(__x); }
1627#endif
1628
1629#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1630  template<typename _Tp>
1631    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1632                                              long>::__type
1633    lrint(_Tp __x)
1634    { return __builtin_lrint(__x); }
1635#endif
1636
1637#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1638  constexpr long
1639  lround(float __x)
1640  { return __builtin_lroundf(__x); }
1641
1642  constexpr long
1643  lround(long double __x)
1644  { return __builtin_lroundl(__x); }
1645#endif
1646
1647#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1648  template<typename _Tp>
1649    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1650                                              long>::__type
1651    lround(_Tp __x)
1652    { return __builtin_lround(__x); }
1653#endif
1654
1655#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1656  constexpr float
1657  nearbyint(float __x)
1658  { return __builtin_nearbyintf(__x); }
1659
1660  constexpr long double
1661  nearbyint(long double __x)
1662  { return __builtin_nearbyintl(__x); }
1663#endif
1664
1665#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1666  template<typename _Tp>
1667    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1668                                              double>::__type
1669    nearbyint(_Tp __x)
1670    { return __builtin_nearbyint(__x); }
1671#endif
1672
1673#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1674  constexpr float
1675  nextafter(float __x, float __y)
1676  { return __builtin_nextafterf(__x, __y); }
1677
1678  constexpr long double
1679  nextafter(long double __x, long double __y)
1680  { return __builtin_nextafterl(__x, __y); }
1681#endif
1682
1683#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1684  template<typename _Tp, typename _Up>
1685    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1686    nextafter(_Tp __x, _Up __y)
1687    {
1688      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1689      return nextafter(__type(__x), __type(__y));
1690    }
1691#endif
1692
1693#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1694  constexpr float
1695  nexttoward(float __x, long double __y)
1696  { return __builtin_nexttowardf(__x, __y); }
1697
1698  constexpr long double
1699  nexttoward(long double __x, long double __y)
1700  { return __builtin_nexttowardl(__x, __y); }
1701#endif
1702
1703#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1704  template<typename _Tp>
1705    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1706                                              double>::__type
1707    nexttoward(_Tp __x, long double __y)
1708    { return __builtin_nexttoward(__x, __y); }
1709#endif
1710
1711#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1712  constexpr float
1713  remainder(float __x, float __y)
1714  { return __builtin_remainderf(__x, __y); }
1715
1716  constexpr long double
1717  remainder(long double __x, long double __y)
1718  { return __builtin_remainderl(__x, __y); }
1719#endif
1720
1721#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1722  template<typename _Tp, typename _Up>
1723    constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1724    remainder(_Tp __x, _Up __y)
1725    {
1726      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1727      return remainder(__type(__x), __type(__y));
1728    }
1729#endif
1730
1731#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1732  inline float
1733  remquo(float __x, float __y, int* __pquo)
1734  { return __builtin_remquof(__x, __y, __pquo); }
1735
1736  inline long double
1737  remquo(long double __x, long double __y, int* __pquo)
1738  { return __builtin_remquol(__x, __y, __pquo); }
1739#endif
1740
1741#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1742  template<typename _Tp, typename _Up>
1743    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1744    remquo(_Tp __x, _Up __y, int* __pquo)
1745    {
1746      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1747      return remquo(__type(__x), __type(__y), __pquo);
1748    }
1749#endif
1750
1751#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1752  constexpr float
1753  rint(float __x)
1754  { return __builtin_rintf(__x); }
1755
1756  constexpr long double
1757  rint(long double __x)
1758  { return __builtin_rintl(__x); }
1759#endif
1760
1761#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1762  template<typename _Tp>
1763    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1764                                              double>::__type
1765    rint(_Tp __x)
1766    { return __builtin_rint(__x); }
1767#endif
1768
1769#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1770  constexpr float
1771  round(float __x)
1772  { return __builtin_roundf(__x); }
1773
1774  constexpr long double
1775  round(long double __x)
1776  { return __builtin_roundl(__x); }
1777#endif
1778
1779#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1780  template<typename _Tp>
1781    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1782                                              double>::__type
1783    round(_Tp __x)
1784    { return __builtin_round(__x); }
1785#endif
1786
1787#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1788  constexpr float
1789  scalbln(float __x, long __ex)
1790  { return __builtin_scalblnf(__x, __ex); }
1791
1792  constexpr long double
1793  scalbln(long double __x, long __ex)
1794  { return __builtin_scalblnl(__x, __ex); }
1795#endif
1796
1797#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1798  template<typename _Tp>
1799    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1800                                              double>::__type
1801    scalbln(_Tp __x, long __ex)
1802    { return __builtin_scalbln(__x, __ex); }
1803#endif
1804 
1805#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1806  constexpr float
1807  scalbn(float __x, int __ex)
1808  { return __builtin_scalbnf(__x, __ex); }
1809
1810  constexpr long double
1811  scalbn(long double __x, int __ex)
1812  { return __builtin_scalbnl(__x, __ex); }
1813#endif
1814
1815#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1816  template<typename _Tp>
1817    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1818                                              double>::__type
1819    scalbn(_Tp __x, int __ex)
1820    { return __builtin_scalbn(__x, __ex); }
1821#endif
1822
1823#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1824  constexpr float
1825  tgamma(float __x)
1826  { return __builtin_tgammaf(__x); }
1827
1828  constexpr long double
1829  tgamma(long double __x)
1830  { return __builtin_tgammal(__x); }
1831#endif
1832
1833#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1834  template<typename _Tp>
1835    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1836                                              double>::__type
1837    tgamma(_Tp __x)
1838    { return __builtin_tgamma(__x); }
1839#endif
1840 
1841#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1842  constexpr float
1843  trunc(float __x)
1844  { return __builtin_truncf(__x); }
1845
1846  constexpr long double
1847  trunc(long double __x)
1848  { return __builtin_truncl(__x); }
1849#endif
1850
1851#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1852  template<typename _Tp>
1853    constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
1854                                              double>::__type
1855    trunc(_Tp __x)
1856    { return __builtin_trunc(__x); }
1857#endif
1858
1859_GLIBCXX_END_NAMESPACE_VERSION
1860} // namespace
1861
1862#endif // _GLIBCXX_USE_C99_MATH_TR1
1863
1864#endif // C++11
1865
1866#if __cplusplus > 201402L
1867namespace std _GLIBCXX_VISIBILITY(default)
1868{
1869_GLIBCXX_BEGIN_NAMESPACE_VERSION
1870
1871  // [c.math.hypot3], three-dimensional hypotenuse
1872#define __cpp_lib_hypot 201603
1873
1874  template<typename _Tp>
1875    inline _Tp
1876    __hypot3(_Tp __x, _Tp __y, _Tp __z)
1877    {
1878      __x = std::abs(__x);
1879      __y = std::abs(__y);
1880      __z = std::abs(__z);
1881      if (_Tp __a = __x < __y ? __y < __z ? __z : __y : __x < __z ? __z : __x)
1882	return __a * std::sqrt((__x / __a) * (__x / __a)
1883			       + (__y / __a) * (__y / __a)
1884			       + (__z / __a) * (__z / __a));
1885      else
1886	return {};
1887    }
1888
1889  inline float
1890  hypot(float __x, float __y, float __z)
1891  { return std::__hypot3<float>(__x, __y, __z); }
1892
1893  inline double
1894  hypot(double __x, double __y, double __z)
1895  { return std::__hypot3<double>(__x, __y, __z); }
1896
1897  inline long double
1898  hypot(long double __x, long double __y, long double __z)
1899  { return std::__hypot3<long double>(__x, __y, __z); }
1900
1901  template<typename _Tp, typename _Up, typename _Vp>
1902    typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
1903    hypot(_Tp __x, _Up __y, _Vp __z)
1904    {
1905      using __type = typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type;
1906      return std::__hypot3<__type>(__x, __y, __z);
1907    }
1908_GLIBCXX_END_NAMESPACE_VERSION
1909} // namespace
1910#endif // C++17
1911
1912
1913#if _GLIBCXX_USE_STD_SPEC_FUNCS
1914#  include <bits/specfun.h>
1915#endif
1916
1917} // extern "C++"
1918
1919#endif
1920