Home | History | Annotate | Download | only in include
      1 // -*- C++ -*- C forwarding header.
      2 
      3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
      4 // 2006, 2007, 2008, 2009
      5 // Free Software Foundation, Inc.
      6 //
      7 // This file is part of the GNU ISO C++ Library.  This library is free
      8 // software; you can redistribute it and/or modify it under the
      9 // terms of the GNU General Public License as published by the
     10 // Free Software Foundation; either version 3, or (at your option)
     11 // any later version.
     12 
     13 // This library is distributed in the hope that it will be useful,
     14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 // GNU General Public License for more details.
     17 
     18 // Under Section 7 of GPL version 3, you are granted additional
     19 // permissions described in the GCC Runtime Library Exception, version
     20 // 3.1, as published by the Free Software Foundation.
     21 
     22 // You should have received a copy of the GNU General Public License and
     23 // a copy of the GCC Runtime Library Exception along with this program;
     24 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     25 // <http://www.gnu.org/licenses/>.
     26 
     27 /** @file include/cmath
     28  *  This is a Standard C++ Library file.  You should @c #include this file
     29  *  in your programs, rather than any of the "*.h" implementation files.
     30  *
     31  *  This is the C++ version of the Standard C Library header @c math.h,
     32  *  and its contents are (mostly) the same as that header, but are all
     33  *  contained in the namespace @c std (except for names which are defined
     34  *  as macros in C).
     35  */
     36 
     37 //
     38 // ISO C++ 14882: 26.5  C library
     39 //
     40 
     41 #pragma GCC system_header
     42 
     43 #include <bits/c++config.h>
     44 #include <bits/cpp_type_traits.h>
     45 #include <ext/type_traits.h>
     46 #include <math.h>
     47 
     48 #ifndef _GLIBCXX_CMATH
     49 #define _GLIBCXX_CMATH 1
     50 
     51 // Get rid of those macros defined in <math.h> in lieu of real functions.
     52 #undef abs
     53 #undef div
     54 #undef acos
     55 #undef asin
     56 #undef atan
     57 #undef atan2
     58 #undef ceil
     59 #undef cos
     60 #undef cosh
     61 #undef exp
     62 #undef fabs
     63 #undef floor
     64 #undef fmod
     65 #undef frexp
     66 #undef ldexp
     67 #undef log
     68 #undef log10
     69 #undef modf
     70 #undef pow
     71 #undef sin
     72 #undef sinh
     73 #undef sqrt
     74 #undef tan
     75 #undef tanh
     76 
     77 _GLIBCXX_BEGIN_NAMESPACE(std)
     78 
     79   // Forward declaration of a helper function.  This really should be
     80   // an `exported' forward declaration.
     81   template<typename _Tp>
     82     _Tp __cmath_power(_Tp, unsigned int);
     83 
     84   template<typename _Tp>
     85     inline _Tp
     86     __pow_helper(_Tp __x, int __n)
     87     {
     88       return __n < 0
     89         ? _Tp(1)/__cmath_power(__x, -__n)
     90         : __cmath_power(__x, __n);
     91     }
     92 
     93   inline double
     94   abs(double __x)
     95   { return __builtin_fabs(__x); }
     96 
     97   inline float
     98   abs(float __x)
     99   { return __builtin_fabsf(__x); }
    100 
    101   inline long double
    102   abs(long double __x)
    103   { return __builtin_fabsl(__x); }
    104 
    105   using ::acos;
    106 
    107   inline float
    108   acos(float __x)
    109   { return __builtin_acosf(__x); }
    110 
    111   inline long double
    112   acos(long double __x)
    113   { return __builtin_acosl(__x); }
    114 
    115   template<typename _Tp>
    116     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    117 					   double>::__type
    118     acos(_Tp __x)
    119     { return __builtin_acos(__x); }
    120 
    121   using ::asin;
    122 
    123   inline float
    124   asin(float __x)
    125   { return __builtin_asinf(__x); }
    126 
    127   inline long double
    128   asin(long double __x)
    129   { return __builtin_asinl(__x); }
    130 
    131   template<typename _Tp>
    132     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
    133 					   double>::__type
    134     asin(_Tp __x)
    135     { return __builtin_asin(__x); }
    136 
    137   using ::atan;
    138 
    139   inline float
    140   atan(float __x)
    141   { return __builtin_atanf(__x); }
    142 
    143   inline long double
    144   atan(long double __x)
    145   { return __builtin_atanl(__x); }
    146 
    147   template<typename _Tp>
    148     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    149 					   double>::__type
    150     atan(_Tp __x)
    151     { return __builtin_atan(__x); }
    152 
    153   using ::atan2;
    154 
    155   inline float
    156   atan2(float __y, float __x)
    157   { return __builtin_atan2f(__y, __x); }
    158 
    159   inline long double
    160   atan2(long double __y, long double __x)
    161   { return __builtin_atan2l(__y, __x); }
    162 
    163   template<typename _Tp, typename _Up>
    164     inline
    165     typename __gnu_cxx::__promote_2<
    166     typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
    167 				    && __is_arithmetic<_Up>::__value,
    168 				    _Tp>::__type, _Up>::__type
    169     atan2(_Tp __y, _Up __x)
    170     {
    171       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    172       return atan2(__type(__y), __type(__x));
    173     }
    174 
    175   using ::ceil;
    176 
    177   inline float
    178   ceil(float __x)
    179   { return __builtin_ceilf(__x); }
    180 
    181   inline long double
    182   ceil(long double __x)
    183   { return __builtin_ceill(__x); }
    184 
    185   template<typename _Tp>
    186     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    187 					   double>::__type
    188     ceil(_Tp __x)
    189     { return __builtin_ceil(__x); }
    190 
    191   using ::cos;
    192 
    193   inline float
    194   cos(float __x)
    195   { return __builtin_cosf(__x); }
    196 
    197   inline long double
    198   cos(long double __x)
    199   { return __builtin_cosl(__x); }
    200 
    201   template<typename _Tp>
    202     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    203 					   double>::__type
    204     cos(_Tp __x)
    205     { return __builtin_cos(__x); }
    206 
    207   using ::cosh;
    208 
    209   inline float
    210   cosh(float __x)
    211   { return __builtin_coshf(__x); }
    212 
    213   inline long double
    214   cosh(long double __x)
    215   { return __builtin_coshl(__x); }
    216 
    217   template<typename _Tp>
    218     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    219 					   double>::__type
    220     cosh(_Tp __x)
    221     { return __builtin_cosh(__x); }
    222 
    223   using ::exp;
    224 
    225   inline float
    226   exp(float __x)
    227   { return __builtin_expf(__x); }
    228 
    229   inline long double
    230   exp(long double __x)
    231   { return __builtin_expl(__x); }
    232 
    233   template<typename _Tp>
    234     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    235 					   double>::__type
    236     exp(_Tp __x)
    237     { return __builtin_exp(__x); }
    238 
    239   using ::fabs;
    240 
    241   inline float
    242   fabs(float __x)
    243   { return __builtin_fabsf(__x); }
    244 
    245   inline long double
    246   fabs(long double __x)
    247   { return __builtin_fabsl(__x); }
    248 
    249   template<typename _Tp>
    250     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    251 					   double>::__type
    252     fabs(_Tp __x)
    253     { return __builtin_fabs(__x); }
    254 
    255   using ::floor;
    256 
    257   inline float
    258   floor(float __x)
    259   { return __builtin_floorf(__x); }
    260 
    261   inline long double
    262   floor(long double __x)
    263   { return __builtin_floorl(__x); }
    264 
    265   template<typename _Tp>
    266     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    267 					   double>::__type
    268     floor(_Tp __x)
    269     { return __builtin_floor(__x); }
    270 
    271   using ::fmod;
    272 
    273   inline float
    274   fmod(float __x, float __y)
    275   { return __builtin_fmodf(__x, __y); }
    276 
    277   inline long double
    278   fmod(long double __x, long double __y)
    279   { return __builtin_fmodl(__x, __y); }
    280 
    281   using ::frexp;
    282 
    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 
    291   template<typename _Tp>
    292     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    293 					   double>::__type
    294     frexp(_Tp __x, int* __exp)
    295     { return __builtin_frexp(__x, __exp); }
    296 
    297   using ::ldexp;
    298 
    299   inline float
    300   ldexp(float __x, int __exp)
    301   { return __builtin_ldexpf(__x, __exp); }
    302 
    303   inline long double
    304   ldexp(long double __x, int __exp)
    305   { return __builtin_ldexpl(__x, __exp); }
    306 
    307   template<typename _Tp>
    308     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    309 					   double>::__type
    310   ldexp(_Tp __x, int __exp)
    311   { return __builtin_ldexp(__x, __exp); }
    312 
    313   using ::log;
    314 
    315   inline float
    316   log(float __x)
    317   { return __builtin_logf(__x); }
    318 
    319   inline long double
    320   log(long double __x)
    321   { return __builtin_logl(__x); }
    322 
    323   template<typename _Tp>
    324     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    325 					   double>::__type
    326     log(_Tp __x)
    327     { return __builtin_log(__x); }
    328 
    329   using ::log10;
    330 
    331   inline float
    332   log10(float __x)
    333   { return __builtin_log10f(__x); }
    334 
    335   inline long double
    336   log10(long double __x)
    337   { return __builtin_log10l(__x); }
    338 
    339   template<typename _Tp>
    340     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    341 					   double>::__type
    342     log10(_Tp __x)
    343     { return __builtin_log10(__x); }
    344 
    345   using ::modf;
    346 
    347   inline float
    348   modf(float __x, float* __iptr)
    349   { return __builtin_modff(__x, __iptr); }
    350 
    351   inline long double
    352   modf(long double __x, long double* __iptr)
    353   { return __builtin_modfl(__x, __iptr); }
    354 
    355   using ::pow;
    356 
    357   inline float
    358   pow(float __x, float __y)
    359   { return __builtin_powf(__x, __y); }
    360 
    361   inline long double
    362   pow(long double __x, long double __y)
    363   { return __builtin_powl(__x, __y); }
    364 
    365 #ifndef __GXX_EXPERIMENTAL_CXX0X__
    366   // _GLIBCXX_RESOLVE_LIB_DEFECTS
    367   // DR 550. What should the return type of pow(float,int) be?
    368   inline double
    369   pow(double __x, int __i)
    370   { return __builtin_powi(__x, __i); }
    371 
    372   inline float
    373   pow(float __x, int __n)
    374   { return __builtin_powif(__x, __n); }
    375 
    376   inline long double
    377   pow(long double __x, int __n)
    378   { return __builtin_powil(__x, __n); }
    379 #endif
    380 
    381   template<typename _Tp, typename _Up>
    382     inline
    383     typename __gnu_cxx::__promote_2<
    384     typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
    385 				    && __is_arithmetic<_Up>::__value,
    386 				    _Tp>::__type, _Up>::__type
    387     pow(_Tp __x, _Up __y)
    388     {
    389       typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
    390       return pow(__type(__x), __type(__y));
    391     }
    392 
    393   using ::sin;
    394 
    395   inline float
    396   sin(float __x)
    397   { return __builtin_sinf(__x); }
    398 
    399   inline long double
    400   sin(long double __x)
    401   { return __builtin_sinl(__x); }
    402 
    403   template<typename _Tp>
    404     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    405 					   double>::__type
    406     sin(_Tp __x)
    407     { return __builtin_sin(__x); }
    408 
    409   using ::sinh;
    410 
    411   inline float
    412   sinh(float __x)
    413   { return __builtin_sinhf(__x); }
    414 
    415   inline long double
    416   sinh(long double __x)
    417   { return __builtin_sinhl(__x); }
    418 
    419   template<typename _Tp>
    420     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    421 					   double>::__type
    422     sinh(_Tp __x)
    423     { return __builtin_sinh(__x); }
    424 
    425   using ::sqrt;
    426 
    427   inline float
    428   sqrt(float __x)
    429   { return __builtin_sqrtf(__x); }
    430 
    431   inline long double
    432   sqrt(long double __x)
    433   { return __builtin_sqrtl(__x); }
    434 
    435   template<typename _Tp>
    436     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    437 					   double>::__type
    438     sqrt(_Tp __x)
    439     { return __builtin_sqrt(__x); }
    440 
    441   using ::tan;
    442 
    443   inline float
    444   tan(float __x)
    445   { return __builtin_tanf(__x); }
    446 
    447   inline long double
    448   tan(long double __x)
    449   { return __builtin_tanl(__x); }
    450 
    451   template<typename _Tp>
    452     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    453 					   double>::__type
    454     tan(_Tp __x)
    455     { return __builtin_tan(__x); }
    456 
    457   using ::tanh;
    458 
    459   inline float
    460   tanh(float __x)
    461   { return __builtin_tanhf(__x); }
    462 
    463   inline long double
    464   tanh(long double __x)
    465   { return __builtin_tanhl(__x); }
    466 
    467   template<typename _Tp>
    468     inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, 
    469 					   double>::__type
    470     tanh(_Tp __x)
    471     { return __builtin_tanh(__x); }
    472 
    473 _GLIBCXX_END_NAMESPACE
    474 
    475 #if _GLIBCXX_USE_C99_MATH
    476 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
    477 
    478 // These are possible macros imported from C99-land.
    479 #undef fpclassify
    480 #undef isfinite
    481 #undef isinf
    482 #undef isnan
    483 #undef isnormal
    484 #undef signbit
    485 #undef isgreater
    486 #undef isgreaterequal
    487 #undef isless
    488 #undef islessequal
    489 #undef islessgreater
    490 #undef isunordered
    491 
    492 _GLIBCXX_BEGIN_NAMESPACE(std)
    493 
    494   template<typename _Tp>
    495     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    496 					   int>::__type
    497     fpclassify(_Tp __f)
    498     {
    499       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    500       return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
    501 				  FP_SUBNORMAL, FP_ZERO, __type(__f));
    502     }
    503 
    504   template<typename _Tp>
    505     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    506 					   int>::__type
    507     isfinite(_Tp __f)
    508     {
    509       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    510       return __builtin_isfinite(__type(__f));
    511     }
    512 
    513   template<typename _Tp>
    514     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    515 					   int>::__type
    516     isinf(_Tp __f)
    517     {
    518       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    519       return __builtin_isinf(__type(__f));
    520     }
    521 
    522   template<typename _Tp>
    523     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    524 					   int>::__type
    525     isnan(_Tp __f)
    526     {
    527       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    528       return __builtin_isnan(__type(__f));
    529     }
    530 
    531   template<typename _Tp>
    532     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    533 					   int>::__type
    534     isnormal(_Tp __f)
    535     {
    536       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    537       return __builtin_isnormal(__type(__f));
    538     }
    539 
    540   template<typename _Tp>
    541     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    542 					   int>::__type
    543     signbit(_Tp __f)
    544     {
    545       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    546       return __builtin_signbit(__type(__f));
    547     }
    548 
    549   template<typename _Tp>
    550     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    551 					   int>::__type
    552     isgreater(_Tp __f1, _Tp __f2)
    553     {
    554       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    555       return __builtin_isgreater(__type(__f1), __type(__f2));
    556     }
    557 
    558   template<typename _Tp>
    559     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    560 					   int>::__type
    561     isgreaterequal(_Tp __f1, _Tp __f2)
    562     {
    563       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    564       return __builtin_isgreaterequal(__type(__f1), __type(__f2));
    565     }
    566 
    567   template<typename _Tp>
    568     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    569 					   int>::__type
    570     isless(_Tp __f1, _Tp __f2)
    571     {
    572       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    573       return __builtin_isless(__type(__f1), __type(__f2));
    574     }
    575 
    576   template<typename _Tp>
    577     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    578 					   int>::__type
    579     islessequal(_Tp __f1, _Tp __f2)
    580     {
    581       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    582       return __builtin_islessequal(__type(__f1), __type(__f2));
    583     }
    584 
    585   template<typename _Tp>
    586     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    587 					   int>::__type
    588     islessgreater(_Tp __f1, _Tp __f2)
    589     {
    590       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    591       return __builtin_islessgreater(__type(__f1), __type(__f2));
    592     }
    593 
    594   template<typename _Tp>
    595     inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
    596 					   int>::__type
    597     isunordered(_Tp __f1, _Tp __f2)
    598     {
    599       typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
    600       return __builtin_isunordered(__type(__f1), __type(__f2));
    601     }
    602 
    603 _GLIBCXX_END_NAMESPACE
    604 
    605 #endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
    606 #endif
    607 
    608 #ifndef _GLIBCXX_EXPORT_TEMPLATE
    609 # include <bits/cmath.tcc>
    610 #endif
    611 
    612 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    613 #  if defined(_GLIBCXX_INCLUDE_AS_TR1)
    614 #    error C++0x header cannot be included from TR1 header
    615 #  endif
    616 #  if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
    617 #    include <tr1_impl/cmath>
    618 #  else
    619 #    define _GLIBCXX_INCLUDE_AS_CXX0X
    620 #    define _GLIBCXX_BEGIN_NAMESPACE_TR1
    621 #    define _GLIBCXX_END_NAMESPACE_TR1
    622 #    define _GLIBCXX_TR1
    623 #    include <tr1_impl/cmath>
    624 #    undef _GLIBCXX_TR1
    625 #    undef _GLIBCXX_END_NAMESPACE_TR1
    626 #    undef _GLIBCXX_BEGIN_NAMESPACE_TR1
    627 #    undef _GLIBCXX_INCLUDE_AS_CXX0X
    628 #  endif
    629 #endif
    630 
    631 #endif
    632