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