1 |
424 |
jeremybenn |
// Special functions -*- C++ -*-
|
2 |
|
|
|
3 |
|
|
// Copyright (C) 2006, 2009
|
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 |
|
|
* You should not attempt to use it directly.
|
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
|
41 |
|
|
{
|
42 |
|
|
namespace tr1
|
43 |
|
|
{
|
44 |
|
|
|
45 |
|
|
namespace __detail
|
46 |
|
|
{
|
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 |
|
|
} // namespace __detail
|
139 |
|
|
|
140 |
|
|
}
|
141 |
|
|
}
|
142 |
|
|
|
143 |
|
|
#endif // _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H
|
144 |
|
|
|