Chris@49: // Copyright (C) 2008-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2012 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup constants Chris@49: //! @{ Chris@49: Chris@49: Chris@49: namespace priv Chris@49: { Chris@49: class Datum_helper Chris@49: { Chris@49: public: Chris@49: Chris@49: template Chris@49: static Chris@49: typename arma_real_only::result Chris@49: nan(typename arma_real_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: if(std::numeric_limits::has_quiet_NaN == true) Chris@49: { Chris@49: return std::numeric_limits::quiet_NaN(); Chris@49: } Chris@49: else Chris@49: { Chris@49: return eT(0); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: typename arma_cx_only::result Chris@49: nan(typename arma_cx_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: typedef typename get_pod_type::result T; Chris@49: Chris@49: return eT( Datum_helper::nan(), Datum_helper::nan() ); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: typename arma_integral_only::result Chris@49: nan(typename arma_integral_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: return eT(0); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: typename arma_real_only::result Chris@49: inf(typename arma_real_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: if(std::numeric_limits::has_infinity == true) Chris@49: { Chris@49: return std::numeric_limits::infinity(); Chris@49: } Chris@49: else Chris@49: { Chris@49: return std::numeric_limits::max(); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: typename arma_cx_only::result Chris@49: inf(typename arma_cx_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: typedef typename get_pod_type::result T; Chris@49: Chris@49: return eT( Datum_helper::inf(), Datum_helper::inf() ); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: typename arma_integral_only::result Chris@49: inf(typename arma_integral_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: return std::numeric_limits::max(); Chris@49: } Chris@49: Chris@49: }; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! various constants. Chris@49: //! Physical constants taken from NIST and WolframAlpha on 2009-06-23 Chris@49: //! http://physics.nist.gov/cuu/Constants Chris@49: //! http://www.wolframalpha.com Chris@49: //! See also http://en.wikipedia.org/wiki/Physical_constant Chris@49: Chris@49: Chris@49: template Chris@49: class Datum Chris@49: { Chris@49: public: Chris@49: Chris@49: static const eT pi; //!< ratio of any circle's circumference to its diameter Chris@49: static const eT e; //!< base of the natural logarithm Chris@49: static const eT euler; //!< Euler's constant, aka Euler-Mascheroni constant Chris@49: static const eT gratio; //!< golden ratio Chris@49: static const eT sqrt2; //!< square root of 2 Chris@49: static const eT eps; //!< the difference between 1 and the least value greater than 1 that is representable Chris@49: static const eT log_min; //!< log of the minimum representable value Chris@49: static const eT log_max; //!< log of the maximum representable value Chris@49: static const eT nan; //!< "not a number" Chris@49: static const eT inf; //!< infinity Chris@49: Chris@49: // Chris@49: Chris@49: static const eT m_u; //!< atomic mass constant (in kg) Chris@49: static const eT N_A; //!< Avogadro constant Chris@49: static const eT k; //!< Boltzmann constant (in joules per kelvin) Chris@49: static const eT k_evk; //!< Boltzmann constant (in eV/K) Chris@49: static const eT a_0; //!< Bohr radius (in meters) Chris@49: static const eT mu_B; //!< Bohr magneton Chris@49: static const eT Z_0; //!< characteristic impedance of vacuum (in ohms) Chris@49: static const eT G_0; //!< conductance quantum (in siemens) Chris@49: static const eT k_e; //!< Coulomb's constant (in meters per farad) Chris@49: static const eT eps_0; //!< electric constant (in farads per meter) Chris@49: static const eT m_e; //!< electron mass (in kg) Chris@49: static const eT eV; //!< electron volt (in joules) Chris@49: static const eT ec; //!< elementary charge (in coulombs) Chris@49: static const eT F; //!< Faraday constant (in coulombs) Chris@49: static const eT alpha; //!< fine-structure constant Chris@49: static const eT alpha_inv; //!< inverse fine-structure constant Chris@49: static const eT K_J; //!< Josephson constant Chris@49: static const eT mu_0; //!< magnetic constant (in henries per meter) Chris@49: static const eT phi_0; //!< magnetic flux quantum (in webers) Chris@49: static const eT R; //!< molar gas constant (in joules per mole kelvin) Chris@49: static const eT G; //!< Newtonian constant of gravitation (in newton square meters per kilogram squared) Chris@49: static const eT h; //!< Planck constant (in joule seconds) Chris@49: static const eT h_bar; //!< Planck constant over 2 pi, aka reduced Planck constant (in joule seconds) Chris@49: static const eT m_p; //!< proton mass (in kg) Chris@49: static const eT R_inf; //!< Rydberg constant (in reciprocal meters) Chris@49: static const eT c_0; //!< speed of light in vacuum (in meters per second) Chris@49: static const eT sigma; //!< Stefan-Boltzmann constant Chris@49: static const eT R_k; //!< von Klitzing constant (in ohms) Chris@49: static const eT b; //!< Wien wavelength displacement law constant Chris@49: }; Chris@49: Chris@49: Chris@49: // the long lengths of the constants are for future support of "long double" Chris@49: // and any smart compiler that does high-precision computation at compile-time Chris@49: Chris@49: template const eT Datum::pi = eT(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679); Chris@49: template const eT Datum::e = eT(2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274); Chris@49: template const eT Datum::euler = eT(0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495); Chris@49: template const eT Datum::gratio = eT(1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374); Chris@49: template const eT Datum::sqrt2 = eT(1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727); Chris@49: template const eT Datum::eps = std::numeric_limits::epsilon(); Chris@49: template const eT Datum::log_min = std::log(std::numeric_limits::min()); Chris@49: template const eT Datum::log_max = std::log(std::numeric_limits::max()); Chris@49: template const eT Datum::nan = priv::Datum_helper::nan(); Chris@49: template const eT Datum::inf = priv::Datum_helper::inf(); Chris@49: Chris@49: template const eT Datum::m_u = eT(1.660538782e-27); Chris@49: template const eT Datum::N_A = eT(6.02214179e23); Chris@49: template const eT Datum::k = eT(1.3806504e-23); Chris@49: template const eT Datum::k_evk = eT(8.617343e-5); Chris@49: template const eT Datum::a_0 = eT(0.52917720859e-10); Chris@49: template const eT Datum::mu_B = eT(927.400915e-26); Chris@49: template const eT Datum::Z_0 = eT(3.76730313461771e-2); Chris@49: template const eT Datum::G_0 = eT(7.7480917004e-5); Chris@49: template const eT Datum::k_e = eT(8.9875517873681764e9); Chris@49: template const eT Datum::eps_0 = eT(8.85418781762039e-12); Chris@49: template const eT Datum::m_e = eT(9.10938215e-31); Chris@49: template const eT Datum::eV = eT(1.602176487e-19); Chris@49: template const eT Datum::ec = eT(1.602176487e-19); Chris@49: template const eT Datum::F = eT(96485.3399); Chris@49: template const eT Datum::alpha = eT(7.2973525376e-3); Chris@49: template const eT Datum::alpha_inv = eT(137.035999679); Chris@49: template const eT Datum::K_J = eT(483597.891e9); Chris@49: template const eT Datum::mu_0 = eT(1.25663706143592e-06); Chris@49: template const eT Datum::phi_0 = eT(2.067833667e-15); Chris@49: template const eT Datum::R = eT(8.314472); Chris@49: template const eT Datum::G = eT(6.67428e-11); Chris@49: template const eT Datum::h = eT(6.62606896e-34); Chris@49: template const eT Datum::h_bar = eT(1.054571628e-34); Chris@49: template const eT Datum::m_p = eT(1.672621637e-27); Chris@49: template const eT Datum::R_inf = eT(10973731.568527); Chris@49: template const eT Datum::c_0 = eT(299792458.0); Chris@49: template const eT Datum::sigma = eT(5.670400e-8); Chris@49: template const eT Datum::R_k = eT(25812.807557); Chris@49: template const eT Datum::b = eT(2.8977685e-3); Chris@49: Chris@49: Chris@49: Chris@49: typedef Datum fdatum; Chris@49: typedef Datum datum; Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: namespace priv Chris@49: { Chris@49: Chris@49: template Chris@49: static Chris@49: arma_inline Chris@49: arma_hot Chris@49: typename arma_real_only::result Chris@49: most_neg(typename arma_real_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: if(std::numeric_limits::has_infinity == true) Chris@49: { Chris@49: return -(std::numeric_limits::infinity()); Chris@49: } Chris@49: else Chris@49: { Chris@49: return -(std::numeric_limits::max()); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: arma_inline Chris@49: arma_hot Chris@49: typename arma_integral_only::result Chris@49: most_neg(typename arma_integral_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: return std::numeric_limits::min(); Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: arma_inline Chris@49: arma_hot Chris@49: typename arma_real_only::result Chris@49: most_pos(typename arma_real_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: if(std::numeric_limits::has_infinity == true) Chris@49: { Chris@49: return std::numeric_limits::infinity(); Chris@49: } Chris@49: else Chris@49: { Chris@49: return std::numeric_limits::max(); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: static Chris@49: arma_inline Chris@49: arma_hot Chris@49: typename arma_integral_only::result Chris@49: most_pos(typename arma_integral_only::result* junk = 0) Chris@49: { Chris@49: arma_ignore(junk); Chris@49: Chris@49: return std::numeric_limits::max(); Chris@49: } Chris@49: Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}