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