Chris@49
|
1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2008-2011 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_compat
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13 // the Math and Phy classes are kept for compatibility with old code;
|
Chris@49
|
14 // for new code, use the Datum class instead
|
Chris@49
|
15 // eg. instead of math::pi(), use datum::pi
|
Chris@49
|
16
|
Chris@49
|
17
|
Chris@49
|
18 template<typename eT>
|
Chris@49
|
19 class Math
|
Chris@49
|
20 {
|
Chris@49
|
21 public:
|
Chris@49
|
22
|
Chris@49
|
23 // the long lengths of the constants are for future support of "long double"
|
Chris@49
|
24 // and any smart compiler that does high-precision computation at compile-time
|
Chris@49
|
25
|
Chris@49
|
26 //! ratio of any circle's circumference to its diameter
|
Chris@49
|
27 static eT pi() { return eT(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679); }
|
Chris@49
|
28
|
Chris@49
|
29 //! base of the natural logarithm
|
Chris@49
|
30 static eT e() { return eT(2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274); }
|
Chris@49
|
31
|
Chris@49
|
32 //! Euler's constant, aka Euler-Mascheroni constant
|
Chris@49
|
33 static eT euler() { return eT(0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495); }
|
Chris@49
|
34
|
Chris@49
|
35 //! golden ratio
|
Chris@49
|
36 static eT gratio() { return eT(1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374); }
|
Chris@49
|
37
|
Chris@49
|
38 //! square root of 2
|
Chris@49
|
39 static eT sqrt2() { return eT(1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727); }
|
Chris@49
|
40
|
Chris@49
|
41 //! the difference between 1 and the least value greater than 1 that is representable
|
Chris@49
|
42 static eT eps() { return std::numeric_limits<eT>::epsilon(); }
|
Chris@49
|
43
|
Chris@49
|
44 //! log of the minimum representable value
|
Chris@49
|
45 static eT log_min() { static const eT out = std::log(std::numeric_limits<eT>::min()); return out; }
|
Chris@49
|
46
|
Chris@49
|
47 //! log of the maximum representable value
|
Chris@49
|
48 static eT log_max() { static const eT out = std::log(std::numeric_limits<eT>::max()); return out; }
|
Chris@49
|
49
|
Chris@49
|
50 //! "not a number"
|
Chris@49
|
51 static eT nan() { return priv::Datum_helper::nan<eT>(); }
|
Chris@49
|
52
|
Chris@49
|
53 //! infinity
|
Chris@49
|
54 static eT inf() { return priv::Datum_helper::inf<eT>(); }
|
Chris@49
|
55 };
|
Chris@49
|
56
|
Chris@49
|
57
|
Chris@49
|
58
|
Chris@49
|
59 //! Physical constants taken from NIST and WolframAlpha on 2009-06-23
|
Chris@49
|
60 //! http://physics.nist.gov/cuu/Constants
|
Chris@49
|
61 //! http://www.wolframalpha.com
|
Chris@49
|
62 //! See also http://en.wikipedia.org/wiki/Physical_constant
|
Chris@49
|
63 template<typename eT>
|
Chris@49
|
64 class Phy
|
Chris@49
|
65 {
|
Chris@49
|
66 public:
|
Chris@49
|
67
|
Chris@49
|
68 //! atomic mass constant (in kg)
|
Chris@49
|
69 static eT m_u() { return eT(1.660538782e-27); }
|
Chris@49
|
70
|
Chris@49
|
71 //! Avogadro constant
|
Chris@49
|
72 static eT N_A() { return eT(6.02214179e23); }
|
Chris@49
|
73
|
Chris@49
|
74 //! Boltzmann constant (in joules per kelvin)
|
Chris@49
|
75 static eT k() { return eT(1.3806504e-23); }
|
Chris@49
|
76
|
Chris@49
|
77 //! Boltzmann constant (in eV/K)
|
Chris@49
|
78 static eT k_evk() { return eT(8.617343e-5); }
|
Chris@49
|
79
|
Chris@49
|
80 //! Bohr radius (in meters)
|
Chris@49
|
81 static eT a_0() { return eT(0.52917720859e-10); }
|
Chris@49
|
82
|
Chris@49
|
83 //! Bohr magneton
|
Chris@49
|
84 static eT mu_B() { return eT(927.400915e-26); }
|
Chris@49
|
85
|
Chris@49
|
86 //! characteristic impedance of vacuum (in ohms)
|
Chris@49
|
87 static eT Z_0() { return eT(3.76730313461771e-2); }
|
Chris@49
|
88
|
Chris@49
|
89 //! conductance quantum (in siemens)
|
Chris@49
|
90 static eT G_0() { return eT(7.7480917004e-5); }
|
Chris@49
|
91
|
Chris@49
|
92 //! Coulomb's constant (in meters per farad)
|
Chris@49
|
93 static eT k_e() { return eT(8.9875517873681764e9); }
|
Chris@49
|
94
|
Chris@49
|
95 //! electric constant (in farads per meter)
|
Chris@49
|
96 static eT eps_0() { return eT(8.85418781762039e-12); }
|
Chris@49
|
97
|
Chris@49
|
98 //! electron mass (in kg)
|
Chris@49
|
99 static eT m_e() { return eT(9.10938215e-31); }
|
Chris@49
|
100
|
Chris@49
|
101 //! electron volt (in joules)
|
Chris@49
|
102 static eT eV() { return eT(1.602176487e-19); }
|
Chris@49
|
103
|
Chris@49
|
104 //! elementary charge (in coulombs)
|
Chris@49
|
105 static eT e() { return eT(1.602176487e-19); }
|
Chris@49
|
106
|
Chris@49
|
107 //! Faraday constant (in coulombs)
|
Chris@49
|
108 static eT F() { return eT(96485.3399); }
|
Chris@49
|
109
|
Chris@49
|
110 //! fine-structure constant
|
Chris@49
|
111 static eT alpha() { return eT(7.2973525376e-3); }
|
Chris@49
|
112
|
Chris@49
|
113 //! inverse fine-structure constant
|
Chris@49
|
114 static eT alpha_inv() { return eT(137.035999679); }
|
Chris@49
|
115
|
Chris@49
|
116 //! Josephson constant
|
Chris@49
|
117 static eT K_J() { return eT(483597.891e9); }
|
Chris@49
|
118
|
Chris@49
|
119 //! magnetic constant (in henries per meter)
|
Chris@49
|
120 static eT mu_0() { return eT(1.25663706143592e-06); }
|
Chris@49
|
121
|
Chris@49
|
122 //! magnetic flux quantum (in webers)
|
Chris@49
|
123 static eT phi_0() { return eT(2.067833667e-15); }
|
Chris@49
|
124
|
Chris@49
|
125 //! molar gas constant (in joules per mole kelvin)
|
Chris@49
|
126 static eT R() { return eT(8.314472); }
|
Chris@49
|
127
|
Chris@49
|
128 //! Newtonian constant of gravitation (in newton square meters per kilogram squared)
|
Chris@49
|
129 static eT G() { return eT(6.67428e-11); }
|
Chris@49
|
130
|
Chris@49
|
131 //! Planck constant (in joule seconds)
|
Chris@49
|
132 static eT h() { return eT(6.62606896e-34); }
|
Chris@49
|
133
|
Chris@49
|
134 //! Planck constant over 2 pi, aka reduced Planck constant (in joule seconds)
|
Chris@49
|
135 static eT h_bar() { return eT(1.054571628e-34); }
|
Chris@49
|
136
|
Chris@49
|
137 //! proton mass (in kg)
|
Chris@49
|
138 static eT m_p() { return eT(1.672621637e-27); }
|
Chris@49
|
139
|
Chris@49
|
140 //! Rydberg constant (in reciprocal meters)
|
Chris@49
|
141 static eT R_inf() { return eT(10973731.568527); }
|
Chris@49
|
142
|
Chris@49
|
143 //! speed of light in vacuum (in meters per second)
|
Chris@49
|
144 static eT c_0() { return eT(299792458.0); }
|
Chris@49
|
145
|
Chris@49
|
146 //! Stefan-Boltzmann constant
|
Chris@49
|
147 static eT sigma() { return eT(5.670400e-8); }
|
Chris@49
|
148
|
Chris@49
|
149 //! von Klitzing constant (in ohms)
|
Chris@49
|
150 static eT R_k() { return eT(25812.807557); }
|
Chris@49
|
151
|
Chris@49
|
152 //! Wien wavelength displacement law constant
|
Chris@49
|
153 static eT b() { return eT(2.8977685e-3); }
|
Chris@49
|
154 };
|
Chris@49
|
155
|
Chris@49
|
156
|
Chris@49
|
157
|
Chris@49
|
158 typedef Math<float> fmath;
|
Chris@49
|
159 typedef Math<double> math;
|
Chris@49
|
160
|
Chris@49
|
161 typedef Phy<float> fphy;
|
Chris@49
|
162 typedef Phy<double> phy;
|
Chris@49
|
163
|
Chris@49
|
164
|
Chris@49
|
165
|
Chris@49
|
166 //! @}
|