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