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