libstdc++

cmath
Go to the documentation of this file.
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