Chris@49
|
1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2012 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup constants
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 namespace priv
|
Chris@49
|
14 {
|
Chris@49
|
15 class Datum_helper
|
Chris@49
|
16 {
|
Chris@49
|
17 public:
|
Chris@49
|
18
|
Chris@49
|
19 template<typename eT>
|
Chris@49
|
20 static
|
Chris@49
|
21 typename arma_real_only<eT>::result
|
Chris@49
|
22 nan(typename arma_real_only<eT>::result* junk = 0)
|
Chris@49
|
23 {
|
Chris@49
|
24 arma_ignore(junk);
|
Chris@49
|
25
|
Chris@49
|
26 if(std::numeric_limits<eT>::has_quiet_NaN == true)
|
Chris@49
|
27 {
|
Chris@49
|
28 return std::numeric_limits<eT>::quiet_NaN();
|
Chris@49
|
29 }
|
Chris@49
|
30 else
|
Chris@49
|
31 {
|
Chris@49
|
32 return eT(0);
|
Chris@49
|
33 }
|
Chris@49
|
34 }
|
Chris@49
|
35
|
Chris@49
|
36
|
Chris@49
|
37 template<typename eT>
|
Chris@49
|
38 static
|
Chris@49
|
39 typename arma_cx_only<eT>::result
|
Chris@49
|
40 nan(typename arma_cx_only<eT>::result* junk = 0)
|
Chris@49
|
41 {
|
Chris@49
|
42 arma_ignore(junk);
|
Chris@49
|
43
|
Chris@49
|
44 typedef typename get_pod_type<eT>::result T;
|
Chris@49
|
45
|
Chris@49
|
46 return eT( Datum_helper::nan<T>(), Datum_helper::nan<T>() );
|
Chris@49
|
47 }
|
Chris@49
|
48
|
Chris@49
|
49
|
Chris@49
|
50 template<typename eT>
|
Chris@49
|
51 static
|
Chris@49
|
52 typename arma_integral_only<eT>::result
|
Chris@49
|
53 nan(typename arma_integral_only<eT>::result* junk = 0)
|
Chris@49
|
54 {
|
Chris@49
|
55 arma_ignore(junk);
|
Chris@49
|
56
|
Chris@49
|
57 return eT(0);
|
Chris@49
|
58 }
|
Chris@49
|
59
|
Chris@49
|
60
|
Chris@49
|
61 template<typename eT>
|
Chris@49
|
62 static
|
Chris@49
|
63 typename arma_real_only<eT>::result
|
Chris@49
|
64 inf(typename arma_real_only<eT>::result* junk = 0)
|
Chris@49
|
65 {
|
Chris@49
|
66 arma_ignore(junk);
|
Chris@49
|
67
|
Chris@49
|
68 if(std::numeric_limits<eT>::has_infinity == true)
|
Chris@49
|
69 {
|
Chris@49
|
70 return std::numeric_limits<eT>::infinity();
|
Chris@49
|
71 }
|
Chris@49
|
72 else
|
Chris@49
|
73 {
|
Chris@49
|
74 return std::numeric_limits<eT>::max();
|
Chris@49
|
75 }
|
Chris@49
|
76 }
|
Chris@49
|
77
|
Chris@49
|
78
|
Chris@49
|
79 template<typename eT>
|
Chris@49
|
80 static
|
Chris@49
|
81 typename arma_cx_only<eT>::result
|
Chris@49
|
82 inf(typename arma_cx_only<eT>::result* junk = 0)
|
Chris@49
|
83 {
|
Chris@49
|
84 arma_ignore(junk);
|
Chris@49
|
85
|
Chris@49
|
86 typedef typename get_pod_type<eT>::result T;
|
Chris@49
|
87
|
Chris@49
|
88 return eT( Datum_helper::inf<T>(), Datum_helper::inf<T>() );
|
Chris@49
|
89 }
|
Chris@49
|
90
|
Chris@49
|
91
|
Chris@49
|
92 template<typename eT>
|
Chris@49
|
93 static
|
Chris@49
|
94 typename arma_integral_only<eT>::result
|
Chris@49
|
95 inf(typename arma_integral_only<eT>::result* junk = 0)
|
Chris@49
|
96 {
|
Chris@49
|
97 arma_ignore(junk);
|
Chris@49
|
98
|
Chris@49
|
99 return std::numeric_limits<eT>::max();
|
Chris@49
|
100 }
|
Chris@49
|
101
|
Chris@49
|
102 };
|
Chris@49
|
103 }
|
Chris@49
|
104
|
Chris@49
|
105
|
Chris@49
|
106
|
Chris@49
|
107 //! various constants.
|
Chris@49
|
108 //! Physical constants taken from NIST and WolframAlpha on 2009-06-23
|
Chris@49
|
109 //! http://physics.nist.gov/cuu/Constants
|
Chris@49
|
110 //! http://www.wolframalpha.com
|
Chris@49
|
111 //! See also http://en.wikipedia.org/wiki/Physical_constant
|
Chris@49
|
112
|
Chris@49
|
113
|
Chris@49
|
114 template<typename eT>
|
Chris@49
|
115 class Datum
|
Chris@49
|
116 {
|
Chris@49
|
117 public:
|
Chris@49
|
118
|
Chris@49
|
119 static const eT pi; //!< ratio of any circle's circumference to its diameter
|
Chris@49
|
120 static const eT e; //!< base of the natural logarithm
|
Chris@49
|
121 static const eT euler; //!< Euler's constant, aka Euler-Mascheroni constant
|
Chris@49
|
122 static const eT gratio; //!< golden ratio
|
Chris@49
|
123 static const eT sqrt2; //!< square root of 2
|
Chris@49
|
124 static const eT eps; //!< the difference between 1 and the least value greater than 1 that is representable
|
Chris@49
|
125 static const eT log_min; //!< log of the minimum representable value
|
Chris@49
|
126 static const eT log_max; //!< log of the maximum representable value
|
Chris@49
|
127 static const eT nan; //!< "not a number"
|
Chris@49
|
128 static const eT inf; //!< infinity
|
Chris@49
|
129
|
Chris@49
|
130 //
|
Chris@49
|
131
|
Chris@49
|
132 static const eT m_u; //!< atomic mass constant (in kg)
|
Chris@49
|
133 static const eT N_A; //!< Avogadro constant
|
Chris@49
|
134 static const eT k; //!< Boltzmann constant (in joules per kelvin)
|
Chris@49
|
135 static const eT k_evk; //!< Boltzmann constant (in eV/K)
|
Chris@49
|
136 static const eT a_0; //!< Bohr radius (in meters)
|
Chris@49
|
137 static const eT mu_B; //!< Bohr magneton
|
Chris@49
|
138 static const eT Z_0; //!< characteristic impedance of vacuum (in ohms)
|
Chris@49
|
139 static const eT G_0; //!< conductance quantum (in siemens)
|
Chris@49
|
140 static const eT k_e; //!< Coulomb's constant (in meters per farad)
|
Chris@49
|
141 static const eT eps_0; //!< electric constant (in farads per meter)
|
Chris@49
|
142 static const eT m_e; //!< electron mass (in kg)
|
Chris@49
|
143 static const eT eV; //!< electron volt (in joules)
|
Chris@49
|
144 static const eT ec; //!< elementary charge (in coulombs)
|
Chris@49
|
145 static const eT F; //!< Faraday constant (in coulombs)
|
Chris@49
|
146 static const eT alpha; //!< fine-structure constant
|
Chris@49
|
147 static const eT alpha_inv; //!< inverse fine-structure constant
|
Chris@49
|
148 static const eT K_J; //!< Josephson constant
|
Chris@49
|
149 static const eT mu_0; //!< magnetic constant (in henries per meter)
|
Chris@49
|
150 static const eT phi_0; //!< magnetic flux quantum (in webers)
|
Chris@49
|
151 static const eT R; //!< molar gas constant (in joules per mole kelvin)
|
Chris@49
|
152 static const eT G; //!< Newtonian constant of gravitation (in newton square meters per kilogram squared)
|
Chris@49
|
153 static const eT h; //!< Planck constant (in joule seconds)
|
Chris@49
|
154 static const eT h_bar; //!< Planck constant over 2 pi, aka reduced Planck constant (in joule seconds)
|
Chris@49
|
155 static const eT m_p; //!< proton mass (in kg)
|
Chris@49
|
156 static const eT R_inf; //!< Rydberg constant (in reciprocal meters)
|
Chris@49
|
157 static const eT c_0; //!< speed of light in vacuum (in meters per second)
|
Chris@49
|
158 static const eT sigma; //!< Stefan-Boltzmann constant
|
Chris@49
|
159 static const eT R_k; //!< von Klitzing constant (in ohms)
|
Chris@49
|
160 static const eT b; //!< Wien wavelength displacement law constant
|
Chris@49
|
161 };
|
Chris@49
|
162
|
Chris@49
|
163
|
Chris@49
|
164 // the long lengths of the constants are for future support of "long double"
|
Chris@49
|
165 // and any smart compiler that does high-precision computation at compile-time
|
Chris@49
|
166
|
Chris@49
|
167 template<typename eT> const eT Datum<eT>::pi = eT(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679);
|
Chris@49
|
168 template<typename eT> const eT Datum<eT>::e = eT(2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274);
|
Chris@49
|
169 template<typename eT> const eT Datum<eT>::euler = eT(0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495);
|
Chris@49
|
170 template<typename eT> const eT Datum<eT>::gratio = eT(1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374);
|
Chris@49
|
171 template<typename eT> const eT Datum<eT>::sqrt2 = eT(1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727);
|
Chris@49
|
172 template<typename eT> const eT Datum<eT>::eps = std::numeric_limits<eT>::epsilon();
|
Chris@49
|
173 template<typename eT> const eT Datum<eT>::log_min = std::log(std::numeric_limits<eT>::min());
|
Chris@49
|
174 template<typename eT> const eT Datum<eT>::log_max = std::log(std::numeric_limits<eT>::max());
|
Chris@49
|
175 template<typename eT> const eT Datum<eT>::nan = priv::Datum_helper::nan<eT>();
|
Chris@49
|
176 template<typename eT> const eT Datum<eT>::inf = priv::Datum_helper::inf<eT>();
|
Chris@49
|
177
|
Chris@49
|
178 template<typename eT> const eT Datum<eT>::m_u = eT(1.660538782e-27);
|
Chris@49
|
179 template<typename eT> const eT Datum<eT>::N_A = eT(6.02214179e23);
|
Chris@49
|
180 template<typename eT> const eT Datum<eT>::k = eT(1.3806504e-23);
|
Chris@49
|
181 template<typename eT> const eT Datum<eT>::k_evk = eT(8.617343e-5);
|
Chris@49
|
182 template<typename eT> const eT Datum<eT>::a_0 = eT(0.52917720859e-10);
|
Chris@49
|
183 template<typename eT> const eT Datum<eT>::mu_B = eT(927.400915e-26);
|
Chris@49
|
184 template<typename eT> const eT Datum<eT>::Z_0 = eT(3.76730313461771e-2);
|
Chris@49
|
185 template<typename eT> const eT Datum<eT>::G_0 = eT(7.7480917004e-5);
|
Chris@49
|
186 template<typename eT> const eT Datum<eT>::k_e = eT(8.9875517873681764e9);
|
Chris@49
|
187 template<typename eT> const eT Datum<eT>::eps_0 = eT(8.85418781762039e-12);
|
Chris@49
|
188 template<typename eT> const eT Datum<eT>::m_e = eT(9.10938215e-31);
|
Chris@49
|
189 template<typename eT> const eT Datum<eT>::eV = eT(1.602176487e-19);
|
Chris@49
|
190 template<typename eT> const eT Datum<eT>::ec = eT(1.602176487e-19);
|
Chris@49
|
191 template<typename eT> const eT Datum<eT>::F = eT(96485.3399);
|
Chris@49
|
192 template<typename eT> const eT Datum<eT>::alpha = eT(7.2973525376e-3);
|
Chris@49
|
193 template<typename eT> const eT Datum<eT>::alpha_inv = eT(137.035999679);
|
Chris@49
|
194 template<typename eT> const eT Datum<eT>::K_J = eT(483597.891e9);
|
Chris@49
|
195 template<typename eT> const eT Datum<eT>::mu_0 = eT(1.25663706143592e-06);
|
Chris@49
|
196 template<typename eT> const eT Datum<eT>::phi_0 = eT(2.067833667e-15);
|
Chris@49
|
197 template<typename eT> const eT Datum<eT>::R = eT(8.314472);
|
Chris@49
|
198 template<typename eT> const eT Datum<eT>::G = eT(6.67428e-11);
|
Chris@49
|
199 template<typename eT> const eT Datum<eT>::h = eT(6.62606896e-34);
|
Chris@49
|
200 template<typename eT> const eT Datum<eT>::h_bar = eT(1.054571628e-34);
|
Chris@49
|
201 template<typename eT> const eT Datum<eT>::m_p = eT(1.672621637e-27);
|
Chris@49
|
202 template<typename eT> const eT Datum<eT>::R_inf = eT(10973731.568527);
|
Chris@49
|
203 template<typename eT> const eT Datum<eT>::c_0 = eT(299792458.0);
|
Chris@49
|
204 template<typename eT> const eT Datum<eT>::sigma = eT(5.670400e-8);
|
Chris@49
|
205 template<typename eT> const eT Datum<eT>::R_k = eT(25812.807557);
|
Chris@49
|
206 template<typename eT> const eT Datum<eT>::b = eT(2.8977685e-3);
|
Chris@49
|
207
|
Chris@49
|
208
|
Chris@49
|
209
|
Chris@49
|
210 typedef Datum<float> fdatum;
|
Chris@49
|
211 typedef Datum<double> datum;
|
Chris@49
|
212
|
Chris@49
|
213
|
Chris@49
|
214
|
Chris@49
|
215
|
Chris@49
|
216 namespace priv
|
Chris@49
|
217 {
|
Chris@49
|
218
|
Chris@49
|
219 template<typename eT>
|
Chris@49
|
220 static
|
Chris@49
|
221 arma_inline
|
Chris@49
|
222 arma_hot
|
Chris@49
|
223 typename arma_real_only<eT>::result
|
Chris@49
|
224 most_neg(typename arma_real_only<eT>::result* junk = 0)
|
Chris@49
|
225 {
|
Chris@49
|
226 arma_ignore(junk);
|
Chris@49
|
227
|
Chris@49
|
228 if(std::numeric_limits<eT>::has_infinity == true)
|
Chris@49
|
229 {
|
Chris@49
|
230 return -(std::numeric_limits<eT>::infinity());
|
Chris@49
|
231 }
|
Chris@49
|
232 else
|
Chris@49
|
233 {
|
Chris@49
|
234 return -(std::numeric_limits<eT>::max());
|
Chris@49
|
235 }
|
Chris@49
|
236 }
|
Chris@49
|
237
|
Chris@49
|
238
|
Chris@49
|
239 template<typename eT>
|
Chris@49
|
240 static
|
Chris@49
|
241 arma_inline
|
Chris@49
|
242 arma_hot
|
Chris@49
|
243 typename arma_integral_only<eT>::result
|
Chris@49
|
244 most_neg(typename arma_integral_only<eT>::result* junk = 0)
|
Chris@49
|
245 {
|
Chris@49
|
246 arma_ignore(junk);
|
Chris@49
|
247
|
Chris@49
|
248 return std::numeric_limits<eT>::min();
|
Chris@49
|
249 }
|
Chris@49
|
250
|
Chris@49
|
251
|
Chris@49
|
252 template<typename eT>
|
Chris@49
|
253 static
|
Chris@49
|
254 arma_inline
|
Chris@49
|
255 arma_hot
|
Chris@49
|
256 typename arma_real_only<eT>::result
|
Chris@49
|
257 most_pos(typename arma_real_only<eT>::result* junk = 0)
|
Chris@49
|
258 {
|
Chris@49
|
259 arma_ignore(junk);
|
Chris@49
|
260
|
Chris@49
|
261 if(std::numeric_limits<eT>::has_infinity == true)
|
Chris@49
|
262 {
|
Chris@49
|
263 return std::numeric_limits<eT>::infinity();
|
Chris@49
|
264 }
|
Chris@49
|
265 else
|
Chris@49
|
266 {
|
Chris@49
|
267 return std::numeric_limits<eT>::max();
|
Chris@49
|
268 }
|
Chris@49
|
269 }
|
Chris@49
|
270
|
Chris@49
|
271
|
Chris@49
|
272 template<typename eT>
|
Chris@49
|
273 static
|
Chris@49
|
274 arma_inline
|
Chris@49
|
275 arma_hot
|
Chris@49
|
276 typename arma_integral_only<eT>::result
|
Chris@49
|
277 most_pos(typename arma_integral_only<eT>::result* junk = 0)
|
Chris@49
|
278 {
|
Chris@49
|
279 arma_ignore(junk);
|
Chris@49
|
280
|
Chris@49
|
281 return std::numeric_limits<eT>::max();
|
Chris@49
|
282 }
|
Chris@49
|
283
|
Chris@49
|
284 }
|
Chris@49
|
285
|
Chris@49
|
286
|
Chris@49
|
287
|
Chris@49
|
288 //! @}
|