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