Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6554 serge 1
// Special functions -*- C++ -*-
2
 
3
// Copyright (C) 2006-2015 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
// .
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
51
    struct __floating_point_constant
52
    {
53
      static const _Tp __value;
54
    };
55
 
56
 
57
    /// A structure for numeric constants.
58
    template
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
110
    inline bool __isnan(_Tp __x)
111
    { return std::isnan(__x); }
112
 
113
#else
114
 
115
    template
116
    inline bool __isnan(const _Tp __x)
117
    { return __builtin_isnan(__x); }
118
 
119
    template<>
120
    inline bool __isnan(float __x)
121
    { return __builtin_isnanf(__x); }
122
 
123
    template<>
124
    inline bool __isnan(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