LCOV - code coverage report
Current view: top level - /usr/include/c++/13 - cmath (source / functions) Coverage Total Hit
Test: coverage.info Lines: 66.7 % 6 4
Test Date: 2024-04-30 13:17:26 Functions: 66.7 % 3 2

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

Generated by: LCOV version 2.0-1