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