1// -*- C++ -*- C forwarding header.
2
3// Copyright (C) 1997-2024 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/requires_hosted.h>
42
43#include <bits/c++config.h>
44#include <bits/cpp_type_traits.h>
45#include <ext/type_traits.h>
46#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
47#include_next <math.h>
48#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
49#include <bits/std_abs.h>
50
51#ifndef _GLIBCXX_CMATH
52#define _GLIBCXX_CMATH 1
53
54#define __glibcxx_want_hypot
55#define __glibcxx_want_interpolate
56#include <bits/version.h>
57
58// Get rid of those macros defined in <math.h> in lieu of real functions.
59#undef div
60#undef acos
61#undef asin
62#undef atan
63#undef atan2
64#undef ceil
65#undef cos
66#undef cosh
67#undef exp
68#undef fabs
69#undef floor
70#undef fmod
71#undef frexp
72#undef ldexp
73#undef log
74#undef log10
75#undef modf
76#undef pow
77#undef sin
78#undef sinh
79#undef sqrt
80#undef tan
81#undef tanh
82
83extern "C++"
84{
85namespace std _GLIBCXX_VISIBILITY(default)
86{
87_GLIBCXX_BEGIN_NAMESPACE_VERSION
88
89 using ::acos;
90
91#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
92 inline _GLIBCXX_CONSTEXPR float
93 acos(float __x)
94 { return __builtin_acosf(__x); }
95
96 inline _GLIBCXX_CONSTEXPR long double
97 acos(long double __x)
98 { return __builtin_acosl(__x); }
99#endif
100
101 template<typename _Tp>
102 inline _GLIBCXX_CONSTEXPR
103 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
104 double>::__type
105 acos(_Tp __x)
106 { return __builtin_acos(__x); }
107
108 using ::asin;
109
110#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
111 inline _GLIBCXX_CONSTEXPR float
112 asin(float __x)
113 { return __builtin_asinf(__x); }
114
115 inline _GLIBCXX_CONSTEXPR long double
116 asin(long double __x)
117 { return __builtin_asinl(__x); }
118#endif
119
120 template<typename _Tp>
121 inline _GLIBCXX_CONSTEXPR
122 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
123 double>::__type
124 asin(_Tp __x)
125 { return __builtin_asin(__x); }
126
127 using ::atan;
128
129#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
130 inline _GLIBCXX_CONSTEXPR float
131 atan(float __x)
132 { return __builtin_atanf(__x); }
133
134 inline _GLIBCXX_CONSTEXPR long double
135 atan(long double __x)
136 { return __builtin_atanl(__x); }
137#endif
138
139 template<typename _Tp>
140 inline _GLIBCXX_CONSTEXPR
141 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
142 double>::__type
143 atan(_Tp __x)
144 { return __builtin_atan(__x); }
145
146 using ::atan2;
147
148#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
149 inline _GLIBCXX_CONSTEXPR float
150 atan2(float __y, float __x)
151 { return __builtin_atan2f(__y, __x); }
152
153 inline _GLIBCXX_CONSTEXPR long double
154 atan2(long double __y, long double __x)
155 { return __builtin_atan2l(__y, __x); }
156#endif
157
158 using ::ceil;
159
160#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
161 inline _GLIBCXX_CONSTEXPR float
162 ceil(float __x)
163 { return __builtin_ceilf(__x); }
164
165 inline _GLIBCXX_CONSTEXPR long double
166 ceil(long double __x)
167 { return __builtin_ceill(__x); }
168#endif
169
170 template<typename _Tp>
171 inline _GLIBCXX_CONSTEXPR
172 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
173 double>::__type
174 ceil(_Tp __x)
175 { return __builtin_ceil(__x); }
176
177 using ::cos;
178
179#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
180 inline _GLIBCXX_CONSTEXPR float
181 cos(float __x)
182 { return __builtin_cosf(__x); }
183
184 inline _GLIBCXX_CONSTEXPR long double
185 cos(long double __x)
186 { return __builtin_cosl(__x); }
187#endif
188
189 template<typename _Tp>
190 inline _GLIBCXX_CONSTEXPR
191 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
192 double>::__type
193 cos(_Tp __x)
194 { return __builtin_cos(__x); }
195
196 using ::cosh;
197
198#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
199 inline _GLIBCXX_CONSTEXPR float
200 cosh(float __x)
201 { return __builtin_coshf(__x); }
202
203 inline _GLIBCXX_CONSTEXPR long double
204 cosh(long double __x)
205 { return __builtin_coshl(__x); }
206#endif
207
208 template<typename _Tp>
209 inline _GLIBCXX_CONSTEXPR
210 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
211 double>::__type
212 cosh(_Tp __x)
213 { return __builtin_cosh(__x); }
214
215 using ::exp;
216
217#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
218 inline _GLIBCXX_CONSTEXPR float
219 exp(float __x)
220 { return __builtin_expf(__x); }
221
222 inline _GLIBCXX_CONSTEXPR long double
223 exp(long double __x)
224 { return __builtin_expl(__x); }
225#endif
226
227 template<typename _Tp>
228 inline _GLIBCXX_CONSTEXPR
229 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
230 double>::__type
231 exp(_Tp __x)
232 { return __builtin_exp(__x); }
233
234 using ::fabs;
235
236#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
237 inline _GLIBCXX_CONSTEXPR float
238 fabs(float __x)
239 { return __builtin_fabsf(__x); }
240
241 inline _GLIBCXX_CONSTEXPR long double
242 fabs(long double __x)
243 { return __builtin_fabsl(__x); }
244#endif
245
246 template<typename _Tp>
247 inline _GLIBCXX_CONSTEXPR
248 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
249 double>::__type
250 fabs(_Tp __x)
251 { return __builtin_fabs(__x); }
252
253 using ::floor;
254
255#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
256 inline _GLIBCXX_CONSTEXPR float
257 floor(float __x)
258 { return __builtin_floorf(__x); }
259
260 inline _GLIBCXX_CONSTEXPR long double
261 floor(long double __x)
262 { return __builtin_floorl(__x); }
263#endif
264
265 template<typename _Tp>
266 inline _GLIBCXX_CONSTEXPR
267 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
268 double>::__type
269 floor(_Tp __x)
270 { return __builtin_floor(__x); }
271
272 using ::fmod;
273
274#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
275 inline _GLIBCXX_CONSTEXPR float
276 fmod(float __x, float __y)
277 { return __builtin_fmodf(__x, __y); }
278
279 inline _GLIBCXX_CONSTEXPR long double
280 fmod(long double __x, long double __y)
281 { return __builtin_fmodl(__x, __y); }
282#endif
283
284 using ::frexp;
285
286#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
287 inline float
288 frexp(float __x, int* __exp)
289 { return __builtin_frexpf(__x, __exp); }
290
291 inline long double
292 frexp(long double __x, int* __exp)
293 { return __builtin_frexpl(__x, __exp); }
294#endif
295
296 template<typename _Tp>
297 inline _GLIBCXX_CONSTEXPR
298 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
299 double>::__type
300 frexp(_Tp __x, int* __exp)
301 { return __builtin_frexp(__x, __exp); }
302
303 using ::ldexp;
304
305#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
306 inline _GLIBCXX_CONSTEXPR float
307 ldexp(float __x, int __exp)
308 { return __builtin_ldexpf(__x, __exp); }
309
310 inline _GLIBCXX_CONSTEXPR long double
311 ldexp(long double __x, int __exp)
312 { return __builtin_ldexpl(__x, __exp); }
313#endif
314
315 template<typename _Tp>
316 inline _GLIBCXX_CONSTEXPR
317 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
318 double>::__type
319 ldexp(_Tp __x, int __exp)
320 { return __builtin_ldexp(__x, __exp); }
321
322 using ::log;
323
324#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
325 inline _GLIBCXX_CONSTEXPR float
326 log(float __x)
327 { return __builtin_logf(__x); }
328
329 inline _GLIBCXX_CONSTEXPR long double
330 log(long double __x)
331 { return __builtin_logl(__x); }
332#endif
333
334 template<typename _Tp>
335 inline _GLIBCXX_CONSTEXPR
336 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
337 double>::__type
338 log(_Tp __x)
339 { return __builtin_log(__x); }
340
341 using ::log10;
342
343#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
344 inline _GLIBCXX_CONSTEXPR float
345 log10(float __x)
346 { return __builtin_log10f(__x); }
347
348 inline _GLIBCXX_CONSTEXPR long double
349 log10(long double __x)
350 { return __builtin_log10l(__x); }
351#endif
352
353 template<typename _Tp>
354 inline _GLIBCXX_CONSTEXPR
355 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
356 double>::__type
357 log10(_Tp __x)
358 { return __builtin_log10(__x); }
359
360 using ::modf;
361
362#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
363 inline float
364 modf(float __x, float* __iptr)
365 { return __builtin_modff(__x, __iptr); }
366
367 inline long double
368 modf(long double __x, long double* __iptr)
369 { return __builtin_modfl(__x, __iptr); }
370#endif
371
372 using ::pow;
373
374#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
375 inline _GLIBCXX_CONSTEXPR float
376 pow(float __x, float __y)
377 { return __builtin_powf(__x, __y); }
378
379 inline _GLIBCXX_CONSTEXPR long double
380 pow(long double __x, long double __y)
381 { return __builtin_powl(__x, __y); }
382
383#if __cplusplus < 201103L
384 // _GLIBCXX_RESOLVE_LIB_DEFECTS
385 // DR 550. What should the return type of pow(float,int) be?
386 inline double
387 pow(double __x, int __i)
388 { return __builtin_powi(__x, __i); }
389
390 inline float
391 pow(float __x, int __n)
392 { return __builtin_powif(__x, __n); }
393
394 inline long double
395 pow(long double __x, int __n)
396 { return __builtin_powil(__x, __n); }
397#endif
398#endif
399
400 using ::sin;
401
402#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
403 inline _GLIBCXX_CONSTEXPR float
404 sin(float __x)
405 { return __builtin_sinf(__x); }
406
407 inline _GLIBCXX_CONSTEXPR long double
408 sin(long double __x)
409 { return __builtin_sinl(__x); }
410#endif
411
412 template<typename _Tp>
413 inline _GLIBCXX_CONSTEXPR
414 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
415 double>::__type
416 sin(_Tp __x)
417 { return __builtin_sin(__x); }
418
419 using ::sinh;
420
421#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
422 inline _GLIBCXX_CONSTEXPR float
423 sinh(float __x)
424 { return __builtin_sinhf(__x); }
425
426 inline _GLIBCXX_CONSTEXPR long double
427 sinh(long double __x)
428 { return __builtin_sinhl(__x); }
429#endif
430
431 template<typename _Tp>
432 inline _GLIBCXX_CONSTEXPR
433 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
434 double>::__type
435 sinh(_Tp __x)
436 { return __builtin_sinh(__x); }
437
438 using ::sqrt;
439
440#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
441 inline _GLIBCXX_CONSTEXPR float
442 sqrt(float __x)
443 { return __builtin_sqrtf(__x); }
444
445 inline _GLIBCXX_CONSTEXPR long double
446 sqrt(long double __x)
447 { return __builtin_sqrtl(__x); }
448#endif
449
450 template<typename _Tp>
451 inline _GLIBCXX_CONSTEXPR
452 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
453 double>::__type
454 sqrt(_Tp __x)
455 { return __builtin_sqrt(__x); }
456
457 using ::tan;
458
459#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
460 inline _GLIBCXX_CONSTEXPR float
461 tan(float __x)
462 { return __builtin_tanf(__x); }
463
464 inline _GLIBCXX_CONSTEXPR long double
465 tan(long double __x)
466 { return __builtin_tanl(__x); }
467#endif
468
469 template<typename _Tp>
470 inline _GLIBCXX_CONSTEXPR
471 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
472 double>::__type
473 tan(_Tp __x)
474 { return __builtin_tan(__x); }
475
476 using ::tanh;
477
478#ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
479 inline _GLIBCXX_CONSTEXPR float
480 tanh(float __x)
481 { return __builtin_tanhf(__x); }
482
483 inline _GLIBCXX_CONSTEXPR long double
484 tanh(long double __x)
485 { return __builtin_tanhl(__x); }
486#endif
487
488 template<typename _Tp>
489 inline _GLIBCXX_CONSTEXPR
490 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
491 double>::__type
492 tanh(_Tp __x)
493 { return __builtin_tanh(__x); }
494
495#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
496 constexpr _Float16
497 acos(_Float16 __x)
498 { return _Float16(__builtin_acosf(__x)); }
499
500 constexpr _Float16
501 asin(_Float16 __x)
502 { return _Float16(__builtin_asinf(__x)); }
503
504 constexpr _Float16
505 atan(_Float16 __x)
506 { return _Float16(__builtin_atanf(__x)); }
507
508 constexpr _Float16
509 atan2(_Float16 __y, _Float16 __x)
510 { return _Float16(__builtin_atan2f(__y, __x)); }
511
512 constexpr _Float16
513 ceil(_Float16 __x)
514 { return _Float16(__builtin_ceilf(__x)); }
515
516 constexpr _Float16
517 cos(_Float16 __x)
518 { return _Float16(__builtin_cosf(__x)); }
519
520 constexpr _Float16
521 cosh(_Float16 __x)
522 { return _Float16(__builtin_coshf(__x)); }
523
524 constexpr _Float16
525 exp(_Float16 __x)
526 { return _Float16(__builtin_expf(__x)); }
527
528 constexpr _Float16
529 fabs(_Float16 __x)
530 { return _Float16(__builtin_fabsf(__x)); }
531
532 constexpr _Float16
533 floor(_Float16 __x)
534 { return _Float16(__builtin_floorf(__x)); }
535
536 constexpr _Float16
537 fmod(_Float16 __x, _Float16 __y)
538 { return _Float16(__builtin_fmodf(__x, __y)); }
539
540 inline _Float16
541 frexp(_Float16 __x, int* __exp)
542 { return _Float16(__builtin_frexpf(__x, __exp)); }
543
544 constexpr _Float16
545 ldexp(_Float16 __x, int __exp)
546 { return _Float16(__builtin_ldexpf(__x, __exp)); }
547
548 constexpr _Float16
549 log(_Float16 __x)
550 { return _Float16(__builtin_logf(__x)); }
551
552 constexpr _Float16
553 log10(_Float16 __x)
554 { return _Float16(__builtin_log10f(__x)); }
555
556 inline _Float16
557 modf(_Float16 __x, _Float16* __iptr)
558 {
559 float __i, __ret = __builtin_modff(__x, &__i);
560 *__iptr = _Float16(__i);
561 return _Float16(__ret);
562 }
563
564 constexpr _Float16
565 pow(_Float16 __x, _Float16 __y)
566 { return _Float16(__builtin_powf(__x, __y)); }
567
568 constexpr _Float16
569 sin(_Float16 __x)
570 { return _Float16(__builtin_sinf(__x)); }
571
572 constexpr _Float16
573 sinh(_Float16 __x)
574 { return _Float16(__builtin_sinhf(__x)); }
575
576 constexpr _Float16
577 sqrt(_Float16 __x)
578 { return _Float16(__builtin_sqrtf(__x)); }
579
580 constexpr _Float16
581 tan(_Float16 __x)
582 { return _Float16(__builtin_tanf(__x)); }
583
584 constexpr _Float16
585 tanh(_Float16 __x)
586 { return _Float16(__builtin_tanhf(__x)); }
587#endif
588
589#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
590 constexpr _Float32
591 acos(_Float32 __x)
592 { return __builtin_acosf(__x); }
593
594 constexpr _Float32
595 asin(_Float32 __x)
596 { return __builtin_asinf(__x); }
597
598 constexpr _Float32
599 atan(_Float32 __x)
600 { return __builtin_atanf(__x); }
601
602 constexpr _Float32
603 atan2(_Float32 __y, _Float32 __x)
604 { return __builtin_atan2f(__y, __x); }
605
606 constexpr _Float32
607 ceil(_Float32 __x)
608 { return __builtin_ceilf(__x); }
609
610 constexpr _Float32
611 cos(_Float32 __x)
612 { return __builtin_cosf(__x); }
613
614 constexpr _Float32
615 cosh(_Float32 __x)
616 { return __builtin_coshf(__x); }
617
618 constexpr _Float32
619 exp(_Float32 __x)
620 { return __builtin_expf(__x); }
621
622 constexpr _Float32
623 fabs(_Float32 __x)
624 { return __builtin_fabsf(__x); }
625
626 constexpr _Float32
627 floor(_Float32 __x)
628 { return __builtin_floorf(__x); }
629
630 constexpr _Float32
631 fmod(_Float32 __x, _Float32 __y)
632 { return __builtin_fmodf(__x, __y); }
633
634 inline _Float32
635 frexp(_Float32 __x, int* __exp)
636 { return __builtin_frexpf(__x, __exp); }
637
638 constexpr _Float32
639 ldexp(_Float32 __x, int __exp)
640 { return __builtin_ldexpf(__x, __exp); }
641
642 constexpr _Float32
643 log(_Float32 __x)
644 { return __builtin_logf(__x); }
645
646 constexpr _Float32
647 log10(_Float32 __x)
648 { return __builtin_log10f(__x); }
649
650 inline _Float32
651 modf(_Float32 __x, _Float32* __iptr)
652 {
653 float __i, __ret = __builtin_modff(__x, &__i);
654 *__iptr = __i;
655 return __ret;
656 }
657
658 constexpr _Float32
659 pow(_Float32 __x, _Float32 __y)
660 { return __builtin_powf(__x, __y); }
661
662 constexpr _Float32
663 sin(_Float32 __x)
664 { return __builtin_sinf(__x); }
665
666 constexpr _Float32
667 sinh(_Float32 __x)
668 { return __builtin_sinhf(__x); }
669
670 constexpr _Float32
671 sqrt(_Float32 __x)
672 { return __builtin_sqrtf(__x); }
673
674 constexpr _Float32
675 tan(_Float32 __x)
676 { return __builtin_tanf(__x); }
677
678 constexpr _Float32
679 tanh(_Float32 __x)
680 { return __builtin_tanhf(__x); }
681#endif
682
683#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
684 constexpr _Float64
685 acos(_Float64 __x)
686 { return __builtin_acos(__x); }
687
688 constexpr _Float64
689 asin(_Float64 __x)
690 { return __builtin_asin(__x); }
691
692 constexpr _Float64
693 atan(_Float64 __x)
694 { return __builtin_atan(__x); }
695
696 constexpr _Float64
697 atan2(_Float64 __y, _Float64 __x)
698 { return __builtin_atan2(__y, __x); }
699
700 constexpr _Float64
701 ceil(_Float64 __x)
702 { return __builtin_ceil(__x); }
703
704 constexpr _Float64
705 cos(_Float64 __x)
706 { return __builtin_cos(__x); }
707
708 constexpr _Float64
709 cosh(_Float64 __x)
710 { return __builtin_cosh(__x); }
711
712 constexpr _Float64
713 exp(_Float64 __x)
714 { return __builtin_exp(__x); }
715
716 constexpr _Float64
717 fabs(_Float64 __x)
718 { return __builtin_fabs(__x); }
719
720 constexpr _Float64
721 floor(_Float64 __x)
722 { return __builtin_floor(__x); }
723
724 constexpr _Float64
725 fmod(_Float64 __x, _Float64 __y)
726 { return __builtin_fmod(__x, __y); }
727
728 inline _Float64
729 frexp(_Float64 __x, int* __exp)
730 { return __builtin_frexp(__x, __exp); }
731
732 constexpr _Float64
733 ldexp(_Float64 __x, int __exp)
734 { return __builtin_ldexp(__x, __exp); }
735
736 constexpr _Float64
737 log(_Float64 __x)
738 { return __builtin_log(__x); }
739
740 constexpr _Float64
741 log10(_Float64 __x)
742 { return __builtin_log10(__x); }
743
744 inline _Float64
745 modf(_Float64 __x, _Float64* __iptr)
746 {
747 double __i, __ret = __builtin_modf(__x, &__i);
748 *__iptr = __i;
749 return __ret;
750 }
751
752 constexpr _Float64
753 pow(_Float64 __x, _Float64 __y)
754 { return __builtin_pow(__x, __y); }
755
756 constexpr _Float64
757 sin(_Float64 __x)
758 { return __builtin_sin(__x); }
759
760 constexpr _Float64
761 sinh(_Float64 __x)
762 { return __builtin_sinh(__x); }
763
764 constexpr _Float64
765 sqrt(_Float64 __x)
766 { return __builtin_sqrt(__x); }
767
768 constexpr _Float64
769 tan(_Float64 __x)
770 { return __builtin_tan(__x); }
771
772 constexpr _Float64
773 tanh(_Float64 __x)
774 { return __builtin_tanh(__x); }
775#endif
776
777#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
778 constexpr _Float128
779 acos(_Float128 __x)
780 { return __builtin_acosl(__x); }
781
782 constexpr _Float128
783 asin(_Float128 __x)
784 { return __builtin_asinl(__x); }
785
786 constexpr _Float128
787 atan(_Float128 __x)
788 { return __builtin_atanl(__x); }
789
790 constexpr _Float128
791 atan2(_Float128 __y, _Float128 __x)
792 { return __builtin_atan2l(__y, __x); }
793
794 constexpr _Float128
795 ceil(_Float128 __x)
796 { return __builtin_ceill(__x); }
797
798 constexpr _Float128
799 cos(_Float128 __x)
800 { return __builtin_cosl(__x); }
801
802 constexpr _Float128
803 cosh(_Float128 __x)
804 { return __builtin_coshl(__x); }
805
806 constexpr _Float128
807 exp(_Float128 __x)
808 { return __builtin_expl(__x); }
809
810 constexpr _Float128
811 fabs(_Float128 __x)
812 { return __builtin_fabsl(__x); }
813
814 constexpr _Float128
815 floor(_Float128 __x)
816 { return __builtin_floorl(__x); }
817
818 constexpr _Float128
819 fmod(_Float128 __x, _Float128 __y)
820 { return __builtin_fmodl(__x, __y); }
821
822 inline _Float128
823 frexp(_Float128 __x, int* __exp)
824 { return __builtin_frexpl(__x, __exp); }
825
826 constexpr _Float128
827 ldexp(_Float128 __x, int __exp)
828 { return __builtin_ldexpl(__x, __exp); }
829
830 constexpr _Float128
831 log(_Float128 __x)
832 { return __builtin_logl(__x); }
833
834 constexpr _Float128
835 log10(_Float128 __x)
836 { return __builtin_log10l(__x); }
837
838 inline _Float128
839 modf(_Float128 __x, _Float128* __iptr)
840 {
841 long double __i, __ret = __builtin_modfl(__x, &__i);
842 *__iptr = __i;
843 return __ret;
844 }
845
846 constexpr _Float128
847 pow(_Float128 __x, _Float128 __y)
848 { return __builtin_powl(__x, __y); }
849
850 constexpr _Float128
851 sin(_Float128 __x)
852 { return __builtin_sinl(__x); }
853
854 constexpr _Float128
855 sinh(_Float128 __x)
856 { return __builtin_sinhl(__x); }
857
858 constexpr _Float128
859 sqrt(_Float128 __x)
860 { return __builtin_sqrtl(__x); }
861
862 constexpr _Float128
863 tan(_Float128 __x)
864 { return __builtin_tanl(__x); }
865
866 constexpr _Float128
867 tanh(_Float128 __x)
868 { return __builtin_tanhl(__x); }
869#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
870 constexpr _Float128
871 acos(_Float128 __x)
872 { return __builtin_acosf128(__x); }
873
874 constexpr _Float128
875 asin(_Float128 __x)
876 { return __builtin_asinf128(__x); }
877
878 constexpr _Float128
879 atan(_Float128 __x)
880 { return __builtin_atanf128(__x); }
881
882 constexpr _Float128
883 atan2(_Float128 __y, _Float128 __x)
884 { return __builtin_atan2f128(__y, __x); }
885
886 constexpr _Float128
887 ceil(_Float128 __x)
888 { return __builtin_ceilf128(__x); }
889
890 constexpr _Float128
891 cos(_Float128 __x)
892 { return __builtin_cosf128(__x); }
893
894 constexpr _Float128
895 cosh(_Float128 __x)
896 { return __builtin_coshf128(__x); }
897
898 constexpr _Float128
899 exp(_Float128 __x)
900 { return __builtin_expf128(__x); }
901
902 constexpr _Float128
903 fabs(_Float128 __x)
904 { return __builtin_fabsf128(__x); }
905
906 constexpr _Float128
907 floor(_Float128 __x)
908 { return __builtin_floorf128(__x); }
909
910 constexpr _Float128
911 fmod(_Float128 __x, _Float128 __y)
912 { return __builtin_fmodf128(__x, __y); }
913
914 inline _Float128
915 frexp(_Float128 __x, int* __exp)
916 { return __builtin_frexpf128(__x, __exp); }
917
918 constexpr _Float128
919 ldexp(_Float128 __x, int __exp)
920 { return __builtin_ldexpf128(__x, __exp); }
921
922 constexpr _Float128
923 log(_Float128 __x)
924 { return __builtin_logf128(__x); }
925
926 constexpr _Float128
927 log10(_Float128 __x)
928 { return __builtin_log10f128(__x); }
929
930 inline _Float128
931 modf(_Float128 __x, _Float128* __iptr)
932 { return __builtin_modff128(__x, __iptr); }
933
934 constexpr _Float128
935 pow(_Float128 __x, _Float128 __y)
936 { return __builtin_powf128(__x, __y); }
937
938 constexpr _Float128
939 sin(_Float128 __x)
940 { return __builtin_sinf128(__x); }
941
942 constexpr _Float128
943 sinh(_Float128 __x)
944 { return __builtin_sinhf128(__x); }
945
946 constexpr _Float128
947 sqrt(_Float128 __x)
948 { return __builtin_sqrtf128(__x); }
949
950 constexpr _Float128
951 tan(_Float128 __x)
952 { return __builtin_tanf128(__x); }
953
954 constexpr _Float128
955 tanh(_Float128 __x)
956 { return __builtin_tanhf128(__x); }
957#endif
958
959#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
960 constexpr __gnu_cxx::__bfloat16_t
961 acos(__gnu_cxx::__bfloat16_t __x)
962 { return __gnu_cxx::__bfloat16_t(__builtin_acosf(__x)); }
963
964 constexpr __gnu_cxx::__bfloat16_t
965 asin(__gnu_cxx::__bfloat16_t __x)
966 { return __gnu_cxx::__bfloat16_t(__builtin_asinf(__x)); }
967
968 constexpr __gnu_cxx::__bfloat16_t
969 atan(__gnu_cxx::__bfloat16_t __x)
970 { return __gnu_cxx::__bfloat16_t(__builtin_atanf(__x)); }
971
972 constexpr __gnu_cxx::__bfloat16_t
973 atan2(__gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __x)
974 { return __gnu_cxx::__bfloat16_t(__builtin_atan2f(__y, __x)); }
975
976 constexpr __gnu_cxx::__bfloat16_t
977 ceil(__gnu_cxx::__bfloat16_t __x)
978 { return __gnu_cxx::__bfloat16_t(__builtin_ceilf(__x)); }
979
980 constexpr __gnu_cxx::__bfloat16_t
981 cos(__gnu_cxx::__bfloat16_t __x)
982 { return __gnu_cxx::__bfloat16_t(__builtin_cosf(__x)); }
983
984 constexpr __gnu_cxx::__bfloat16_t
985 cosh(__gnu_cxx::__bfloat16_t __x)
986 { return __gnu_cxx::__bfloat16_t(__builtin_coshf(__x)); }
987
988 constexpr __gnu_cxx::__bfloat16_t
989 exp(__gnu_cxx::__bfloat16_t __x)
990 { return __gnu_cxx::__bfloat16_t(__builtin_expf(__x)); }
991
992 constexpr __gnu_cxx::__bfloat16_t
993 fabs(__gnu_cxx::__bfloat16_t __x)
994 { return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); }
995
996 constexpr __gnu_cxx::__bfloat16_t
997 floor(__gnu_cxx::__bfloat16_t __x)
998 { return __gnu_cxx::__bfloat16_t(__builtin_floorf(__x)); }
999
1000 constexpr __gnu_cxx::__bfloat16_t
1001 fmod(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1002 { return __gnu_cxx::__bfloat16_t(__builtin_fmodf(__x, __y)); }
1003
1004 inline __gnu_cxx::__bfloat16_t
1005 frexp(__gnu_cxx::__bfloat16_t __x, int* __exp)
1006 { return __gnu_cxx::__bfloat16_t(__builtin_frexpf(__x, __exp)); }
1007
1008 constexpr __gnu_cxx::__bfloat16_t
1009 ldexp(__gnu_cxx::__bfloat16_t __x, int __exp)
1010 { return __gnu_cxx::__bfloat16_t(__builtin_ldexpf(__x, __exp)); }
1011
1012 constexpr __gnu_cxx::__bfloat16_t
1013 log(__gnu_cxx::__bfloat16_t __x)
1014 { return __gnu_cxx::__bfloat16_t(__builtin_logf(__x)); }
1015
1016 constexpr __gnu_cxx::__bfloat16_t
1017 log10(__gnu_cxx::__bfloat16_t __x)
1018 { return __gnu_cxx::__bfloat16_t(__builtin_log10f(__x)); }
1019
1020 inline __gnu_cxx::__bfloat16_t
1021 modf(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t* __iptr)
1022 {
1023 float __i, __ret = __builtin_modff(__x, &__i);
1024 *__iptr = __gnu_cxx::__bfloat16_t(__i);
1025 return __gnu_cxx::__bfloat16_t(__ret);
1026 }
1027
1028 constexpr __gnu_cxx::__bfloat16_t
1029 pow(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1030 { return __gnu_cxx::__bfloat16_t(__builtin_powf(__x, __y)); }
1031
1032 constexpr __gnu_cxx::__bfloat16_t
1033 sin(__gnu_cxx::__bfloat16_t __x)
1034 { return __gnu_cxx::__bfloat16_t(__builtin_sinf(__x)); }
1035
1036 constexpr __gnu_cxx::__bfloat16_t
1037 sinh(__gnu_cxx::__bfloat16_t __x)
1038 { return __gnu_cxx::__bfloat16_t(__builtin_sinhf(__x)); }
1039
1040 constexpr __gnu_cxx::__bfloat16_t
1041 sqrt(__gnu_cxx::__bfloat16_t __x)
1042 { return __gnu_cxx::__bfloat16_t(__builtin_sqrtf(__x)); }
1043
1044 constexpr __gnu_cxx::__bfloat16_t
1045 tan(__gnu_cxx::__bfloat16_t __x)
1046 { return __gnu_cxx::__bfloat16_t(__builtin_tanf(__x)); }
1047
1048 constexpr __gnu_cxx::__bfloat16_t
1049 tanh(__gnu_cxx::__bfloat16_t __x)
1050 { return __gnu_cxx::__bfloat16_t(__builtin_tanhf(__x)); }
1051#endif
1052
1053 template<typename _Tp, typename _Up>
1054 inline _GLIBCXX_CONSTEXPR
1055 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1056 atan2(_Tp __y, _Up __x)
1057 {
1058 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1059 return atan2(__type(__y), __type(__x));
1060 }
1061
1062 template<typename _Tp, typename _Up>
1063 inline _GLIBCXX_CONSTEXPR
1064 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1065 fmod(_Tp __x, _Up __y)
1066 {
1067 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1068 return fmod(__type(__x), __type(__y));
1069 }
1070
1071 template<typename _Tp, typename _Up>
1072 inline _GLIBCXX_CONSTEXPR
1073 typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
1074 pow(_Tp __x, _Up __y)
1075 {
1076 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1077 return pow(__type(__x), __type(__y));
1078 }
1079
1080#if _GLIBCXX_USE_C99_MATH
1081#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
1082
1083// These are possible macros imported from C99-land.
1084#undef fpclassify
1085#undef isfinite
1086#undef isinf
1087#undef isnan
1088#undef isnormal
1089#undef signbit
1090#undef isgreater
1091#undef isgreaterequal
1092#undef isless
1093#undef islessequal
1094#undef islessgreater
1095#undef isunordered
1096
1097#if __cplusplus >= 201103L
1098
1099#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1100 constexpr int
1101 fpclassify(float __x)
1102 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1103 FP_SUBNORMAL, FP_ZERO, __x); }
1104
1105 constexpr int
1106 fpclassify(double __x)
1107 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1108 FP_SUBNORMAL, FP_ZERO, __x); }
1109
1110 constexpr int
1111 fpclassify(long double __x)
1112 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1113 FP_SUBNORMAL, FP_ZERO, __x); }
1114#endif
1115
1116#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1117 template<typename _Tp>
1118 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1119 int>::__type
1120 fpclassify(_Tp __x)
1121 { return __x != 0 ? FP_NORMAL : FP_ZERO; }
1122#endif
1123
1124#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1125 constexpr bool
1126 isfinite(float __x)
1127 { return __builtin_isfinite(__x); }
1128
1129 constexpr bool
1130 isfinite(double __x)
1131 { return __builtin_isfinite(__x); }
1132
1133 constexpr bool
1134 isfinite(long double __x)
1135 { return __builtin_isfinite(__x); }
1136#endif
1137
1138#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1139 template<typename _Tp>
1140 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1141 bool>::__type
1142 isfinite(_Tp)
1143 { return true; }
1144#endif
1145
1146#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1147 constexpr bool
1148 isinf(float __x)
1149 { return __builtin_isinf(__x); }
1150
1151#if _GLIBCXX_HAVE_OBSOLETE_ISINF \
1152 && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC
1153 using ::isinf;
1154#else
1155 constexpr bool
1156 isinf(double __x)
1157 { return __builtin_isinf(__x); }
1158#endif
1159
1160 constexpr bool
1161 isinf(long double __x)
1162 { return __builtin_isinf(__x); }
1163#endif
1164
1165#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1166 template<typename _Tp>
1167 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1168 bool>::__type
1169 isinf(_Tp)
1170 { return false; }
1171#endif
1172
1173#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1174 constexpr bool
1175 isnan(float __x)
1176 { return __builtin_isnan(__x); }
1177
1178#if _GLIBCXX_HAVE_OBSOLETE_ISNAN \
1179 && !_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC
1180 using ::isnan;
1181#else
1182 constexpr bool
1183 isnan(double __x)
1184 { return __builtin_isnan(__x); }
1185#endif
1186
1187 constexpr bool
1188 isnan(long double __x)
1189 { return __builtin_isnan(__x); }
1190#endif
1191
1192#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1193 template<typename _Tp>
1194 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1195 bool>::__type
1196 isnan(_Tp)
1197 { return false; }
1198#endif
1199
1200#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1201 constexpr bool
1202 isnormal(float __x)
1203 { return __builtin_isnormal(__x); }
1204
1205 constexpr bool
1206 isnormal(double __x)
1207 { return __builtin_isnormal(__x); }
1208
1209 constexpr bool
1210 isnormal(long double __x)
1211 { return __builtin_isnormal(__x); }
1212#endif
1213
1214#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1215 template<typename _Tp>
1216 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1217 bool>::__type
1218 isnormal(_Tp __x)
1219 { return __x != 0 ? true : false; }
1220#endif
1221
1222#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1223 // Note: middle-end/36757 is fixed, __builtin_signbit is type-generic.
1224 constexpr bool
1225 signbit(float __x)
1226 { return __builtin_signbit(__x); }
1227
1228 constexpr bool
1229 signbit(double __x)
1230 { return __builtin_signbit(__x); }
1231
1232 constexpr bool
1233 signbit(long double __x)
1234 { return __builtin_signbit(__x); }
1235#endif
1236
1237#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1238 template<typename _Tp>
1239 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
1240 bool>::__type
1241 signbit(_Tp __x)
1242 { return __x < 0 ? true : false; }
1243#endif
1244
1245#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1246 constexpr bool
1247 isgreater(float __x, float __y)
1248 { return __builtin_isgreater(__x, __y); }
1249
1250 constexpr bool
1251 isgreater(double __x, double __y)
1252 { return __builtin_isgreater(__x, __y); }
1253
1254 constexpr bool
1255 isgreater(long double __x, long double __y)
1256 { return __builtin_isgreater(__x, __y); }
1257#endif
1258
1259#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1260 template<typename _Tp, typename _Up>
1261 constexpr typename
1262 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
1263 && __is_arithmetic<_Up>::__value), bool>::__type
1264 isgreater(_Tp __x, _Up __y)
1265 {
1266 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1267 return __builtin_isgreater(__type(__x), __type(__y));
1268 }
1269#endif
1270
1271#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1272 constexpr bool
1273 isgreaterequal(float __x, float __y)
1274 { return __builtin_isgreaterequal(__x, __y); }
1275
1276 constexpr bool
1277 isgreaterequal(double __x, double __y)
1278 { return __builtin_isgreaterequal(__x, __y); }
1279
1280 constexpr bool
1281 isgreaterequal(long double __x, long double __y)
1282 { return __builtin_isgreaterequal(__x, __y); }
1283#endif
1284
1285#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1286 template<typename _Tp, typename _Up>
1287 constexpr typename
1288 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
1289 && __is_arithmetic<_Up>::__value), bool>::__type
1290 isgreaterequal(_Tp __x, _Up __y)
1291 {
1292 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1293 return __builtin_isgreaterequal(__type(__x), __type(__y));
1294 }
1295#endif
1296
1297#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1298 constexpr bool
1299 isless(float __x, float __y)
1300 { return __builtin_isless(__x, __y); }
1301
1302 constexpr bool
1303 isless(double __x, double __y)
1304 { return __builtin_isless(__x, __y); }
1305
1306 constexpr bool
1307 isless(long double __x, long double __y)
1308 { return __builtin_isless(__x, __y); }
1309#endif
1310
1311#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1312 template<typename _Tp, typename _Up>
1313 constexpr typename
1314 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
1315 && __is_arithmetic<_Up>::__value), bool>::__type
1316 isless(_Tp __x, _Up __y)
1317 {
1318 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1319 return __builtin_isless(__type(__x), __type(__y));
1320 }
1321#endif
1322
1323#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1324 constexpr bool
1325 islessequal(float __x, float __y)
1326 { return __builtin_islessequal(__x, __y); }
1327
1328 constexpr bool
1329 islessequal(double __x, double __y)
1330 { return __builtin_islessequal(__x, __y); }
1331
1332 constexpr bool
1333 islessequal(long double __x, long double __y)
1334 { return __builtin_islessequal(__x, __y); }
1335#endif
1336
1337#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1338 template<typename _Tp, typename _Up>
1339 constexpr typename
1340 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
1341 && __is_arithmetic<_Up>::__value), bool>::__type
1342 islessequal(_Tp __x, _Up __y)
1343 {
1344 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1345 return __builtin_islessequal(__type(__x), __type(__y));
1346 }
1347#endif
1348
1349#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1350 constexpr bool
1351 islessgreater(float __x, float __y)
1352 { return __builtin_islessgreater(__x, __y); }
1353
1354 constexpr bool
1355 islessgreater(double __x, double __y)
1356 { return __builtin_islessgreater(__x, __y); }
1357
1358 constexpr bool
1359 islessgreater(long double __x, long double __y)
1360 { return __builtin_islessgreater(__x, __y); }
1361#endif
1362
1363#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1364 template<typename _Tp, typename _Up>
1365 constexpr typename
1366 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
1367 && __is_arithmetic<_Up>::__value), bool>::__type
1368 islessgreater(_Tp __x, _Up __y)
1369 {
1370 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1371 return __builtin_islessgreater(__type(__x), __type(__y));
1372 }
1373#endif
1374
1375#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
1376 constexpr bool
1377 isunordered(float __x, float __y)
1378 { return __builtin_isunordered(__x, __y); }
1379
1380 constexpr bool
1381 isunordered(double __x, double __y)
1382 { return __builtin_isunordered(__x, __y); }
1383
1384 constexpr bool
1385 isunordered(long double __x, long double __y)
1386 { return __builtin_isunordered(__x, __y); }
1387#endif
1388
1389#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
1390 template<typename _Tp, typename _Up>
1391 constexpr typename
1392 __gnu_cxx::__enable_if<(__is_arithmetic<_Tp>::__value
1393 && __is_arithmetic<_Up>::__value), bool>::__type
1394 isunordered(_Tp __x, _Up __y)
1395 {
1396 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
1397 return __builtin_isunordered(__type(__x), __type(__y));
1398 }
1399#endif
1400
1401#else
1402
1403 template<typename _Tp>
1404 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1405 int>::__type
1406 fpclassify(_Tp __f)
1407 {
1408 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1409 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1410 FP_SUBNORMAL, FP_ZERO, __type(__f));
1411 }
1412
1413 template<typename _Tp>
1414 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1415 int>::__type
1416 isfinite(_Tp __f)
1417 {
1418 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1419 return __builtin_isfinite(__type(__f));
1420 }
1421
1422 template<typename _Tp>
1423 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1424 int>::__type
1425 isinf(_Tp __f)
1426 {
1427 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1428 return __builtin_isinf(__type(__f));
1429 }
1430
1431 template<typename _Tp>
1432 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1433 int>::__type
1434 isnan(_Tp __f)
1435 {
1436 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1437 return __builtin_isnan(__type(__f));
1438 }
1439
1440 template<typename _Tp>
1441 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1442 int>::__type
1443 isnormal(_Tp __f)
1444 {
1445 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1446 return __builtin_isnormal(__type(__f));
1447 }
1448
1449 template<typename _Tp>
1450 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1451 int>::__type
1452 signbit(_Tp __f)
1453 {
1454 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1455 return __builtin_signbit(__type(__f));
1456 }
1457
1458 template<typename _Tp>
1459 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1460 int>::__type
1461 isgreater(_Tp __f1, _Tp __f2)
1462 {
1463 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1464 return __builtin_isgreater(__type(__f1), __type(__f2));
1465 }
1466
1467 template<typename _Tp>
1468 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1469 int>::__type
1470 isgreaterequal(_Tp __f1, _Tp __f2)
1471 {
1472 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1473 return __builtin_isgreaterequal(__type(__f1), __type(__f2));
1474 }
1475
1476 template<typename _Tp>
1477 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1478 int>::__type
1479 isless(_Tp __f1, _Tp __f2)
1480 {
1481 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1482 return __builtin_isless(__type(__f1), __type(__f2));
1483 }
1484
1485 template<typename _Tp>
1486 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1487 int>::__type
1488 islessequal(_Tp __f1, _Tp __f2)
1489 {
1490 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1491 return __builtin_islessequal(__type(__f1), __type(__f2));
1492 }
1493
1494 template<typename _Tp>
1495 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1496 int>::__type
1497 islessgreater(_Tp __f1, _Tp __f2)
1498 {
1499 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1500 return __builtin_islessgreater(__type(__f1), __type(__f2));
1501 }
1502
1503 template<typename _Tp>
1504 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
1505 int>::__type
1506 isunordered(_Tp __f1, _Tp __f2)
1507 {
1508 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
1509 return __builtin_isunordered(__type(__f1), __type(__f2));
1510 }
1511
1512#endif // C++11
1513
1514#ifdef __STDCPP_FLOAT16_T__
1515 constexpr int
1516 fpclassify(_Float16 __x)
1517 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1518 FP_SUBNORMAL, FP_ZERO, __x); }
1519
1520 constexpr bool
1521 isfinite(_Float16 __x)
1522 { return __builtin_isfinite(__x); }
1523
1524 constexpr bool
1525 isinf(_Float16 __x)
1526 { return __builtin_isinf(__x); }
1527
1528 constexpr bool
1529 isnan(_Float16 __x)
1530 { return __builtin_isnan(__x); }
1531
1532 constexpr bool
1533 isnormal(_Float16 __x)
1534 { return __builtin_isnormal(__x); }
1535
1536 constexpr bool
1537 signbit(_Float16 __x)
1538 { return __builtin_signbit(__x); }
1539
1540 constexpr bool
1541 isgreater(_Float16 __x, _Float16 __y)
1542 { return __builtin_isgreater(__x, __y); }
1543
1544 constexpr bool
1545 isgreaterequal(_Float16 __x, _Float16 __y)
1546 { return __builtin_isgreaterequal(__x, __y); }
1547
1548 constexpr bool
1549 isless(_Float16 __x, _Float16 __y)
1550 { return __builtin_isless(__x, __y); }
1551
1552 constexpr bool
1553 islessequal(_Float16 __x, _Float16 __y)
1554 { return __builtin_islessequal(__x, __y); }
1555
1556 constexpr bool
1557 islessgreater(_Float16 __x, _Float16 __y)
1558 { return __builtin_islessgreater(__x, __y); }
1559
1560 constexpr bool
1561 isunordered(_Float16 __x, _Float16 __y)
1562 { return __builtin_isunordered(__x, __y); }
1563#endif
1564
1565#ifdef __STDCPP_FLOAT32_T__
1566 constexpr int
1567 fpclassify(_Float32 __x)
1568 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1569 FP_SUBNORMAL, FP_ZERO, __x); }
1570
1571 constexpr bool
1572 isfinite(_Float32 __x)
1573 { return __builtin_isfinite(__x); }
1574
1575 constexpr bool
1576 isinf(_Float32 __x)
1577 { return __builtin_isinf(__x); }
1578
1579 constexpr bool
1580 isnan(_Float32 __x)
1581 { return __builtin_isnan(__x); }
1582
1583 constexpr bool
1584 isnormal(_Float32 __x)
1585 { return __builtin_isnormal(__x); }
1586
1587 constexpr bool
1588 signbit(_Float32 __x)
1589 { return __builtin_signbit(__x); }
1590
1591 constexpr bool
1592 isgreater(_Float32 __x, _Float32 __y)
1593 { return __builtin_isgreater(__x, __y); }
1594
1595 constexpr bool
1596 isgreaterequal(_Float32 __x, _Float32 __y)
1597 { return __builtin_isgreaterequal(__x, __y); }
1598
1599 constexpr bool
1600 isless(_Float32 __x, _Float32 __y)
1601 { return __builtin_isless(__x, __y); }
1602
1603 constexpr bool
1604 islessequal(_Float32 __x, _Float32 __y)
1605 { return __builtin_islessequal(__x, __y); }
1606
1607 constexpr bool
1608 islessgreater(_Float32 __x, _Float32 __y)
1609 { return __builtin_islessgreater(__x, __y); }
1610
1611 constexpr bool
1612 isunordered(_Float32 __x, _Float32 __y)
1613 { return __builtin_isunordered(__x, __y); }
1614#endif
1615
1616#ifdef __STDCPP_FLOAT64_T__
1617 constexpr int
1618 fpclassify(_Float64 __x)
1619 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1620 FP_SUBNORMAL, FP_ZERO, __x); }
1621
1622 constexpr bool
1623 isfinite(_Float64 __x)
1624 { return __builtin_isfinite(__x); }
1625
1626 constexpr bool
1627 isinf(_Float64 __x)
1628 { return __builtin_isinf(__x); }
1629
1630 constexpr bool
1631 isnan(_Float64 __x)
1632 { return __builtin_isnan(__x); }
1633
1634 constexpr bool
1635 isnormal(_Float64 __x)
1636 { return __builtin_isnormal(__x); }
1637
1638 constexpr bool
1639 signbit(_Float64 __x)
1640 { return __builtin_signbit(__x); }
1641
1642 constexpr bool
1643 isgreater(_Float64 __x, _Float64 __y)
1644 { return __builtin_isgreater(__x, __y); }
1645
1646 constexpr bool
1647 isgreaterequal(_Float64 __x, _Float64 __y)
1648 { return __builtin_isgreaterequal(__x, __y); }
1649
1650 constexpr bool
1651 isless(_Float64 __x, _Float64 __y)
1652 { return __builtin_isless(__x, __y); }
1653
1654 constexpr bool
1655 islessequal(_Float64 __x, _Float64 __y)
1656 { return __builtin_islessequal(__x, __y); }
1657
1658 constexpr bool
1659 islessgreater(_Float64 __x, _Float64 __y)
1660 { return __builtin_islessgreater(__x, __y); }
1661
1662 constexpr bool
1663 isunordered(_Float64 __x, _Float64 __y)
1664 { return __builtin_isunordered(__x, __y); }
1665#endif
1666
1667#ifdef __STDCPP_FLOAT128_T__
1668 constexpr int
1669 fpclassify(_Float128 __x)
1670 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1671 FP_SUBNORMAL, FP_ZERO, __x); }
1672
1673 constexpr bool
1674 isfinite(_Float128 __x)
1675 { return __builtin_isfinite(__x); }
1676
1677 constexpr bool
1678 isinf(_Float128 __x)
1679 { return __builtin_isinf(__x); }
1680
1681 constexpr bool
1682 isnan(_Float128 __x)
1683 { return __builtin_isnan(__x); }
1684
1685 constexpr bool
1686 isnormal(_Float128 __x)
1687 { return __builtin_isnormal(__x); }
1688
1689 constexpr bool
1690 signbit(_Float128 __x)
1691 { return __builtin_signbit(__x); }
1692
1693 constexpr bool
1694 isgreater(_Float128 __x, _Float128 __y)
1695 { return __builtin_isgreater(__x, __y); }
1696
1697 constexpr bool
1698 isgreaterequal(_Float128 __x, _Float128 __y)
1699 { return __builtin_isgreaterequal(__x, __y); }
1700
1701 constexpr bool
1702 isless(_Float128 __x, _Float128 __y)
1703 { return __builtin_isless(__x, __y); }
1704
1705 constexpr bool
1706 islessequal(_Float128 __x, _Float128 __y)
1707 { return __builtin_islessequal(__x, __y); }
1708
1709 constexpr bool
1710 islessgreater(_Float128 __x, _Float128 __y)
1711 { return __builtin_islessgreater(__x, __y); }
1712
1713 constexpr bool
1714 isunordered(_Float128 __x, _Float128 __y)
1715 { return __builtin_isunordered(__x, __y); }
1716#endif
1717
1718#ifdef __STDCPP_BFLOAT16_T__
1719 constexpr int
1720 fpclassify(__gnu_cxx::__bfloat16_t __x)
1721 { return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
1722 FP_SUBNORMAL, FP_ZERO, __x); }
1723
1724 constexpr bool
1725 isfinite(__gnu_cxx::__bfloat16_t __x)
1726 { return __builtin_isfinite(__x); }
1727
1728 constexpr bool
1729 isinf(__gnu_cxx::__bfloat16_t __x)
1730 { return __builtin_isinf(__x); }
1731
1732 constexpr bool
1733 isnan(__gnu_cxx::__bfloat16_t __x)
1734 { return __builtin_isnan(__x); }
1735
1736 constexpr bool
1737 isnormal(__gnu_cxx::__bfloat16_t __x)
1738 { return __builtin_isnormal(__x); }
1739
1740 constexpr bool
1741 signbit(__gnu_cxx::__bfloat16_t __x)
1742 { return __builtin_signbit(__x); }
1743
1744 constexpr bool
1745 isgreater(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1746 { return __builtin_isgreater(__x, __y); }
1747
1748 constexpr bool
1749 isgreaterequal(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1750 { return __builtin_isgreaterequal(__x, __y); }
1751
1752 constexpr bool
1753 isless(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1754 { return __builtin_isless(__x, __y); }
1755
1756 constexpr bool
1757 islessequal(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1758 { return __builtin_islessequal(__x, __y); }
1759
1760 constexpr bool
1761 islessgreater(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1762 { return __builtin_islessgreater(__x, __y); }
1763
1764 constexpr bool
1765 isunordered(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
1766 { return __builtin_isunordered(__x, __y); }
1767#endif
1768
1769#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
1770#endif /* _GLIBCXX_USE_C99_MATH */
1771
1772#if __cplusplus >= 201103L
1773
1774#undef acosf
1775#undef acosl
1776#undef asinf
1777#undef asinl
1778#undef atanf
1779#undef atanl
1780#undef atan2f
1781#undef atan2l
1782#undef ceilf
1783#undef ceill
1784#undef cosf
1785#undef cosl
1786#undef coshf
1787#undef coshl
1788#undef expf
1789#undef expl
1790#undef fabsf
1791#undef fabsl
1792#undef floorf
1793#undef floorl
1794#undef fmodf
1795#undef fmodl
1796#undef frexpf
1797#undef frexpl
1798#undef ldexpf
1799#undef ldexpl
1800#undef logf
1801#undef logl
1802#undef log10f
1803#undef log10l
1804#undef modff
1805#undef modfl
1806#undef powf
1807#undef powl
1808#undef sinf
1809#undef sinl
1810#undef sinhf
1811#undef sinhl
1812#undef sqrtf
1813#undef sqrtl
1814#undef tanf
1815#undef tanl
1816#undef tanhf
1817#undef tanhl
1818
1819#ifdef _GLIBCXX_HAVE_ACOSF
1820 using ::acosf;
1821#endif
1822#ifdef _GLIBCXX_HAVE_ACOSL
1823 using ::acosl;
1824#endif
1825
1826#ifdef _GLIBCXX_HAVE_ASINF
1827 using ::asinf;
1828#endif
1829#ifdef _GLIBCXX_HAVE_ASINL
1830 using ::asinl;
1831#endif
1832
1833#ifdef _GLIBCXX_HAVE_ATANF
1834 using ::atanf;
1835#endif
1836#ifdef _GLIBCXX_HAVE_ATANL
1837 using ::atanl;
1838#endif
1839
1840#ifdef _GLIBCXX_HAVE_ATAN2F
1841 using ::atan2f;
1842#endif
1843#ifdef _GLIBCXX_HAVE_ATAN2L
1844 using ::atan2l;
1845#endif
1846
1847#ifdef _GLIBCXX_HAVE_CEILF
1848 using ::ceilf;
1849#endif
1850#ifdef _GLIBCXX_HAVE_CEILL
1851 using ::ceill;
1852#endif
1853
1854#ifdef _GLIBCXX_HAVE_COSF
1855 using ::cosf;
1856#endif
1857#ifdef _GLIBCXX_HAVE_COSL
1858 using ::cosl;
1859#endif
1860
1861#ifdef _GLIBCXX_HAVE_COSHF
1862 using ::coshf;
1863#endif
1864#ifdef _GLIBCXX_HAVE_COSHL
1865 using ::coshl;
1866#endif
1867
1868#ifdef _GLIBCXX_HAVE_EXPF
1869 using ::expf;
1870#endif
1871#ifdef _GLIBCXX_HAVE_EXPL
1872 using ::expl;
1873#endif
1874
1875#ifdef _GLIBCXX_HAVE_FABSF
1876 using ::fabsf;
1877#endif
1878#ifdef _GLIBCXX_HAVE_FABSL
1879 using ::fabsl;
1880#endif
1881
1882#ifdef _GLIBCXX_HAVE_FLOORF
1883 using ::floorf;
1884#endif
1885#ifdef _GLIBCXX_HAVE_FLOORL
1886 using ::floorl;
1887#endif
1888
1889#ifdef _GLIBCXX_HAVE_FMODF
1890 using ::fmodf;
1891#endif
1892#ifdef _GLIBCXX_HAVE_FMODL
1893 using ::fmodl;
1894#endif
1895
1896#ifdef _GLIBCXX_HAVE_FREXPF
1897 using ::frexpf;
1898#endif
1899#ifdef _GLIBCXX_HAVE_FREXPL
1900 using ::frexpl;
1901#endif
1902
1903#ifdef _GLIBCXX_HAVE_LDEXPF
1904 using ::ldexpf;
1905#endif
1906#ifdef _GLIBCXX_HAVE_LDEXPL
1907 using ::ldexpl;
1908#endif
1909
1910#ifdef _GLIBCXX_HAVE_LOGF
1911 using ::logf;
1912#endif
1913#ifdef _GLIBCXX_HAVE_LOGL
1914 using ::logl;
1915#endif
1916
1917#ifdef _GLIBCXX_HAVE_LOG10F
1918 using ::log10f;
1919#endif
1920#ifdef _GLIBCXX_HAVE_LOG10L
1921 using ::log10l;
1922#endif
1923
1924#ifdef _GLIBCXX_HAVE_MODFF
1925 using ::modff;
1926#endif
1927#ifdef _GLIBCXX_HAVE_MODFL
1928 using ::modfl;
1929#endif
1930
1931#ifdef _GLIBCXX_HAVE_POWF
1932 using ::powf;
1933#endif
1934#ifdef _GLIBCXX_HAVE_POWL
1935 using ::powl;
1936#endif
1937
1938#ifdef _GLIBCXX_HAVE_SINF
1939 using ::sinf;
1940#endif
1941#ifdef _GLIBCXX_HAVE_SINL
1942 using ::sinl;
1943#endif
1944
1945#ifdef _GLIBCXX_HAVE_SINHF
1946 using ::sinhf;
1947#endif
1948#ifdef _GLIBCXX_HAVE_SINHL
1949 using ::sinhl;
1950#endif
1951
1952#ifdef _GLIBCXX_HAVE_SQRTF
1953 using ::sqrtf;
1954#endif
1955#ifdef _GLIBCXX_HAVE_SQRTL
1956 using ::sqrtl;
1957#endif
1958
1959#ifdef _GLIBCXX_HAVE_TANF
1960 using ::tanf;
1961#endif
1962#ifdef _GLIBCXX_HAVE_TANL
1963 using ::tanl;
1964#endif
1965
1966#ifdef _GLIBCXX_HAVE_TANHF
1967 using ::tanhf;
1968#endif
1969#ifdef _GLIBCXX_HAVE_TANHL
1970 using ::tanhl;
1971#endif
1972
1973#ifdef _GLIBCXX_USE_C99_MATH_FUNCS
1974
1975#undef acosh
1976#undef acoshf
1977#undef acoshl
1978#undef asinh
1979#undef asinhf
1980#undef asinhl
1981#undef atanh
1982#undef atanhf
1983#undef atanhl
1984#undef cbrt
1985#undef cbrtf
1986#undef cbrtl
1987#undef copysign
1988#undef copysignf
1989#undef copysignl
1990#undef erf
1991#undef erff
1992#undef erfl
1993#undef erfc
1994#undef erfcf
1995#undef erfcl
1996#undef exp2
1997#undef exp2f
1998#undef exp2l
1999#undef expm1
2000#undef expm1f
2001#undef expm1l
2002#undef fdim
2003#undef fdimf
2004#undef fdiml
2005#undef fma
2006#undef fmaf
2007#undef fmal
2008#undef fmax
2009#undef fmaxf
2010#undef fmaxl
2011#undef fmin
2012#undef fminf
2013#undef fminl
2014#undef hypot
2015#undef hypotf
2016#undef hypotl
2017#undef ilogb
2018#undef ilogbf
2019#undef ilogbl
2020#undef lgamma
2021#undef lgammaf
2022#undef lgammal
2023#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS
2024#undef llrint
2025#undef llrintf
2026#undef llrintl
2027#undef llround
2028#undef llroundf
2029#undef llroundl
2030#endif
2031#undef log1p
2032#undef log1pf
2033#undef log1pl
2034#undef log2
2035#undef log2f
2036#undef log2l
2037#undef logb
2038#undef logbf
2039#undef logbl
2040#undef lrint
2041#undef lrintf
2042#undef lrintl
2043#undef lround
2044#undef lroundf
2045#undef lroundl
2046#undef nan
2047#undef nanf
2048#undef nanl
2049#undef nearbyint
2050#undef nearbyintf
2051#undef nearbyintl
2052#undef nextafter
2053#undef nextafterf
2054#undef nextafterl
2055#undef nexttoward
2056#undef nexttowardf
2057#undef nexttowardl
2058#undef remainder
2059#undef remainderf
2060#undef remainderl
2061#undef remquo
2062#undef remquof
2063#undef remquol
2064#undef rint
2065#undef rintf
2066#undef rintl
2067#undef round
2068#undef roundf
2069#undef roundl
2070#undef scalbln
2071#undef scalblnf
2072#undef scalblnl
2073#undef scalbn
2074#undef scalbnf
2075#undef scalbnl
2076#undef tgamma
2077#undef tgammaf
2078#undef tgammal
2079#undef trunc
2080#undef truncf
2081#undef truncl
2082
2083#ifdef _GLIBCXX_HAVE_C99_FLT_EVAL_TYPES
2084 // types
2085 using ::double_t;
2086 using ::float_t;
2087#endif
2088
2089 // functions
2090 using ::acosh;
2091 using ::acoshf;
2092 using ::acoshl;
2093
2094 using ::asinh;
2095 using ::asinhf;
2096 using ::asinhl;
2097
2098 using ::atanh;
2099 using ::atanhf;
2100 using ::atanhl;
2101
2102 using ::cbrt;
2103 using ::cbrtf;
2104 using ::cbrtl;
2105
2106 using ::copysign;
2107 using ::copysignf;
2108 using ::copysignl;
2109
2110 using ::erf;
2111 using ::erff;
2112 using ::erfl;
2113
2114 using ::erfc;
2115 using ::erfcf;
2116 using ::erfcl;
2117
2118 using ::exp2;
2119 using ::exp2f;
2120 using ::exp2l;
2121
2122 using ::expm1;
2123 using ::expm1f;
2124 using ::expm1l;
2125
2126 using ::fdim;
2127 using ::fdimf;
2128 using ::fdiml;
2129
2130 using ::fma;
2131 using ::fmaf;
2132 using ::fmal;
2133
2134 using ::fmax;
2135 using ::fmaxf;
2136 using ::fmaxl;
2137
2138 using ::fmin;
2139 using ::fminf;
2140 using ::fminl;
2141
2142 using ::hypot;
2143 using ::hypotf;
2144 using ::hypotl;
2145
2146 using ::ilogb;
2147 using ::ilogbf;
2148 using ::ilogbl;
2149
2150 using ::lgamma;
2151 using ::lgammaf;
2152 using ::lgammal;
2153
2154#ifndef _GLIBCXX_NO_C99_ROUNDING_FUNCS
2155 using ::llrint;
2156 using ::llrintf;
2157 using ::llrintl;
2158
2159 using ::llround;
2160 using ::llroundf;
2161 using ::llroundl;
2162#endif
2163
2164 using ::log1p;
2165 using ::log1pf;
2166 using ::log1pl;
2167
2168 using ::log2;
2169 using ::log2f;
2170 using ::log2l;
2171
2172 using ::logb;
2173 using ::logbf;
2174 using ::logbl;
2175
2176 using ::lrint;
2177 using ::lrintf;
2178 using ::lrintl;
2179
2180 using ::lround;
2181 using ::lroundf;
2182 using ::lroundl;
2183
2184 using ::nan;
2185 using ::nanf;
2186 using ::nanl;
2187
2188 using ::nearbyint;
2189 using ::nearbyintf;
2190 using ::nearbyintl;
2191
2192 using ::nextafter;
2193 using ::nextafterf;
2194 using ::nextafterl;
2195
2196 using ::nexttoward;
2197 using ::nexttowardf;
2198 using ::nexttowardl;
2199
2200 using ::remainder;
2201 using ::remainderf;
2202 using ::remainderl;
2203
2204 using ::remquo;
2205 using ::remquof;
2206 using ::remquol;
2207
2208 using ::rint;
2209 using ::rintf;
2210 using ::rintl;
2211
2212 using ::round;
2213 using ::roundf;
2214 using ::roundl;
2215
2216 using ::scalbln;
2217 using ::scalblnf;
2218 using ::scalblnl;
2219
2220 using ::scalbn;
2221 using ::scalbnf;
2222 using ::scalbnl;
2223
2224 using ::tgamma;
2225 using ::tgammaf;
2226 using ::tgammal;
2227
2228 using ::trunc;
2229 using ::truncf;
2230 using ::truncl;
2231
2232 /// Additional overloads.
2233#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2234 constexpr float
2235 acosh(float __x)
2236 { return __builtin_acoshf(__x); }
2237
2238 constexpr long double
2239 acosh(long double __x)
2240 { return __builtin_acoshl(__x); }
2241#endif
2242
2243#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2244 template<typename _Tp>
2245 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2246 double>::__type
2247 acosh(_Tp __x)
2248 { return __builtin_acosh(__x); }
2249#endif
2250
2251#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2252 constexpr float
2253 asinh(float __x)
2254 { return __builtin_asinhf(__x); }
2255
2256 constexpr long double
2257 asinh(long double __x)
2258 { return __builtin_asinhl(__x); }
2259#endif
2260
2261#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2262 template<typename _Tp>
2263 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2264 double>::__type
2265 asinh(_Tp __x)
2266 { return __builtin_asinh(__x); }
2267#endif
2268
2269#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2270 constexpr float
2271 atanh(float __x)
2272 { return __builtin_atanhf(__x); }
2273
2274 constexpr long double
2275 atanh(long double __x)
2276 { return __builtin_atanhl(__x); }
2277#endif
2278
2279#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2280 template<typename _Tp>
2281 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2282 double>::__type
2283 atanh(_Tp __x)
2284 { return __builtin_atanh(__x); }
2285#endif
2286
2287#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2288 constexpr float
2289 cbrt(float __x)
2290 { return __builtin_cbrtf(__x); }
2291
2292 constexpr long double
2293 cbrt(long double __x)
2294 { return __builtin_cbrtl(__x); }
2295#endif
2296
2297#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2298 template<typename _Tp>
2299 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2300 double>::__type
2301 cbrt(_Tp __x)
2302 { return __builtin_cbrt(__x); }
2303#endif
2304
2305#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2306 constexpr float
2307 copysign(float __x, float __y)
2308 { return __builtin_copysignf(__x, __y); }
2309
2310 constexpr long double
2311 copysign(long double __x, long double __y)
2312 { return __builtin_copysignl(__x, __y); }
2313#endif
2314
2315#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2316 constexpr float
2317 erf(float __x)
2318 { return __builtin_erff(__x); }
2319
2320 constexpr long double
2321 erf(long double __x)
2322 { return __builtin_erfl(__x); }
2323#endif
2324
2325#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2326 template<typename _Tp>
2327 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2328 double>::__type
2329 erf(_Tp __x)
2330 { return __builtin_erf(__x); }
2331#endif
2332
2333#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2334 constexpr float
2335 erfc(float __x)
2336 { return __builtin_erfcf(__x); }
2337
2338 constexpr long double
2339 erfc(long double __x)
2340 { return __builtin_erfcl(__x); }
2341#endif
2342
2343#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2344 template<typename _Tp>
2345 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2346 double>::__type
2347 erfc(_Tp __x)
2348 { return __builtin_erfc(__x); }
2349#endif
2350
2351#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2352 constexpr float
2353 exp2(float __x)
2354 { return __builtin_exp2f(__x); }
2355
2356 constexpr long double
2357 exp2(long double __x)
2358 { return __builtin_exp2l(__x); }
2359#endif
2360
2361#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2362 template<typename _Tp>
2363 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2364 double>::__type
2365 exp2(_Tp __x)
2366 { return __builtin_exp2(__x); }
2367#endif
2368
2369#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2370 constexpr float
2371 expm1(float __x)
2372 { return __builtin_expm1f(__x); }
2373
2374 constexpr long double
2375 expm1(long double __x)
2376 { return __builtin_expm1l(__x); }
2377#endif
2378
2379#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2380 template<typename _Tp>
2381 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2382 double>::__type
2383 expm1(_Tp __x)
2384 { return __builtin_expm1(__x); }
2385#endif
2386
2387#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2388 constexpr float
2389 fdim(float __x, float __y)
2390 { return __builtin_fdimf(__x, __y); }
2391
2392 constexpr long double
2393 fdim(long double __x, long double __y)
2394 { return __builtin_fdiml(__x, __y); }
2395#endif
2396
2397#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2398 constexpr float
2399 fma(float __x, float __y, float __z)
2400 { return __builtin_fmaf(__x, __y, __z); }
2401
2402 constexpr long double
2403 fma(long double __x, long double __y, long double __z)
2404 { return __builtin_fmal(__x, __y, __z); }
2405#endif
2406
2407#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2408 constexpr float
2409 fmax(float __x, float __y)
2410 { return __builtin_fmaxf(__x, __y); }
2411
2412 constexpr long double
2413 fmax(long double __x, long double __y)
2414 { return __builtin_fmaxl(__x, __y); }
2415#endif
2416
2417#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2418 constexpr float
2419 fmin(float __x, float __y)
2420 { return __builtin_fminf(__x, __y); }
2421
2422 constexpr long double
2423 fmin(long double __x, long double __y)
2424 { return __builtin_fminl(__x, __y); }
2425#endif
2426
2427#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2428 constexpr float
2429 hypot(float __x, float __y)
2430 { return __builtin_hypotf(__x, __y); }
2431
2432 constexpr long double
2433 hypot(long double __x, long double __y)
2434 { return __builtin_hypotl(__x, __y); }
2435#endif
2436
2437#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2438 constexpr int
2439 ilogb(float __x)
2440 { return __builtin_ilogbf(__x); }
2441
2442 constexpr int
2443 ilogb(long double __x)
2444 { return __builtin_ilogbl(__x); }
2445#endif
2446
2447#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2448 template<typename _Tp>
2449 constexpr
2450 typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2451 int>::__type
2452 ilogb(_Tp __x)
2453 { return __builtin_ilogb(__x); }
2454#endif
2455
2456#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2457 constexpr float
2458 lgamma(float __x)
2459 { return __builtin_lgammaf(__x); }
2460
2461 constexpr long double
2462 lgamma(long double __x)
2463 { return __builtin_lgammal(__x); }
2464#endif
2465
2466#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2467 template<typename _Tp>
2468 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2469 double>::__type
2470 lgamma(_Tp __x)
2471 { return __builtin_lgamma(__x); }
2472#endif
2473
2474#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2475 constexpr long long
2476 llrint(float __x)
2477 { return __builtin_llrintf(__x); }
2478
2479 constexpr long long
2480 llrint(long double __x)
2481 { return __builtin_llrintl(__x); }
2482#endif
2483
2484#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2485 template<typename _Tp>
2486 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2487 long long>::__type
2488 llrint(_Tp __x)
2489 { return __builtin_llrint(__x); }
2490#endif
2491
2492#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2493 constexpr long long
2494 llround(float __x)
2495 { return __builtin_llroundf(__x); }
2496
2497 constexpr long long
2498 llround(long double __x)
2499 { return __builtin_llroundl(__x); }
2500#endif
2501
2502#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2503 template<typename _Tp>
2504 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2505 long long>::__type
2506 llround(_Tp __x)
2507 { return __builtin_llround(__x); }
2508#endif
2509
2510#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2511 constexpr float
2512 log1p(float __x)
2513 { return __builtin_log1pf(__x); }
2514
2515 constexpr long double
2516 log1p(long double __x)
2517 { return __builtin_log1pl(__x); }
2518#endif
2519
2520#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2521 template<typename _Tp>
2522 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2523 double>::__type
2524 log1p(_Tp __x)
2525 { return __builtin_log1p(__x); }
2526#endif
2527
2528#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2529 // DR 568.
2530 constexpr float
2531 log2(float __x)
2532 { return __builtin_log2f(__x); }
2533
2534 constexpr long double
2535 log2(long double __x)
2536 { return __builtin_log2l(__x); }
2537#endif
2538
2539#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2540 template<typename _Tp>
2541 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2542 double>::__type
2543 log2(_Tp __x)
2544 { return __builtin_log2(__x); }
2545#endif
2546
2547#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2548 constexpr float
2549 logb(float __x)
2550 { return __builtin_logbf(__x); }
2551
2552 constexpr long double
2553 logb(long double __x)
2554 { return __builtin_logbl(__x); }
2555#endif
2556
2557#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2558 template<typename _Tp>
2559 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2560 double>::__type
2561 logb(_Tp __x)
2562 { return __builtin_logb(__x); }
2563#endif
2564
2565#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2566 constexpr long
2567 lrint(float __x)
2568 { return __builtin_lrintf(__x); }
2569
2570 constexpr long
2571 lrint(long double __x)
2572 { return __builtin_lrintl(__x); }
2573#endif
2574
2575#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2576 template<typename _Tp>
2577 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2578 long>::__type
2579 lrint(_Tp __x)
2580 { return __builtin_lrint(__x); }
2581#endif
2582
2583#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2584 constexpr long
2585 lround(float __x)
2586 { return __builtin_lroundf(__x); }
2587
2588 constexpr long
2589 lround(long double __x)
2590 { return __builtin_lroundl(__x); }
2591#endif
2592
2593#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2594 template<typename _Tp>
2595 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2596 long>::__type
2597 lround(_Tp __x)
2598 { return __builtin_lround(__x); }
2599#endif
2600
2601#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2602 constexpr float
2603 nearbyint(float __x)
2604 { return __builtin_nearbyintf(__x); }
2605
2606 constexpr long double
2607 nearbyint(long double __x)
2608 { return __builtin_nearbyintl(__x); }
2609#endif
2610
2611#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2612 template<typename _Tp>
2613 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2614 double>::__type
2615 nearbyint(_Tp __x)
2616 { return __builtin_nearbyint(__x); }
2617#endif
2618
2619#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2620 constexpr float
2621 nextafter(float __x, float __y)
2622 { return __builtin_nextafterf(__x, __y); }
2623
2624 constexpr long double
2625 nextafter(long double __x, long double __y)
2626 { return __builtin_nextafterl(__x, __y); }
2627#endif
2628
2629#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2630 constexpr float
2631 nexttoward(float __x, long double __y)
2632 { return __builtin_nexttowardf(__x, __y); }
2633
2634 constexpr long double
2635 nexttoward(long double __x, long double __y)
2636 { return __builtin_nexttowardl(__x, __y); }
2637#endif
2638
2639#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2640 template<typename _Tp>
2641 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2642 double>::__type
2643 nexttoward(_Tp __x, long double __y)
2644 { return __builtin_nexttoward(__x, __y); }
2645#endif
2646
2647#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2648 constexpr float
2649 remainder(float __x, float __y)
2650 { return __builtin_remainderf(__x, __y); }
2651
2652 constexpr long double
2653 remainder(long double __x, long double __y)
2654 { return __builtin_remainderl(__x, __y); }
2655#endif
2656
2657#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2658 inline float
2659 remquo(float __x, float __y, int* __pquo)
2660 { return __builtin_remquof(__x, __y, __pquo); }
2661
2662 inline long double
2663 remquo(long double __x, long double __y, int* __pquo)
2664 { return __builtin_remquol(__x, __y, __pquo); }
2665#endif
2666
2667#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2668 constexpr float
2669 rint(float __x)
2670 { return __builtin_rintf(__x); }
2671
2672 constexpr long double
2673 rint(long double __x)
2674 { return __builtin_rintl(__x); }
2675#endif
2676
2677#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2678 template<typename _Tp>
2679 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2680 double>::__type
2681 rint(_Tp __x)
2682 { return __builtin_rint(__x); }
2683#endif
2684
2685#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2686 constexpr float
2687 round(float __x)
2688 { return __builtin_roundf(__x); }
2689
2690 constexpr long double
2691 round(long double __x)
2692 { return __builtin_roundl(__x); }
2693#endif
2694
2695#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2696 template<typename _Tp>
2697 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2698 double>::__type
2699 round(_Tp __x)
2700 { return __builtin_round(__x); }
2701#endif
2702
2703#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2704 constexpr float
2705 scalbln(float __x, long __ex)
2706 { return __builtin_scalblnf(__x, __ex); }
2707
2708 constexpr long double
2709 scalbln(long double __x, long __ex)
2710 { return __builtin_scalblnl(__x, __ex); }
2711#endif
2712
2713#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2714 template<typename _Tp>
2715 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2716 double>::__type
2717 scalbln(_Tp __x, long __ex)
2718 { return __builtin_scalbln(__x, __ex); }
2719#endif
2720
2721#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2722 constexpr float
2723 scalbn(float __x, int __ex)
2724 { return __builtin_scalbnf(__x, __ex); }
2725
2726 constexpr long double
2727 scalbn(long double __x, int __ex)
2728 { return __builtin_scalbnl(__x, __ex); }
2729#endif
2730
2731#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2732 template<typename _Tp>
2733 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2734 double>::__type
2735 scalbn(_Tp __x, int __ex)
2736 { return __builtin_scalbn(__x, __ex); }
2737#endif
2738
2739#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2740 constexpr float
2741 tgamma(float __x)
2742 { return __builtin_tgammaf(__x); }
2743
2744 constexpr long double
2745 tgamma(long double __x)
2746 { return __builtin_tgammal(__x); }
2747#endif
2748
2749#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2750 template<typename _Tp>
2751 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2752 double>::__type
2753 tgamma(_Tp __x)
2754 { return __builtin_tgamma(__x); }
2755#endif
2756
2757#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2758 constexpr float
2759 trunc(float __x)
2760 { return __builtin_truncf(__x); }
2761
2762 constexpr long double
2763 trunc(long double __x)
2764 { return __builtin_truncl(__x); }
2765#endif
2766
2767#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2768 template<typename _Tp>
2769 constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
2770 double>::__type
2771 trunc(_Tp __x)
2772 { return __builtin_trunc(__x); }
2773#endif
2774
2775#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2776 constexpr _Float16
2777 acosh(_Float16 __x)
2778 { return _Float16(__builtin_acoshf(__x)); }
2779
2780 constexpr _Float16
2781 asinh(_Float16 __x)
2782 { return _Float16(__builtin_asinhf(__x)); }
2783
2784 constexpr _Float16
2785 atanh(_Float16 __x)
2786 { return _Float16(__builtin_atanhf(__x)); }
2787
2788 constexpr _Float16
2789 cbrt(_Float16 __x)
2790 { return _Float16(__builtin_cbrtf(__x)); }
2791
2792 constexpr _Float16
2793 copysign(_Float16 __x, _Float16 __y)
2794 { return __builtin_copysignf16(__x, __y); }
2795
2796 constexpr _Float16
2797 erf(_Float16 __x)
2798 { return _Float16(__builtin_erff(__x)); }
2799
2800 constexpr _Float16
2801 erfc(_Float16 __x)
2802 { return _Float16(__builtin_erfcf(__x)); }
2803
2804 constexpr _Float16
2805 exp2(_Float16 __x)
2806 { return _Float16(__builtin_exp2f(__x)); }
2807
2808 constexpr _Float16
2809 expm1(_Float16 __x)
2810 { return _Float16(__builtin_expm1f(__x)); }
2811
2812 constexpr _Float16
2813 fdim(_Float16 __x, _Float16 __y)
2814 { return _Float16(__builtin_fdimf(__x, __y)); }
2815
2816 constexpr _Float16
2817 fma(_Float16 __x, _Float16 __y, _Float16 __z)
2818 { return _Float16(__builtin_fmaf(__x, __y, __z)); }
2819
2820 constexpr _Float16
2821 fmax(_Float16 __x, _Float16 __y)
2822 { return _Float16(__builtin_fmaxf(__x, __y)); }
2823
2824 constexpr _Float16
2825 fmin(_Float16 __x, _Float16 __y)
2826 { return _Float16(__builtin_fminf(__x, __y)); }
2827
2828 constexpr _Float16
2829 hypot(_Float16 __x, _Float16 __y)
2830 { return _Float16(__builtin_hypotf(__x, __y)); }
2831
2832 constexpr int
2833 ilogb(_Float16 __x)
2834 { return _Float16(__builtin_ilogbf(__x)); }
2835
2836 constexpr _Float16
2837 lgamma(_Float16 __x)
2838 { return _Float16(__builtin_lgammaf(__x)); }
2839
2840 constexpr long long
2841 llrint(_Float16 __x)
2842 { return _Float16(__builtin_llrintf(__x)); }
2843
2844 constexpr long long
2845 llround(_Float16 __x)
2846 { return _Float16(__builtin_llroundf(__x)); }
2847
2848 constexpr _Float16
2849 log1p(_Float16 __x)
2850 { return _Float16(__builtin_log1pf(__x)); }
2851
2852 // DR 568.
2853 constexpr _Float16
2854 log2(_Float16 __x)
2855 { return _Float16(__builtin_log2f(__x)); }
2856
2857 constexpr _Float16
2858 logb(_Float16 __x)
2859 { return _Float16(__builtin_logbf(__x)); }
2860
2861 constexpr long
2862 lrint(_Float16 __x)
2863 { return _Float16(__builtin_lrintf(__x)); }
2864
2865 constexpr long
2866 lround(_Float16 __x)
2867 { return _Float16(__builtin_lroundf(__x)); }
2868
2869 constexpr _Float16
2870 nearbyint(_Float16 __x)
2871 { return _Float16(__builtin_nearbyintf(__x)); }
2872
2873 constexpr _Float16
2874 nextafter(_Float16 __x, _Float16 __y)
2875 {
2876 if (std::__is_constant_evaluated())
2877 return __builtin_nextafterf16(__x, __y);
2878#ifdef __INT16_TYPE__
2879 using __float16_int_type = __INT16_TYPE__;
2880#else
2881 using __float16_int_type = short int;
2882#endif
2883 __float16_int_type __hx, __hy, __ix, __iy;
2884 __builtin_memcpy(&__hx, &__x, sizeof(__x));
2885 __builtin_memcpy(&__hy, &__y, sizeof(__x));
2886 __ix = __hx & 0x7fff; // |x|
2887 __iy = __hy & 0x7fff; // |y|
2888 if (__ix > 0x7c00 || __iy > 0x7c00) // x or y is NaN
2889 return __x + __y;
2890 if (__x == __y)
2891 return __y; // x == y, return y
2892 if (__ix == 0) // x == 0
2893 {
2894 __hy = (__hy & 0x8000) | 1; // return +-__FLT16_DENORM_MIN__
2895 __builtin_memcpy(&__x, &__hy, sizeof(__x));
2896 __builtin_nextafterf(0.0f, 1.0f); // raise underflow
2897 return __x;
2898 }
2899 if (__hx >= 0) // x > 0
2900 {
2901 if (__hx > __hy) // x > y, x -= ulp
2902 --__hx;
2903 else // x < y, x += ulp
2904 ++__hx;
2905 }
2906 else // x < 0
2907 {
2908 if (__hy >= 0 || __hx > __hy) // x < y, x -= ulp
2909 --__hx;
2910 else // x > y, x += ulp
2911 ++__hx;
2912 }
2913 __hy = __hx & 0x7c00;
2914 if (__hy >= 0x7c00)
2915 __builtin_nextafterf(__FLT_MAX__, __builtin_inff()); // overflow
2916 else if (__hy < 0x0400)
2917 __builtin_nextafterf(__FLT_MIN__, 0.0f); // underflow
2918 __builtin_memcpy(&__x, &__hx, sizeof(__x));
2919 return __x;
2920 }
2921
2922 constexpr _Float16
2923 remainder(_Float16 __x, _Float16 __y)
2924 { return _Float16(__builtin_remainderf(__x, __y)); }
2925
2926 inline _Float16
2927 remquo(_Float16 __x, _Float16 __y, int* __pquo)
2928 { return _Float16(__builtin_remquof(__x, __y, __pquo)); }
2929
2930 constexpr _Float16
2931 rint(_Float16 __x)
2932 { return _Float16(__builtin_rintf(__x)); }
2933
2934 constexpr _Float16
2935 round(_Float16 __x)
2936 { return _Float16(__builtin_roundf(__x)); }
2937
2938 constexpr _Float16
2939 scalbln(_Float16 __x, long __ex)
2940 { return _Float16(__builtin_scalblnf(__x, __ex)); }
2941
2942 constexpr _Float16
2943 scalbn(_Float16 __x, int __ex)
2944 { return _Float16(__builtin_scalbnf(__x, __ex)); }
2945
2946 constexpr _Float16
2947 tgamma(_Float16 __x)
2948 { return _Float16(__builtin_tgammaf(__x)); }
2949
2950 constexpr _Float16
2951 trunc(_Float16 __x)
2952 { return _Float16(__builtin_truncf(__x)); }
2953#endif
2954
2955#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
2956 constexpr _Float32
2957 acosh(_Float32 __x)
2958 { return __builtin_acoshf(__x); }
2959
2960 constexpr _Float32
2961 asinh(_Float32 __x)
2962 { return __builtin_asinhf(__x); }
2963
2964 constexpr _Float32
2965 atanh(_Float32 __x)
2966 { return __builtin_atanhf(__x); }
2967
2968 constexpr _Float32
2969 cbrt(_Float32 __x)
2970 { return __builtin_cbrtf(__x); }
2971
2972 constexpr _Float32
2973 copysign(_Float32 __x, _Float32 __y)
2974 { return __builtin_copysignf(__x, __y); }
2975
2976 constexpr _Float32
2977 erf(_Float32 __x)
2978 { return __builtin_erff(__x); }
2979
2980 constexpr _Float32
2981 erfc(_Float32 __x)
2982 { return __builtin_erfcf(__x); }
2983
2984 constexpr _Float32
2985 exp2(_Float32 __x)
2986 { return __builtin_exp2f(__x); }
2987
2988 constexpr _Float32
2989 expm1(_Float32 __x)
2990 { return __builtin_expm1f(__x); }
2991
2992 constexpr _Float32
2993 fdim(_Float32 __x, _Float32 __y)
2994 { return __builtin_fdimf(__x, __y); }
2995
2996 constexpr _Float32
2997 fma(_Float32 __x, _Float32 __y, _Float32 __z)
2998 { return __builtin_fmaf(__x, __y, __z); }
2999
3000 constexpr _Float32
3001 fmax(_Float32 __x, _Float32 __y)
3002 { return __builtin_fmaxf(__x, __y); }
3003
3004 constexpr _Float32
3005 fmin(_Float32 __x, _Float32 __y)
3006 { return __builtin_fminf(__x, __y); }
3007
3008 constexpr _Float32
3009 hypot(_Float32 __x, _Float32 __y)
3010 { return __builtin_hypotf(__x, __y); }
3011
3012 constexpr int
3013 ilogb(_Float32 __x)
3014 { return __builtin_ilogbf(__x); }
3015
3016 constexpr _Float32
3017 lgamma(_Float32 __x)
3018 { return __builtin_lgammaf(__x); }
3019
3020 constexpr long long
3021 llrint(_Float32 __x)
3022 { return __builtin_llrintf(__x); }
3023
3024 constexpr long long
3025 llround(_Float32 __x)
3026 { return __builtin_llroundf(__x); }
3027
3028 constexpr _Float32
3029 log1p(_Float32 __x)
3030 { return __builtin_log1pf(__x); }
3031
3032 // DR 568.
3033 constexpr _Float32
3034 log2(_Float32 __x)
3035 { return __builtin_log2f(__x); }
3036
3037 constexpr _Float32
3038 logb(_Float32 __x)
3039 { return __builtin_logbf(__x); }
3040
3041 constexpr long
3042 lrint(_Float32 __x)
3043 { return __builtin_lrintf(__x); }
3044
3045 constexpr long
3046 lround(_Float32 __x)
3047 { return __builtin_lroundf(__x); }
3048
3049 constexpr _Float32
3050 nearbyint(_Float32 __x)
3051 { return __builtin_nearbyintf(__x); }
3052
3053 constexpr _Float32
3054 nextafter(_Float32 __x, _Float32 __y)
3055 { return __builtin_nextafterf(__x, __y); }
3056
3057 constexpr _Float32
3058 remainder(_Float32 __x, _Float32 __y)
3059 { return __builtin_remainderf(__x, __y); }
3060
3061 inline _Float32
3062 remquo(_Float32 __x, _Float32 __y, int* __pquo)
3063 { return __builtin_remquof(__x, __y, __pquo); }
3064
3065 constexpr _Float32
3066 rint(_Float32 __x)
3067 { return __builtin_rintf(__x); }
3068
3069 constexpr _Float32
3070 round(_Float32 __x)
3071 { return __builtin_roundf(__x); }
3072
3073 constexpr _Float32
3074 scalbln(_Float32 __x, long __ex)
3075 { return __builtin_scalblnf(__x, __ex); }
3076
3077 constexpr _Float32
3078 scalbn(_Float32 __x, int __ex)
3079 { return __builtin_scalbnf(__x, __ex); }
3080
3081 constexpr _Float32
3082 tgamma(_Float32 __x)
3083 { return __builtin_tgammaf(__x); }
3084
3085 constexpr _Float32
3086 trunc(_Float32 __x)
3087 { return __builtin_truncf(__x); }
3088#endif
3089
3090#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
3091 constexpr _Float64
3092 acosh(_Float64 __x)
3093 { return __builtin_acosh(__x); }
3094
3095 constexpr _Float64
3096 asinh(_Float64 __x)
3097 { return __builtin_asinh(__x); }
3098
3099 constexpr _Float64
3100 atanh(_Float64 __x)
3101 { return __builtin_atanh(__x); }
3102
3103 constexpr _Float64
3104 cbrt(_Float64 __x)
3105 { return __builtin_cbrt(__x); }
3106
3107 constexpr _Float64
3108 copysign(_Float64 __x, _Float64 __y)
3109 { return __builtin_copysign(__x, __y); }
3110
3111 constexpr _Float64
3112 erf(_Float64 __x)
3113 { return __builtin_erf(__x); }
3114
3115 constexpr _Float64
3116 erfc(_Float64 __x)
3117 { return __builtin_erfc(__x); }
3118
3119 constexpr _Float64
3120 exp2(_Float64 __x)
3121 { return __builtin_exp2(__x); }
3122
3123 constexpr _Float64
3124 expm1(_Float64 __x)
3125 { return __builtin_expm1(__x); }
3126
3127 constexpr _Float64
3128 fdim(_Float64 __x, _Float64 __y)
3129 { return __builtin_fdim(__x, __y); }
3130
3131 constexpr _Float64
3132 fma(_Float64 __x, _Float64 __y, _Float64 __z)
3133 { return __builtin_fma(__x, __y, __z); }
3134
3135 constexpr _Float64
3136 fmax(_Float64 __x, _Float64 __y)
3137 { return __builtin_fmax(__x, __y); }
3138
3139 constexpr _Float64
3140 fmin(_Float64 __x, _Float64 __y)
3141 { return __builtin_fmin(__x, __y); }
3142
3143 constexpr _Float64
3144 hypot(_Float64 __x, _Float64 __y)
3145 { return __builtin_hypot(__x, __y); }
3146
3147 constexpr int
3148 ilogb(_Float64 __x)
3149 { return __builtin_ilogb(__x); }
3150
3151 constexpr _Float64
3152 lgamma(_Float64 __x)
3153 { return __builtin_lgamma(__x); }
3154
3155 constexpr long long
3156 llrint(_Float64 __x)
3157 { return __builtin_llrint(__x); }
3158
3159 constexpr long long
3160 llround(_Float64 __x)
3161 { return __builtin_llround(__x); }
3162
3163 constexpr _Float64
3164 log1p(_Float64 __x)
3165 { return __builtin_log1p(__x); }
3166
3167 // DR 568.
3168 constexpr _Float64
3169 log2(_Float64 __x)
3170 { return __builtin_log2(__x); }
3171
3172 constexpr _Float64
3173 logb(_Float64 __x)
3174 { return __builtin_logb(__x); }
3175
3176 constexpr long
3177 lrint(_Float64 __x)
3178 { return __builtin_lrint(__x); }
3179
3180 constexpr long
3181 lround(_Float64 __x)
3182 { return __builtin_lround(__x); }
3183
3184 constexpr _Float64
3185 nearbyint(_Float64 __x)
3186 { return __builtin_nearbyint(__x); }
3187
3188 constexpr _Float64
3189 nextafter(_Float64 __x, _Float64 __y)
3190 { return __builtin_nextafter(__x, __y); }
3191
3192 constexpr _Float64
3193 remainder(_Float64 __x, _Float64 __y)
3194 { return __builtin_remainder(__x, __y); }
3195
3196 inline _Float64
3197 remquo(_Float64 __x, _Float64 __y, int* __pquo)
3198 { return __builtin_remquo(__x, __y, __pquo); }
3199
3200 constexpr _Float64
3201 rint(_Float64 __x)
3202 { return __builtin_rint(__x); }
3203
3204 constexpr _Float64
3205 round(_Float64 __x)
3206 { return __builtin_round(__x); }
3207
3208 constexpr _Float64
3209 scalbln(_Float64 __x, long __ex)
3210 { return __builtin_scalbln(__x, __ex); }
3211
3212 constexpr _Float64
3213 scalbn(_Float64 __x, int __ex)
3214 { return __builtin_scalbn(__x, __ex); }
3215
3216 constexpr _Float64
3217 tgamma(_Float64 __x)
3218 { return __builtin_tgamma(__x); }
3219
3220 constexpr _Float64
3221 trunc(_Float64 __x)
3222 { return __builtin_trunc(__x); }
3223#endif
3224
3225#if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
3226 constexpr _Float128
3227 acosh(_Float128 __x)
3228 { return __builtin_acoshl(__x); }
3229
3230 constexpr _Float128
3231 asinh(_Float128 __x)
3232 { return __builtin_asinhl(__x); }
3233
3234 constexpr _Float128
3235 atanh(_Float128 __x)
3236 { return __builtin_atanhl(__x); }
3237
3238 constexpr _Float128
3239 cbrt(_Float128 __x)
3240 { return __builtin_cbrtl(__x); }
3241
3242 constexpr _Float128
3243 copysign(_Float128 __x, _Float128 __y)
3244 { return __builtin_copysignl(__x, __y); }
3245
3246 constexpr _Float128
3247 erf(_Float128 __x)
3248 { return __builtin_erfl(__x); }
3249
3250 constexpr _Float128
3251 erfc(_Float128 __x)
3252 { return __builtin_erfcl(__x); }
3253
3254 constexpr _Float128
3255 exp2(_Float128 __x)
3256 { return __builtin_exp2l(__x); }
3257
3258 constexpr _Float128
3259 expm1(_Float128 __x)
3260 { return __builtin_expm1l(__x); }
3261
3262 constexpr _Float128
3263 fdim(_Float128 __x, _Float128 __y)
3264 { return __builtin_fdiml(__x, __y); }
3265
3266 constexpr _Float128
3267 fma(_Float128 __x, _Float128 __y, _Float128 __z)
3268 { return __builtin_fmal(__x, __y, __z); }
3269
3270 constexpr _Float128
3271 fmax(_Float128 __x, _Float128 __y)
3272 { return __builtin_fmaxl(__x, __y); }
3273
3274 constexpr _Float128
3275 fmin(_Float128 __x, _Float128 __y)
3276 { return __builtin_fminl(__x, __y); }
3277
3278 constexpr _Float128
3279 hypot(_Float128 __x, _Float128 __y)
3280 { return __builtin_hypotl(__x, __y); }
3281
3282 constexpr int
3283 ilogb(_Float128 __x)
3284 { return __builtin_ilogbl(__x); }
3285
3286 constexpr _Float128
3287 lgamma(_Float128 __x)
3288 { return __builtin_lgammal(__x); }
3289
3290 constexpr long long
3291 llrint(_Float128 __x)
3292 { return __builtin_llrintl(__x); }
3293
3294 constexpr long long
3295 llround(_Float128 __x)
3296 { return __builtin_llroundl(__x); }
3297
3298 constexpr _Float128
3299 log1p(_Float128 __x)
3300 { return __builtin_log1pl(__x); }
3301
3302 // DR 568.
3303 constexpr _Float128
3304 log2(_Float128 __x)
3305 { return __builtin_log2l(__x); }
3306
3307 constexpr _Float128
3308 logb(_Float128 __x)
3309 { return __builtin_logbl(__x); }
3310
3311 constexpr long
3312 lrint(_Float128 __x)
3313 { return __builtin_lrintl(__x); }
3314
3315 constexpr long
3316 lround(_Float128 __x)
3317 { return __builtin_lroundl(__x); }
3318
3319 constexpr _Float128
3320 nearbyint(_Float128 __x)
3321 { return __builtin_nearbyintl(__x); }
3322
3323 constexpr _Float128
3324 nextafter(_Float128 __x, _Float128 __y)
3325 { return __builtin_nextafterl(__x, __y); }
3326
3327 constexpr _Float128
3328 remainder(_Float128 __x, _Float128 __y)
3329 { return __builtin_remainderl(__x, __y); }
3330
3331 inline _Float128
3332 remquo(_Float128 __x, _Float128 __y, int* __pquo)
3333 { return __builtin_remquol(__x, __y, __pquo); }
3334
3335 constexpr _Float128
3336 rint(_Float128 __x)
3337 { return __builtin_rintl(__x); }
3338
3339 constexpr _Float128
3340 round(_Float128 __x)
3341 { return __builtin_roundl(__x); }
3342
3343 constexpr _Float128
3344 scalbln(_Float128 __x, long __ex)
3345 { return __builtin_scalblnl(__x, __ex); }
3346
3347 constexpr _Float128
3348 scalbn(_Float128 __x, int __ex)
3349 { return __builtin_scalbnl(__x, __ex); }
3350
3351 constexpr _Float128
3352 tgamma(_Float128 __x)
3353 { return __builtin_tgammal(__x); }
3354
3355 constexpr _Float128
3356 trunc(_Float128 __x)
3357 { return __builtin_truncl(__x); }
3358#elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
3359 constexpr _Float128
3360 acosh(_Float128 __x)
3361 { return __builtin_acoshf128(__x); }
3362
3363 constexpr _Float128
3364 asinh(_Float128 __x)
3365 { return __builtin_asinhf128(__x); }
3366
3367 constexpr _Float128
3368 atanh(_Float128 __x)
3369 { return __builtin_atanhf128(__x); }
3370
3371 constexpr _Float128
3372 cbrt(_Float128 __x)
3373 { return __builtin_cbrtf128(__x); }
3374
3375 constexpr _Float128
3376 copysign(_Float128 __x, _Float128 __y)
3377 { return __builtin_copysignf128(__x, __y); }
3378
3379 constexpr _Float128
3380 erf(_Float128 __x)
3381 { return __builtin_erff128(__x); }
3382
3383 constexpr _Float128
3384 erfc(_Float128 __x)
3385 { return __builtin_erfcf128(__x); }
3386
3387 constexpr _Float128
3388 exp2(_Float128 __x)
3389 { return __builtin_exp2f128(__x); }
3390
3391 constexpr _Float128
3392 expm1(_Float128 __x)
3393 { return __builtin_expm1f128(__x); }
3394
3395 constexpr _Float128
3396 fdim(_Float128 __x, _Float128 __y)
3397 { return __builtin_fdimf128(__x, __y); }
3398
3399 constexpr _Float128
3400 fma(_Float128 __x, _Float128 __y, _Float128 __z)
3401 { return __builtin_fmaf128(__x, __y, __z); }
3402
3403 constexpr _Float128
3404 fmax(_Float128 __x, _Float128 __y)
3405 { return __builtin_fmaxf128(__x, __y); }
3406
3407 constexpr _Float128
3408 fmin(_Float128 __x, _Float128 __y)
3409 { return __builtin_fminf128(__x, __y); }
3410
3411 constexpr _Float128
3412 hypot(_Float128 __x, _Float128 __y)
3413 { return __builtin_hypotf128(__x, __y); }
3414
3415 constexpr int
3416 ilogb(_Float128 __x)
3417 { return __builtin_ilogbf128(__x); }
3418
3419 constexpr _Float128
3420 lgamma(_Float128 __x)
3421 { return __builtin_lgammaf128(__x); }
3422
3423 constexpr long long
3424 llrint(_Float128 __x)
3425 { return __builtin_llrintf128(__x); }
3426
3427 constexpr long long
3428 llround(_Float128 __x)
3429 { return __builtin_llroundf128(__x); }
3430
3431 constexpr _Float128
3432 log1p(_Float128 __x)
3433 { return __builtin_log1pf128(__x); }
3434
3435 // DR 568.
3436 constexpr _Float128
3437 log2(_Float128 __x)
3438 { return __builtin_log2f128(__x); }
3439
3440 constexpr _Float128
3441 logb(_Float128 __x)
3442 { return __builtin_logbf128(__x); }
3443
3444 constexpr long
3445 lrint(_Float128 __x)
3446 { return __builtin_lrintf128(__x); }
3447
3448 constexpr long
3449 lround(_Float128 __x)
3450 { return __builtin_lroundf128(__x); }
3451
3452 constexpr _Float128
3453 nearbyint(_Float128 __x)
3454 { return __builtin_nearbyintf128(__x); }
3455
3456 constexpr _Float128
3457 nextafter(_Float128 __x, _Float128 __y)
3458 { return __builtin_nextafterf128(__x, __y); }
3459
3460 constexpr _Float128
3461 remainder(_Float128 __x, _Float128 __y)
3462 { return __builtin_remainderf128(__x, __y); }
3463
3464 inline _Float128
3465 remquo(_Float128 __x, _Float128 __y, int* __pquo)
3466 { return __builtin_remquof128(__x, __y, __pquo); }
3467
3468 constexpr _Float128
3469 rint(_Float128 __x)
3470 { return __builtin_rintf128(__x); }
3471
3472 constexpr _Float128
3473 round(_Float128 __x)
3474 { return __builtin_roundf128(__x); }
3475
3476 constexpr _Float128
3477 scalbln(_Float128 __x, long __ex)
3478 { return __builtin_scalblnf128(__x, __ex); }
3479
3480 constexpr _Float128
3481 scalbn(_Float128 __x, int __ex)
3482 { return __builtin_scalbnf128(__x, __ex); }
3483
3484 constexpr _Float128
3485 tgamma(_Float128 __x)
3486 { return __builtin_tgammaf128(__x); }
3487
3488 constexpr _Float128
3489 trunc(_Float128 __x)
3490 { return __builtin_truncf128(__x); }
3491#endif
3492
3493#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
3494 constexpr __gnu_cxx::__bfloat16_t
3495 acosh(__gnu_cxx::__bfloat16_t __x)
3496 { return __gnu_cxx::__bfloat16_t(__builtin_acoshf(__x)); }
3497
3498 constexpr __gnu_cxx::__bfloat16_t
3499 asinh(__gnu_cxx::__bfloat16_t __x)
3500 { return __gnu_cxx::__bfloat16_t(__builtin_asinhf(__x)); }
3501
3502 constexpr __gnu_cxx::__bfloat16_t
3503 atanh(__gnu_cxx::__bfloat16_t __x)
3504 { return __gnu_cxx::__bfloat16_t(__builtin_atanhf(__x)); }
3505
3506 constexpr __gnu_cxx::__bfloat16_t
3507 cbrt(__gnu_cxx::__bfloat16_t __x)
3508 { return __gnu_cxx::__bfloat16_t(__builtin_cbrtf(__x)); }
3509
3510 constexpr __gnu_cxx::__bfloat16_t
3511 copysign(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
3512 { return __gnu_cxx::__bfloat16_t(__builtin_copysignf(__x, __y)); }
3513
3514 constexpr __gnu_cxx::__bfloat16_t
3515 erf(__gnu_cxx::__bfloat16_t __x)
3516 { return __gnu_cxx::__bfloat16_t(__builtin_erff(__x)); }
3517
3518 constexpr __gnu_cxx::__bfloat16_t
3519 erfc(__gnu_cxx::__bfloat16_t __x)
3520 { return __gnu_cxx::__bfloat16_t(__builtin_erfcf(__x)); }
3521
3522 constexpr __gnu_cxx::__bfloat16_t
3523 exp2(__gnu_cxx::__bfloat16_t __x)
3524 { return __gnu_cxx::__bfloat16_t(__builtin_exp2f(__x)); }
3525
3526 constexpr __gnu_cxx::__bfloat16_t
3527 expm1(__gnu_cxx::__bfloat16_t __x)
3528 { return __gnu_cxx::__bfloat16_t(__builtin_expm1f(__x)); }
3529
3530 constexpr __gnu_cxx::__bfloat16_t
3531 fdim(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
3532 { return __gnu_cxx::__bfloat16_t(__builtin_fdimf(__x, __y)); }
3533
3534 constexpr __gnu_cxx::__bfloat16_t
3535 fma(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __z)
3536 { return __gnu_cxx::__bfloat16_t(__builtin_fmaf(__x, __y, __z)); }
3537
3538 constexpr __gnu_cxx::__bfloat16_t
3539 fmax(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
3540 { return __gnu_cxx::__bfloat16_t(__builtin_fmaxf(__x, __y)); }
3541
3542 constexpr __gnu_cxx::__bfloat16_t
3543 fmin(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
3544 { return __gnu_cxx::__bfloat16_t(__builtin_fminf(__x, __y)); }
3545
3546 constexpr __gnu_cxx::__bfloat16_t
3547 hypot(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
3548 { return __gnu_cxx::__bfloat16_t(__builtin_hypotf(__x, __y)); }
3549
3550 constexpr int
3551 ilogb(__gnu_cxx::__bfloat16_t __x)
3552 { return __gnu_cxx::__bfloat16_t(__builtin_ilogbf(__x)); }
3553
3554 constexpr __gnu_cxx::__bfloat16_t
3555 lgamma(__gnu_cxx::__bfloat16_t __x)
3556 { return __gnu_cxx::__bfloat16_t(__builtin_lgammaf(__x)); }
3557
3558 constexpr long long
3559 llrint(__gnu_cxx::__bfloat16_t __x)
3560 { return __gnu_cxx::__bfloat16_t(__builtin_llrintf(__x)); }
3561
3562 constexpr long long
3563 llround(__gnu_cxx::__bfloat16_t __x)
3564 { return __gnu_cxx::__bfloat16_t(__builtin_llroundf(__x)); }
3565
3566 constexpr __gnu_cxx::__bfloat16_t
3567 log1p(__gnu_cxx::__bfloat16_t __x)
3568 { return __gnu_cxx::__bfloat16_t(__builtin_log1pf(__x)); }
3569
3570 // DR 568.
3571 constexpr __gnu_cxx::__bfloat16_t
3572 log2(__gnu_cxx::__bfloat16_t __x)
3573 { return __gnu_cxx::__bfloat16_t(__builtin_log2f(__x)); }
3574
3575 constexpr __gnu_cxx::__bfloat16_t
3576 logb(__gnu_cxx::__bfloat16_t __x)
3577 { return __gnu_cxx::__bfloat16_t(__builtin_logbf(__x)); }
3578
3579 constexpr long
3580 lrint(__gnu_cxx::__bfloat16_t __x)
3581 { return __gnu_cxx::__bfloat16_t(__builtin_lrintf(__x)); }
3582
3583 constexpr long
3584 lround(__gnu_cxx::__bfloat16_t __x)
3585 { return __gnu_cxx::__bfloat16_t(__builtin_lroundf(__x)); }
3586
3587 constexpr __gnu_cxx::__bfloat16_t
3588 nearbyint(__gnu_cxx::__bfloat16_t __x)
3589 { return __gnu_cxx::__bfloat16_t(__builtin_nearbyintf(__x)); }
3590
3591 constexpr __gnu_cxx::__bfloat16_t
3592 nextafter(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
3593 {
3594 if (std::__is_constant_evaluated())
3595 return __builtin_nextafterf16b(__x, __y);
3596#ifdef __INT16_TYPE__
3597 using __bfloat16_int_type = __INT16_TYPE__;
3598#else
3599 using __bfloat16_int_type = short int;
3600#endif
3601 __bfloat16_int_type __hx, __hy, __ix, __iy;
3602 __builtin_memcpy(&__hx, &__x, sizeof(__x));
3603 __builtin_memcpy(&__hy, &__y, sizeof(__x));
3604 __ix = __hx & 0x7fff; // |x|
3605 __iy = __hy & 0x7fff; // |y|
3606 if (__ix > 0x7f80 || __iy > 0x7f80) // x or y is NaN
3607 return __x + __y;
3608 if (__x == __y)
3609 return __y; // x == y, return y
3610 if (__ix == 0) // x == 0
3611 {
3612 __hy = (__hy & 0x8000) | 1; // return +-__BFLT16_DENORM_MIN__
3613 __builtin_memcpy(&__x, &__hy, sizeof(__x));
3614 __builtin_nextafterf(0.0f, 1.0f); // raise underflow
3615 return __x;
3616 }
3617 if (__hx >= 0) // x > 0
3618 {
3619 if (__hx > __hy) // x > y, x -= ulp
3620 --__hx;
3621 else // x < y, x += ulp
3622 ++__hx;
3623 }
3624 else // x < 0
3625 {
3626 if (__hy >= 0 || __hx > __hy) // x < y, x -= ulp
3627 --__hx;
3628 else // x > y, x += ulp
3629 ++__hx;
3630 }
3631 __hy = __hx & 0x7f80;
3632 if (__hy >= 0x7f80)
3633 __builtin_nextafterf(__FLT_MAX__, __builtin_inff()); // overflow
3634 else if (__hy < 0x0080)
3635 __builtin_nextafterf(__FLT_MIN__, 0.0f); // underflow
3636 __builtin_memcpy(&__x, &__hx, sizeof(__x));
3637 return __x;
3638 }
3639
3640 constexpr __gnu_cxx::__bfloat16_t
3641 remainder(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y)
3642 { return __gnu_cxx::__bfloat16_t(__builtin_remainderf(__x, __y)); }
3643
3644 inline __gnu_cxx::__bfloat16_t
3645 remquo(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, int* __pquo)
3646 { return __gnu_cxx::__bfloat16_t(__builtin_remquof(__x, __y, __pquo)); }
3647
3648 constexpr __gnu_cxx::__bfloat16_t
3649 rint(__gnu_cxx::__bfloat16_t __x)
3650 { return __gnu_cxx::__bfloat16_t(__builtin_rintf(__x)); }
3651
3652 constexpr __gnu_cxx::__bfloat16_t
3653 round(__gnu_cxx::__bfloat16_t __x)
3654 { return __gnu_cxx::__bfloat16_t(__builtin_roundf(__x)); }
3655
3656 constexpr __gnu_cxx::__bfloat16_t
3657 scalbln(__gnu_cxx::__bfloat16_t __x, long __ex)
3658 { return __gnu_cxx::__bfloat16_t(__builtin_scalblnf(__x, __ex)); }
3659
3660 constexpr __gnu_cxx::__bfloat16_t
3661 scalbn(__gnu_cxx::__bfloat16_t __x, int __ex)
3662 { return __gnu_cxx::__bfloat16_t(__builtin_scalbnf(__x, __ex)); }
3663
3664 constexpr __gnu_cxx::__bfloat16_t
3665 tgamma(__gnu_cxx::__bfloat16_t __x)
3666 { return __gnu_cxx::__bfloat16_t(__builtin_tgammaf(__x)); }
3667
3668 constexpr __gnu_cxx::__bfloat16_t
3669 trunc(__gnu_cxx::__bfloat16_t __x)
3670 { return __gnu_cxx::__bfloat16_t(__builtin_truncf(__x)); }
3671#endif
3672
3673#ifndef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
3674 template<typename _Tp, typename _Up>
3675 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3676 copysign(_Tp __x, _Up __y)
3677 {
3678 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3679 return copysign(__type(__x), __type(__y));
3680 }
3681
3682 template<typename _Tp, typename _Up>
3683 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3684 fdim(_Tp __x, _Up __y)
3685 {
3686 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3687 return fdim(__type(__x), __type(__y));
3688 }
3689
3690 template<typename _Tp, typename _Up>
3691 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3692 fmax(_Tp __x, _Up __y)
3693 {
3694 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3695 return fmax(__type(__x), __type(__y));
3696 }
3697
3698 template<typename _Tp, typename _Up>
3699 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3700 fmin(_Tp __x, _Up __y)
3701 {
3702 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3703 return fmin(__type(__x), __type(__y));
3704 }
3705
3706 template<typename _Tp, typename _Up>
3707 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3708 hypot(_Tp __x, _Up __y)
3709 {
3710 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3711 return hypot(__type(__x), __type(__y));
3712 }
3713
3714 template<typename _Tp, typename _Up>
3715 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3716 nextafter(_Tp __x, _Up __y)
3717 {
3718 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3719 return nextafter(__type(__x), __type(__y));
3720 }
3721
3722 template<typename _Tp, typename _Up>
3723 constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3724 remainder(_Tp __x, _Up __y)
3725 {
3726 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3727 return remainder(__type(__x), __type(__y));
3728 }
3729
3730 template<typename _Tp, typename _Up>
3731 inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
3732 remquo(_Tp __x, _Up __y, int* __pquo)
3733 {
3734 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
3735 return remquo(__type(__x), __type(__y), __pquo);
3736 }
3737
3738 template<typename _Tp, typename _Up, typename _Vp>
3739 constexpr typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
3740 fma(_Tp __x, _Up __y, _Vp __z)
3741 {
3742 typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
3743 return fma(__type(__x), __type(__y), __type(__z));
3744 }
3745#endif
3746
3747#endif // _GLIBCXX_USE_C99_MATH_FUNCS
3748#endif // C++11
3749
3750#ifdef __cpp_lib_hypot // C++ >= 17 && HOSTED
3751 // [c.math.hypot3], three-dimensional hypotenuse
3752 template<typename _Tp>
3753 inline _Tp
3754 __hypot3(_Tp __x, _Tp __y, _Tp __z)
3755 {
3756 __x = std::abs(__x);
3757 __y = std::abs(__y);
3758 __z = std::abs(__z);
3759 if (_Tp __a = __x < __y ? __y < __z ? __z : __y : __x < __z ? __z : __x)
3760 return __a * std::sqrt((__x / __a) * (__x / __a)
3761 + (__y / __a) * (__y / __a)
3762 + (__z / __a) * (__z / __a));
3763 else
3764 return {};
3765 }
3766
3767 inline float
3768 hypot(float __x, float __y, float __z)
3769 { return std::__hypot3<float>(__x, __y, __z); }
3770
3771 inline double
3772 hypot(double __x, double __y, double __z)
3773 { return std::__hypot3<double>(__x, __y, __z); }
3774
3775 inline long double
3776 hypot(long double __x, long double __y, long double __z)
3777 { return std::__hypot3<long double>(__x, __y, __z); }
3778
3779 template<typename _Tp, typename _Up, typename _Vp>
3780 __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>
3781 hypot(_Tp __x, _Up __y, _Vp __z)
3782 {
3783 using __type = __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>;
3784 return std::__hypot3<__type>(__x, __y, __z);
3785 }
3786
3787#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
3788 inline _Float16
3789 hypot(_Float16 __x, _Float16 __y, _Float16 __z)
3790 { return std::__hypot3<_Float16>(__x, __y, __z); }
3791#endif
3792
3793#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
3794 inline _Float32
3795 hypot(_Float32 __x, _Float32 __y, _Float32 __z)
3796 { return std::__hypot3<_Float32>(__x, __y, __z); }
3797#endif
3798
3799#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
3800 inline _Float64
3801 hypot(_Float64 __x, _Float64 __y, _Float64 __z)
3802 { return std::__hypot3<_Float64>(__x, __y, __z); }
3803#endif
3804
3805#if defined(__STDCPP_FLOAT128_T__) \
3806 && (defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) \
3807 || defined(_GLIBCXX_HAVE_FLOAT128_MATH))
3808 inline _Float128
3809 hypot(_Float128 __x, _Float128 __y, _Float128 __z)
3810 { return std::__hypot3<_Float128>(__x, __y, __z); }
3811#endif
3812
3813#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
3814 inline __gnu_cxx::__bfloat16_t
3815 hypot(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __z)
3816 { return std::__hypot3<__gnu_cxx::__bfloat16_t>(__x, __y, __z); }
3817#endif
3818
3819#endif // __cpp_lib_hypot
3820
3821#ifdef __cpp_lib_interpolate // C++ >= 20
3822 // linear interpolation
3823 template<typename _Fp>
3824 constexpr _Fp
3825 __lerp(_Fp __a, _Fp __b, _Fp __t) noexcept
3826 {
3827 if ((__a <= 0 && __b >= 0) || (__a >= 0 && __b <= 0))
3828 return __t * __b + (1 - __t) * __a;
3829
3830 if (__t == 1)
3831 return __b; // exact
3832
3833 // Exact at __t=0, monotonic except near __t=1,
3834 // bounded, determinate, and consistent:
3835 const _Fp __x = __a + __t * (__b - __a);
3836 return (__t > 1) == (__b > __a)
3837 ? (__b < __x ? __x : __b)
3838 : (__b > __x ? __x : __b); // monotonic near __t=1
3839 }
3840
3841 constexpr float
3842 lerp(float __a, float __b, float __t) noexcept
3843 { return std::__lerp(__a, __b, __t); }
3844
3845 constexpr double
3846 lerp(double __a, double __b, double __t) noexcept
3847 { return std::__lerp(__a, __b, __t); }
3848
3849 constexpr long double
3850 lerp(long double __a, long double __b, long double __t) noexcept
3851 { return std::__lerp(__a, __b, __t); }
3852
3853 template<typename _Tp, typename _Up, typename _Vp>
3854 constexpr __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>
3855 lerp(_Tp __x, _Up __y, _Vp __z) noexcept
3856 {
3857 using __type = __gnu_cxx::__promoted_t<_Tp, _Up, _Vp>;
3858 return std::__lerp<__type>(__x, __y, __z);
3859 }
3860
3861#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
3862 inline _Float16
3863 lerp(_Float16 __x, _Float16 __y, _Float16 __z) noexcept
3864 { return std::__lerp<_Float16>(__x, __y, __z); }
3865#endif
3866
3867#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
3868 inline _Float32
3869 lerp(_Float32 __x, _Float32 __y, _Float32 __z) noexcept
3870 { return std::__lerp<_Float32>(__x, __y, __z); }
3871#endif
3872
3873#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
3874 inline _Float64
3875 lerp(_Float64 __x, _Float64 __y, _Float64 __z) noexcept
3876 { return std::__lerp<_Float64>(__x, __y, __z); }
3877#endif
3878
3879#if defined(__STDCPP_FLOAT128_T__) \
3880 && (defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) \
3881 || defined(_GLIBCXX_HAVE_FLOAT128_MATH))
3882 inline _Float128
3883 lerp(_Float128 __x, _Float128 __y, _Float128 __z) noexcept
3884 { return std::__lerp<_Float128>(__x, __y, __z); }
3885#endif
3886
3887#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
3888 inline __gnu_cxx::__bfloat16_t
3889 lerp(__gnu_cxx::__bfloat16_t __x, __gnu_cxx::__bfloat16_t __y, __gnu_cxx::__bfloat16_t __z) noexcept
3890 { return std::__lerp<__gnu_cxx::__bfloat16_t>(__x, __y, __z); }
3891#endif
3892#endif // __cpp_lib_interpolate
3893
3894_GLIBCXX_END_NAMESPACE_VERSION
3895} // namespace
3896
3897#if _GLIBCXX_USE_STD_SPEC_FUNCS
3898# include <bits/specfun.h>
3899#endif
3900
3901} // extern "C++"
3902
3903#endif
3904