Home | History | Annotate | Download | only in tr1_impl
      1 // TR1 cmath -*- C++ -*-
      2 
      3 // Copyright (C) 2007, 2009 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 tr1_impl/cmath
     26  *  This is an internal header file, included by other library headers.
     27  *  You should not attempt to use it directly.
     28  */
     29 
     30 #if _GLIBCXX_USE_C99_MATH_TR1
     31 
     32 #undef acosh
     33 #undef acoshf
     34 #undef acoshl
     35 #undef asinh
     36 #undef asinhf
     37 #undef asinhl
     38 #undef atanh
     39 #undef atanhf
     40 #undef atanhl
     41 #undef cbrt
     42 #undef cbrtf
     43 #undef cbrtl
     44 #undef copysign
     45 #undef copysignf
     46 #undef copysignl
     47 #undef erf
     48 #undef erff
     49 #undef erfl
     50 #undef erfc
     51 #undef erfcf
     52 #undef erfcl
     53 #undef exp2
     54 #undef exp2f
     55 #undef exp2l
     56 #undef expm1
     57 #undef expm1f
     58 #undef expm1l
     59 #undef fdim
     60 #undef fdimf
     61 #undef fdiml
     62 #undef fma
     63 #undef fmaf
     64 #undef fmal
     65 #undef fmax
     66 #undef fmaxf
     67 #undef fmaxl
     68 #undef fmin
     69 #undef fminf
     70 #undef fminl
     71 #undef hypot
     72 #undef hypotf
     73 #undef hypotl
     74 #undef ilogb
     75 #undef ilogbf
     76 #undef ilogbl
     77 #undef lgamma
     78 #undef lgammaf
     79 #undef lgammal
     80 #undef llrint
     81 #undef llrintf
     82 #undef llrintl
     83 #undef llround
     84 #undef llroundf
     85 #undef llroundl
     86 #undef log1p
     87 #undef log1pf
     88 #undef log1pl
     89 #undef log2
     90 #undef log2f
     91 #undef log2l
     92 #undef logb
     93 #undef logbf
     94 #undef logbl
     95 #undef lrint
     96 #undef lrintf
     97 #undef lrintl
     98 #undef lround
     99 #undef lroundf
    100 #undef lroundl
    101 #undef nan
    102 #undef nanf
    103 #undef nanl
    104 #undef nearbyint
    105 #undef nearbyintf
    106 #undef nearbyintl
    107 #undef nextafter
    108 #undef nextafterf
    109 #undef nextafterl
    110 #undef nexttoward
    111 #undef nexttowardf
    112 #undef nexttowardl
    113 #undef remainder
    114 #undef remainderf
    115 #undef remainderl
    116 #undef remquo
    117 #undef remquof
    118 #undef remquol
    119 #undef rint
    120 #undef rintf
    121 #undef rintl
    122 #undef round
    123 #undef roundf
    124 #undef roundl
    125 #undef scalbln
    126 #undef scalblnf
    127 #undef scalblnl
    128 #undef scalbn
    129 #undef scalbnf
    130 #undef scalbnl
    131 #undef tgamma
    132 #undef tgammaf
    133 #undef tgammal
    134 #undef trunc
    135 #undef truncf
    136 #undef truncl
    137 
    138 #endif
    139 
    140 namespace std
    141 {
    142 _GLIBCXX_BEGIN_NAMESPACE_TR1
    143 
    144 #if _GLIBCXX_USE_C99_MATH_TR1
    145 
    146   // types
    147   using ::double_t;
    148   using ::float_t;
    149 
    150   // functions
    151   using ::acosh;
    152   using ::acoshf;
    153   using ::acoshl;
    154 
    155   using ::asinh;
    156   using ::asinhf;
    157   using ::asinhl;
    158 
    159   using ::atanh;
    160   using ::atanhf;
    161   using ::atanhl;
    162 
    163   using ::cbrt;
    164   using ::cbrtf;
    165   using ::cbrtl;
    166 
    167   using ::copysign;
    168   using ::copysignf;
    169   using ::copysignl;
    170 
    171   using ::erf;
    172   using ::erff;
    173   using ::erfl;
    174 
    175   using ::erfc;
    176   using ::erfcf;
    177   using ::erfcl;
    178 
    179   using ::exp2;
    180   using ::exp2f;
    181   using ::exp2l;
    182 
    183   using ::expm1;
    184   using ::expm1f;
    185   using ::expm1l;
    186 
    187   using ::fdim;
    188   using ::fdimf;
    189   using ::fdiml;
    190 
    191   using ::fma;
    192   using ::fmaf;
    193   using ::fmal;
    194 
    195   using ::fmax;
    196   using ::fmaxf;
    197   using ::fmaxl;
    198 
    199   using ::fmin;
    200   using ::fminf;
    201   using ::fminl;
    202 
    203   using ::hypot;
    204   using ::hypotf;
    205   using ::hypotl;
    206 
    207   using ::ilogb;
    208   using ::ilogbf;
    209   using ::ilogbl;
    210 
    211   using ::lgamma;
    212   using ::lgammaf;
    213   using ::lgammal;
    214 
    215   using ::llrint;
    216   using ::llrintf;
    217   using ::llrintl;
    218 
    219   using ::llround;
    220   using ::llroundf;
    221   using ::llroundl;
    222 
    223   using ::log1p;
    224   using ::log1pf;
    225   using ::log1pl;
    226 
    227   using ::log2;
    228   using ::log2f;
    229   using ::log2l;
    230 
    231   using ::logb;
    232   using ::logbf;
    233   using ::logbl;
    234 
    235   using ::lrint;
    236   using ::lrintf;
    237   using ::lrintl;
    238 
    239   using ::lround;
    240   using ::lroundf;
    241   using ::lroundl;
    242 
    243   using ::nan;
    244   using ::nanf;
    245   using ::nanl;
    246 
    247   using ::nearbyint;
    248   using ::nearbyintf;
    249   using ::nearbyintl;
    250 
    251   using ::nextafter;
    252   using ::nextafterf;
    253   using ::nextafterl;
    254 
    255   using ::nexttoward;
    256   using ::nexttowardf;
    257   using ::nexttowardl;
    258 
    259   using ::remainder;
    260   using ::remainderf;
    261   using ::remainderl;
    262 
    263   using ::remquo;
    264   using ::remquof;
    265   using ::remquol;
    266 
    267   using ::rint;
    268   using ::rintf;
    269   using ::rintl;
    270 
    271   using ::round;
    272   using ::roundf;
    273   using ::roundl;
    274 
    275   using ::scalbln;
    276   using ::scalblnf;
    277   using ::scalblnl;
    278 
    279   using ::scalbn;
    280   using ::scalbnf;
    281   using ::scalbnl;
    282 
    283   using ::tgamma;
    284   using ::tgammaf;
    285   using ::tgammal;
    286 
    287   using ::trunc;
    288   using ::truncf;
    289   using ::truncl;
    290 
    291 #endif
    292 
    293 #if _GLIBCXX_USE_C99_MATH
    294 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
    295 
    296   /// Function template definitions [8.16.3].
    297   using std::signbit;
    298   
    299   using std::fpclassify;
    300 
    301   using std::isfinite;
    302   using std::isinf;
    303   using std::isnan;
    304   using std::isnormal;
    305 
    306   using std::isgreater;
    307   using std::isgreaterequal;
    308   using std::isless;
    309   using std::islessequal;
    310   using std::islessgreater;
    311   using std::isunordered;
    312 #endif
    313 #endif
    314 
    315 #if _GLIBCXX_USE_C99_MATH_TR1
    316 
    317   /// Additional overloads [8.16.4].
    318   using std::acos;
    319 
    320   inline float
    321   acosh(float __x)
    322   { return __builtin_acoshf(__x); }
    323 
    324   inline long double
    325   acosh(long double __x)
    326   { return __builtin_acoshl(__x); }
    327 
    328   template<typename _Tp>
    329     inline typename __gnu_cxx::__promote<_Tp>::__type 
    330     acosh(_Tp __x)
    331     {
    332       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    333       return acosh(__type(__x));
    334     }
    335 
    336   using std::asin;
    337 
    338   inline float
    339   asinh(float __x)
    340   { return __builtin_asinhf(__x); }
    341 
    342   inline long double
    343   asinh(long double __x)
    344   { return __builtin_asinhl(__x); }
    345 
    346   template<typename _Tp>
    347     inline typename __gnu_cxx::__promote<_Tp>::__type 
    348     asinh(_Tp __x)
    349     {
    350       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    351       return asinh(__type(__x));
    352     }
    353 
    354   using std::atan;
    355   using std::atan2;
    356 
    357   inline float
    358   atanh(float __x)
    359   { return __builtin_atanhf(__x); }
    360 
    361   inline long double
    362   atanh(long double __x)
    363   { return __builtin_atanhl(__x); }
    364 
    365   template<typename _Tp>
    366     inline typename __gnu_cxx::__promote<_Tp>::__type 
    367     atanh(_Tp __x)
    368     {
    369       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    370       return atanh(__type(__x));
    371     }
    372 
    373   inline float
    374   cbrt(float __x)
    375   { return __builtin_cbrtf(__x); }
    376 
    377   inline long double
    378   cbrt(long double __x)
    379   { return __builtin_cbrtl(__x); }
    380 
    381   template<typename _Tp>
    382     inline typename __gnu_cxx::__promote<_Tp>::__type 
    383     cbrt(_Tp __x)
    384     {
    385       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    386       return cbrt(__type(__x));
    387     }
    388 
    389   using std::ceil;
    390 
    391   inline float
    392   copysign(float __x, float __y)
    393   { return __builtin_copysignf(__x, __y); }
    394 
    395   inline long double
    396   copysign(long double __x, long double __y)
    397   { return __builtin_copysignl(__x, __y); }
    398 
    399   template<typename _Tp, typename _Up>
    400     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    401     copysign(_Tp __x, _Up __y)
    402     {
    403       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    404       return copysign(__type(__x), __type(__y));
    405     }
    406 
    407   using std::cos;
    408   using std::cosh;  
    409 
    410   inline float
    411   erf(float __x)
    412   { return __builtin_erff(__x); }
    413 
    414   inline long double
    415   erf(long double __x)
    416   { return __builtin_erfl(__x); }
    417 
    418   template<typename _Tp>
    419     inline typename __gnu_cxx::__promote<_Tp>::__type 
    420     erf(_Tp __x)
    421     {
    422       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    423       return erf(__type(__x));
    424     }
    425 
    426   inline float
    427   erfc(float __x)
    428   { return __builtin_erfcf(__x); }
    429 
    430   inline long double
    431   erfc(long double __x)
    432   { return __builtin_erfcl(__x); }
    433 
    434   template<typename _Tp>
    435     inline typename __gnu_cxx::__promote<_Tp>::__type 
    436     erfc(_Tp __x)
    437     {
    438       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    439       return erfc(__type(__x));
    440     }
    441 
    442   using std::exp;
    443 
    444   inline float
    445   exp2(float __x)
    446   { return __builtin_exp2f(__x); }
    447 
    448   inline long double
    449   exp2(long double __x)
    450   { return __builtin_exp2l(__x); }
    451 
    452   template<typename _Tp>
    453     inline typename __gnu_cxx::__promote<_Tp>::__type 
    454     exp2(_Tp __x)
    455     {
    456       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    457       return exp2(__type(__x));
    458     }
    459 
    460   inline float
    461   expm1(float __x)
    462   { return __builtin_expm1f(__x); }
    463 
    464   inline long double
    465   expm1(long double __x)
    466   { return __builtin_expm1l(__x); }
    467 
    468   template<typename _Tp>
    469     inline typename __gnu_cxx::__promote<_Tp>::__type 
    470     expm1(_Tp __x)
    471     {
    472       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    473       return expm1(__type(__x));
    474     }
    475 
    476   using std::fabs;
    477 
    478   inline float
    479   fdim(float __x, float __y)
    480   { return __builtin_fdimf(__x, __y); }
    481 
    482   inline long double
    483   fdim(long double __x, long double __y)
    484   { return __builtin_fdiml(__x, __y); }
    485 
    486   template<typename _Tp, typename _Up>
    487     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    488     fdim(_Tp __x, _Up __y)
    489     {
    490       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    491       return fdim(__type(__x), __type(__y));
    492     }
    493 
    494   using std::floor;
    495 
    496   inline float
    497   fma(float __x, float __y, float __z)
    498   { return __builtin_fmaf(__x, __y, __z); }
    499 
    500   inline long double
    501   fma(long double __x, long double __y, long double __z)
    502   { return __builtin_fmal(__x, __y, __z); }
    503 
    504   template<typename _Tp, typename _Up, typename _Vp>
    505     inline typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type
    506     fma(_Tp __x, _Up __y, _Vp __z)
    507     {
    508       typedef typename __gnu_cxx::__promote_3<_Tp, _Up, _Vp>::__type __type;
    509       return fma(__type(__x), __type(__y), __type(__z));
    510     }
    511 
    512   inline float
    513   fmax(float __x, float __y)
    514   { return __builtin_fmaxf(__x, __y); }
    515 
    516   inline long double
    517   fmax(long double __x, long double __y)
    518   { return __builtin_fmaxl(__x, __y); }
    519 
    520   template<typename _Tp, typename _Up>
    521     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    522     fmax(_Tp __x, _Up __y)
    523     {
    524       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    525       return fmax(__type(__x), __type(__y));
    526     }
    527 
    528   inline float
    529   fmin(float __x, float __y)
    530   { return __builtin_fminf(__x, __y); }
    531 
    532   inline long double
    533   fmin(long double __x, long double __y)
    534   { return __builtin_fminl(__x, __y); }
    535 
    536   template<typename _Tp, typename _Up>
    537     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    538     fmin(_Tp __x, _Up __y)
    539     {
    540       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    541       return fmin(__type(__x), __type(__y));
    542     }
    543 
    544   using std::fmod;
    545   using std::frexp;
    546 
    547   inline float
    548   hypot(float __x, float __y)
    549   { return __builtin_hypotf(__x, __y); }
    550 
    551   inline long double
    552   hypot(long double __x, long double __y)
    553   { return __builtin_hypotl(__x, __y); }
    554 
    555   template<typename _Tp, typename _Up>
    556     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    557     hypot(_Tp __x, _Up __y)
    558     {
    559       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    560       return hypot(__type(__x), __type(__y));
    561     }
    562 
    563   inline int
    564   ilogb(float __x)
    565   { return __builtin_ilogbf(__x); }
    566 
    567   inline int
    568   ilogb(long double __x)
    569   { return __builtin_ilogbl(__x); }
    570 
    571   template<typename _Tp>
    572     inline int
    573     ilogb(_Tp __x)
    574     {
    575       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    576       return ilogb(__type(__x));
    577     }
    578 
    579   using std::ldexp;
    580 
    581   inline float
    582   lgamma(float __x)
    583   { return __builtin_lgammaf(__x); }
    584 
    585   inline long double
    586   lgamma(long double __x)
    587   { return __builtin_lgammal(__x); }
    588 
    589   template<typename _Tp>
    590     inline typename __gnu_cxx::__promote<_Tp>::__type 
    591     lgamma(_Tp __x)
    592     {
    593       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    594       return lgamma(__type(__x));
    595     }
    596 
    597   inline long long
    598   llrint(float __x)
    599   { return __builtin_llrintf(__x); }
    600 
    601   inline long long
    602   llrint(long double __x)
    603   { return __builtin_llrintl(__x); }
    604 
    605   template<typename _Tp>
    606     inline long long
    607     llrint(_Tp __x)
    608     {
    609       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    610       return llrint(__type(__x));
    611     }
    612 
    613   inline long long
    614   llround(float __x)
    615   { return __builtin_llroundf(__x); }
    616 
    617   inline long long
    618   llround(long double __x)
    619   { return __builtin_llroundl(__x); }
    620 
    621   template<typename _Tp>
    622     inline long long
    623     llround(_Tp __x)
    624     {
    625       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    626       return llround(__type(__x));
    627     }
    628 
    629   using std::log;
    630   using std::log10;
    631 
    632   inline float
    633   log1p(float __x)
    634   { return __builtin_log1pf(__x); }
    635 
    636   inline long double
    637   log1p(long double __x)
    638   { return __builtin_log1pl(__x); }
    639 
    640   template<typename _Tp>
    641     inline typename __gnu_cxx::__promote<_Tp>::__type 
    642     log1p(_Tp __x)
    643     {
    644       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    645       return log1p(__type(__x));
    646     }
    647 
    648   // DR 568.
    649   inline float
    650   log2(float __x)
    651   { return __builtin_log2f(__x); }
    652 
    653   inline long double
    654   log2(long double __x)
    655   { return __builtin_log2l(__x); }
    656 
    657   template<typename _Tp>
    658     inline typename __gnu_cxx::__promote<_Tp>::__type 
    659     log2(_Tp __x)
    660     {
    661       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    662       return log2(__type(__x));
    663     }
    664 
    665   inline float
    666   logb(float __x)
    667   { return __builtin_logbf(__x); }
    668 
    669   inline long double
    670   logb(long double __x)
    671   { return __builtin_logbl(__x); }
    672 
    673   template<typename _Tp>
    674     inline typename __gnu_cxx::__promote<_Tp>::__type 
    675     logb(_Tp __x)
    676     {
    677       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    678       return logb(__type(__x));
    679     }
    680 
    681   inline long
    682   lrint(float __x)
    683   { return __builtin_lrintf(__x); }
    684 
    685   inline long
    686   lrint(long double __x)
    687   { return __builtin_lrintl(__x); }
    688 
    689   template<typename _Tp>
    690     inline long
    691     lrint(_Tp __x)
    692     {
    693       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    694       return lrint(__type(__x));
    695     }
    696 
    697   inline long
    698   lround(float __x)
    699   { return __builtin_lroundf(__x); }
    700 
    701   inline long
    702   lround(long double __x)
    703   { return __builtin_lroundl(__x); }
    704 
    705   template<typename _Tp>
    706     inline long
    707     lround(_Tp __x)
    708     {
    709       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    710       return lround(__type(__x));
    711     }
    712 
    713   inline float
    714   nearbyint(float __x)
    715   { return __builtin_nearbyintf(__x); }
    716 
    717   inline long double
    718   nearbyint(long double __x)
    719   { return __builtin_nearbyintl(__x); }
    720 
    721   template<typename _Tp>
    722     inline typename __gnu_cxx::__promote<_Tp>::__type 
    723     nearbyint(_Tp __x)
    724     {
    725       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    726       return nearbyint(__type(__x));
    727     }
    728 
    729   inline float
    730   nextafter(float __x, float __y)
    731   { return __builtin_nextafterf(__x, __y); }
    732 
    733   inline long double
    734   nextafter(long double __x, long double __y)
    735   { return __builtin_nextafterl(__x, __y); }
    736 
    737   template<typename _Tp, typename _Up>
    738     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    739     nextafter(_Tp __x, _Up __y)
    740     {
    741       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    742       return nextafter(__type(__x), __type(__y));
    743     }
    744 
    745   inline float
    746   nexttoward(float __x, long double __y)
    747   { return __builtin_nexttowardf(__x, __y); }
    748 
    749   inline long double
    750   nexttoward(long double __x, long double __y)
    751   { return __builtin_nexttowardl(__x, __y); }
    752 
    753   template<typename _Tp>
    754     inline typename __gnu_cxx::__promote<_Tp>::__type
    755     nexttoward(_Tp __x, long double __y)
    756     {
    757       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    758       return nexttoward(__type(__x), __y);
    759     }
    760 
    761   // DR 550. What should the return type of pow(float,int) be?
    762   // NB: C++0x and TR1 != C++03.
    763   //   using std::pow;
    764 
    765   inline float
    766   remainder(float __x, float __y)
    767   { return __builtin_remainderf(__x, __y); }
    768 
    769   inline long double
    770   remainder(long double __x, long double __y)
    771   { return __builtin_remainderl(__x, __y); }
    772 
    773   template<typename _Tp, typename _Up>
    774     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    775     remainder(_Tp __x, _Up __y)
    776     {
    777       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    778       return remainder(__type(__x), __type(__y));
    779     }
    780 
    781   inline float
    782   remquo(float __x, float __y, int* __pquo)
    783   { return __builtin_remquof(__x, __y, __pquo); }
    784 
    785   inline long double
    786   remquo(long double __x, long double __y, int* __pquo)
    787   { return __builtin_remquol(__x, __y, __pquo); }
    788 
    789   template<typename _Tp, typename _Up>
    790     inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
    791     remquo(_Tp __x, _Up __y, int* __pquo)
    792     {
    793       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    794       return remquo(__type(__x), __type(__y), __pquo);
    795     }
    796 
    797   inline float
    798   rint(float __x)
    799   { return __builtin_rintf(__x); }
    800 
    801   inline long double
    802   rint(long double __x)
    803   { return __builtin_rintl(__x); }
    804 
    805   template<typename _Tp>
    806     inline typename __gnu_cxx::__promote<_Tp>::__type
    807     rint(_Tp __x)
    808     {
    809       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    810       return rint(__type(__x));
    811     }
    812 
    813   inline float
    814   round(float __x)
    815   { return __builtin_roundf(__x); }
    816 
    817   inline long double
    818   round(long double __x)
    819   { return __builtin_roundl(__x); }
    820 
    821   template<typename _Tp>
    822     inline typename __gnu_cxx::__promote<_Tp>::__type
    823     round(_Tp __x)
    824     {
    825       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    826       return round(__type(__x));
    827     }
    828 
    829   inline float
    830   scalbln(float __x, long __ex)
    831   { return __builtin_scalblnf(__x, __ex); }
    832 
    833   inline long double
    834   scalbln(long double __x, long __ex)
    835   { return __builtin_scalblnl(__x, __ex); }
    836 
    837   template<typename _Tp>
    838     inline typename __gnu_cxx::__promote<_Tp>::__type 
    839     scalbln(_Tp __x, long __ex)
    840     {
    841       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    842       return scalbln(__type(__x), __ex);
    843     }
    844  
    845   inline float
    846   scalbn(float __x, int __ex)
    847   { return __builtin_scalbnf(__x, __ex); }
    848 
    849   inline long double
    850   scalbn(long double __x, int __ex)
    851   { return __builtin_scalbnl(__x, __ex); }
    852 
    853   template<typename _Tp>
    854     inline typename __gnu_cxx::__promote<_Tp>::__type 
    855     scalbn(_Tp __x, int __ex)
    856     {
    857       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    858       return scalbn(__type(__x), __ex);
    859     }
    860 
    861   using std::sin;
    862   using std::sinh;
    863   using std::sqrt;
    864   using std::tan;
    865   using std::tanh;
    866 
    867   inline float
    868   tgamma(float __x)
    869   { return __builtin_tgammaf(__x); }
    870 
    871   inline long double
    872   tgamma(long double __x)
    873   { return __builtin_tgammal(__x); }
    874 
    875   template<typename _Tp>
    876     inline typename __gnu_cxx::__promote<_Tp>::__type 
    877     tgamma(_Tp __x)
    878     {
    879       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    880       return tgamma(__type(__x));
    881     }
    882  
    883   inline float
    884   trunc(float __x)
    885   { return __builtin_truncf(__x); }
    886 
    887   inline long double
    888   trunc(long double __x)
    889   { return __builtin_truncl(__x); }
    890 
    891   template<typename _Tp>
    892     inline typename __gnu_cxx::__promote<_Tp>::__type 
    893     trunc(_Tp __x)
    894     {
    895       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    896       return trunc(__type(__x));
    897     }
    898 
    899 #endif
    900 
    901 _GLIBCXX_END_NAMESPACE_TR1
    902 }
    903