Home | History | Annotate | Download | only in tr1
      1 // Special functions -*- C++ -*-
      2 
      3 // Copyright (C) 2006-2013 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/special_function_util.h
     26  *  This is an internal header file, included by other library headers.
     27  *  Do not attempt to use it directly. @headername{tr1/cmath}
     28  */
     29 
     30 //
     31 // ISO C++ 14882 TR1: 5.2  Special functions
     32 //
     33 
     34 // Written by Edward Smith-Rowland based on numerous mathematics books.
     35 
     36 #ifndef _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H
     37 #define _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H 1
     38 
     39 namespace std _GLIBCXX_VISIBILITY(default)
     40 {
     41 namespace tr1
     42 {
     43   namespace __detail
     44   {
     45   _GLIBCXX_BEGIN_NAMESPACE_VERSION
     46 
     47     /// A class to encapsulate type dependent floating point
     48     /// constants.  Not everything will be able to be expressed as
     49     /// type logic.
     50     template<typename _Tp>
     51     struct __floating_point_constant
     52     {
     53       static const _Tp __value;
     54     };
     55 
     56 
     57     /// A structure for numeric constants.
     58     template<typename _Tp>
     59       struct __numeric_constants
     60       {
     61         ///  Constant @f$ \pi @f$.
     62         static _Tp __pi() throw()
     63         { return static_cast<_Tp>(3.1415926535897932384626433832795029L); }
     64         ///  Constant @f$ \pi / 2 @f$.
     65         static _Tp __pi_2() throw()
     66         { return static_cast<_Tp>(1.5707963267948966192313216916397514L); }
     67         ///  Constant @f$ \pi / 3 @f$.
     68         static _Tp __pi_3() throw()
     69         { return static_cast<_Tp>(1.0471975511965977461542144610931676L); }
     70         ///  Constant @f$ \pi / 4 @f$.
     71         static _Tp __pi_4() throw()
     72         { return static_cast<_Tp>(0.7853981633974483096156608458198757L); }
     73         ///  Constant @f$ 1 / \pi @f$.
     74         static _Tp __1_pi() throw()
     75         { return static_cast<_Tp>(0.3183098861837906715377675267450287L); }
     76         ///  Constant @f$ 2 / \sqrt(\pi) @f$.
     77         static _Tp __2_sqrtpi() throw()
     78         { return static_cast<_Tp>(1.1283791670955125738961589031215452L); }
     79         ///  Constant @f$ \sqrt(2) @f$.
     80         static _Tp __sqrt2() throw()
     81         { return static_cast<_Tp>(1.4142135623730950488016887242096981L); }
     82         ///  Constant @f$ \sqrt(3) @f$.
     83         static _Tp __sqrt3() throw()
     84         { return static_cast<_Tp>(1.7320508075688772935274463415058723L); }
     85         ///  Constant @f$ \sqrt(\pi/2) @f$.
     86         static _Tp __sqrtpio2() throw()
     87         { return static_cast<_Tp>(1.2533141373155002512078826424055226L); }
     88         ///  Constant @f$ 1 / sqrt(2) @f$.
     89         static _Tp __sqrt1_2() throw()
     90         { return static_cast<_Tp>(0.7071067811865475244008443621048490L); }
     91         ///  Constant @f$ \log(\pi) @f$.
     92         static _Tp __lnpi() throw()
     93         { return static_cast<_Tp>(1.1447298858494001741434273513530587L); }
     94         ///  Constant Euler's constant @f$ \gamma_E @f$.
     95         static _Tp __gamma_e() throw()
     96         { return static_cast<_Tp>(0.5772156649015328606065120900824024L); }
     97         ///  Constant Euler-Mascheroni @f$ e @f$
     98         static _Tp __euler() throw()
     99         { return static_cast<_Tp>(2.7182818284590452353602874713526625L); }
    100       };
    101 
    102 
    103 #if _GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
    104 
    105     /// This is a wrapper for the isnan function. Otherwise, for NaN,
    106     /// all comparisons result in false. If/when we build a std::isnan
    107     /// out of intrinsics, this will disappear completely in favor of
    108     /// std::isnan.
    109     template<typename _Tp>
    110     inline bool __isnan(_Tp __x)
    111     { return std::isnan(__x); }
    112 
    113 #else
    114 
    115     template<typename _Tp>
    116     inline bool __isnan(const _Tp __x)
    117     { return __builtin_isnan(__x); }
    118 
    119     template<>
    120     inline bool __isnan<float>(float __x)
    121     { return __builtin_isnanf(__x); }
    122 
    123     template<>
    124     inline bool __isnan<long double>(long double __x)
    125     { return __builtin_isnanl(__x); }
    126 
    127 #endif
    128 
    129   _GLIBCXX_END_NAMESPACE_VERSION
    130   } // namespace __detail
    131 }
    132 }
    133 
    134 #endif // _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H
    135 
    136