Home | History | Annotate | Download | only in tr1
      1 // Special functions -*- C++ -*-
      2 
      3 // Copyright (C) 2006, 2009, 2010
      4 // Free Software Foundation, Inc.
      5 //
      6 // This file is part of the GNU ISO C++ Library.  This library is free
      7 // software; you can redistribute it and/or modify it under the
      8 // terms of the GNU General Public License as published by the
      9 // Free Software Foundation; either version 3, or (at your option)
     10 // any later version.
     11 
     12 // This library is distributed in the hope that it will be useful,
     13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 // GNU General Public License for more details.
     16 
     17 // Under Section 7 of GPL version 3, you are granted additional
     18 // permissions described in the GCC Runtime Library Exception, version
     19 // 3.1, as published by the Free Software Foundation.
     20 
     21 // You should have received a copy of the GNU General Public License and
     22 // a copy of the GCC Runtime Library Exception along with this program;
     23 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24 // <http://www.gnu.org/licenses/>.
     25 
     26 /** @file tr1/special_function_util.h
     27  *  This is an internal header file, included by other library headers.
     28  *  Do not attempt to use it directly. @headername{tr1/cmath}
     29  */
     30 
     31 //
     32 // ISO C++ 14882 TR1: 5.2  Special functions
     33 //
     34 
     35 // Written by Edward Smith-Rowland based on numerous mathematics books.
     36 
     37 #ifndef _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H
     38 #define _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H 1
     39 
     40 namespace std _GLIBCXX_VISIBILITY(default)
     41 {
     42 namespace tr1
     43 {
     44   namespace __detail
     45   {
     46   _GLIBCXX_BEGIN_NAMESPACE_VERSION
     47 
     48     /// A class to encapsulate type dependent floating point
     49     /// constants.  Not everything will be able to be expressed as
     50     /// type logic.
     51     template<typename _Tp>
     52     struct __floating_point_constant
     53     {
     54       static const _Tp __value;
     55     };
     56 
     57 
     58     /// A structure for numeric constants.
     59     template<typename _Tp>
     60       struct __numeric_constants
     61       {
     62         ///  Constant @f$ \pi @f$.
     63         static _Tp __pi() throw()
     64         { return static_cast<_Tp>(3.1415926535897932384626433832795029L); }
     65         ///  Constant @f$ \pi / 2 @f$.
     66         static _Tp __pi_2() throw()
     67         { return static_cast<_Tp>(1.5707963267948966192313216916397514L); }
     68         ///  Constant @f$ \pi / 3 @f$.
     69         static _Tp __pi_3() throw()
     70         { return static_cast<_Tp>(1.0471975511965977461542144610931676L); }
     71         ///  Constant @f$ \pi / 4 @f$.
     72         static _Tp __pi_4() throw()
     73         { return static_cast<_Tp>(0.7853981633974483096156608458198757L); }
     74         ///  Constant @f$ 1 / \pi @f$.
     75         static _Tp __1_pi() throw()
     76         { return static_cast<_Tp>(0.3183098861837906715377675267450287L); }
     77         ///  Constant @f$ 2 / \sqrt(\pi) @f$.
     78         static _Tp __2_sqrtpi() throw()
     79         { return static_cast<_Tp>(1.1283791670955125738961589031215452L); }
     80         ///  Constant @f$ \sqrt(2) @f$.
     81         static _Tp __sqrt2() throw()
     82         { return static_cast<_Tp>(1.4142135623730950488016887242096981L); }
     83         ///  Constant @f$ \sqrt(3) @f$.
     84         static _Tp __sqrt3() throw()
     85         { return static_cast<_Tp>(1.7320508075688772935274463415058723L); }
     86         ///  Constant @f$ \sqrt(\pi/2) @f$.
     87         static _Tp __sqrtpio2() throw()
     88         { return static_cast<_Tp>(1.2533141373155002512078826424055226L); }
     89         ///  Constant @f$ 1 / sqrt(2) @f$.
     90         static _Tp __sqrt1_2() throw()
     91         { return static_cast<_Tp>(0.7071067811865475244008443621048490L); }
     92         ///  Constant @f$ \log(\pi) @f$.
     93         static _Tp __lnpi() throw()
     94         { return static_cast<_Tp>(1.1447298858494001741434273513530587L); }
     95         ///  Constant Euler's constant @f$ \gamma_E @f$.
     96         static _Tp __gamma_e() throw()
     97         { return static_cast<_Tp>(0.5772156649015328606065120900824024L); }
     98         ///  Constant Euler-Mascheroni @f$ e @f$
     99         static _Tp __euler() throw()
    100         { return static_cast<_Tp>(2.7182818284590452353602874713526625L); }
    101       };
    102 
    103 
    104 #if _GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
    105 
    106     /// This is a wrapper for the isnan function. Otherwise, for NaN,
    107     /// all comparisons result in false. If/when we build a std::isnan
    108     /// out of intrinsics, this will disappear completely in favor of
    109     /// std::isnan.
    110     template<typename _Tp>
    111     inline bool __isnan(const _Tp __x)
    112     {
    113       return std::isnan(__x);
    114     }
    115 
    116 #else
    117 
    118     template<typename _Tp>
    119     inline bool __isnan(const _Tp __x)
    120     {
    121       return __builtin_isnan(__x);
    122     }
    123 
    124     template<>
    125     inline bool __isnan<float>(const float __x)
    126     {
    127       return __builtin_isnanf(__x);
    128     }
    129 
    130     template<>
    131     inline bool __isnan<long double>(const long double __x)
    132     {
    133       return __builtin_isnanl(__x);
    134     }
    135 
    136 #endif
    137 
    138   _GLIBCXX_END_NAMESPACE_VERSION
    139   } // namespace __detail
    140 }
    141 }
    142 
    143 #endif // _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H
    144 
    145