Skip to main content

mathverse_core/
constants.rs

1//! High-precision mathematical constants, in `f64` and `f32` widths.
2//!
3//! All constants are defined as `pub const f64` with `f32` variants available
4//! under the `f32` submodule (e.g., `constants::f32::PI`).
5
6macro_rules! constants {
7    ($($name:ident: $val:expr),* $(,)?) => {
8        $(
9            #[allow(missing_docs)]
10            pub const $name: f64 = $val;
11        )*
12        /// `f32` variants of all constants.
13        pub mod f32 {
14            use super::*;
15            $(
16                #[allow(missing_docs)]
17                pub const $name: f32 = super::$name as f32;
18            )*
19        }
20    };
21}
22
23constants! {
24    PI: 3.14159265358979323846264338327950288,
25    TAU: 6.28318530717958647692528676655900577,
26    E: 2.71828182845904523536028747135266250,
27    PHI: 1.61803398874989484820458683436563812,
28    SQRT_2: 1.41421356237309504880168872420969808,
29    SQRT_3: 1.73205080756887729352744634150587237,
30    SQRT_5: 2.23606797749978969640917366873127623,
31    SQRT_6: 2.44948974278317809819728407470589139,
32    SQRT_7: 2.64575131106459059050161575363926042,
33    SQRT_PI: 1.77245385090551602729816748334114518,
34    SQRT_2PI: 2.50662827463100050241559627119775686,
35    SQRT_LN4: 1.17741002251547401367847600393163626,
36    SQRT_2_INV: 0.70710678118654752440084436210484904,
37    SQRT_3_INV: 0.57735026918962576450914878050195746,
38    CUBE_ROOT_2: 1.25992104989487316476721060727822835,
39    CUBE_ROOT_3: 1.44224957030740838232163831419462179,
40    E_SQRT: 1.64872127070012814684865078781416357,
41    E_SQ: 7.38905609893065022723042746057500781,
42    PI_SQ: 9.86960440108935861883449099987615114,
43    PI_CUBE: 31.006276680299820175476315067101395,
44    LN_2: 0.69314718055994530941723212145817657,
45    LN_10: 2.30258509299404568401799145468436421,
46    LN_PI: 1.14472988584940017414342735135305871,
47    LOG2_E: 1.44269504088896340735992468100189256,
48    LOG10_E: 0.43429448190325182765112891891660508,
49    LOG2_10: 3.32192809488736234787031942948939018,
50    LOG_2: 0.69314718055994530941723212145817657,
51    LOG_10: 2.30258509299404568401799145468436421,
52    EULER_GAMMA: 0.57721566490153286060651209008240243,
53    CATALAN: 0.91596559417721901505460351493238411,
54    APERY: 1.20205690315959428539973816151144999,
55    FEIGENBAUM: 4.66920160910299067185320383797060023,
56    FEIGENBAUM2: 2.50290787509589282228342812458338185,
57    DEG_TO_RAD: 0.01745329251994329576923690768488613,
58    RAD_TO_DEG: 57.29577951308232087679815481410517033,
59    DEG_TO_GRAD: 1.11111111111111111111111111111111111,
60    GRAD_TO_RAD: 0.01570796326794896619231321691639751,
61    GRAD_TO_DEG: 0.9,
62    HALF_PI: 1.57079632679489661923132169163975144,
63    THIRD_PI: 1.04719755119659774615421446109713842,
64    QUARTER_PI: 0.78539816339744830961566084581987572,
65    LN_2PI: 1.83787706640934548356065947281122532,
66    INV_PI: 0.31830988618379067153776752674502872,
67    INV_SQRT_PI: 0.56418958354775628694807945156077259,
68    TWO_SQRT_PI: 1.12837916709551257389615890312154518,
69    E_INV: 0.36787944117144232159552377016146086,
70    LOG10_2: 0.30102999566398119521373889472449303,
71    SILVER_RATIO: 2.41421356237309504880168872420969808,
72    INF: f64::INFINITY,
73    NAN: f64::NAN,
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    #[allow(clippy::suboptimal_flops)]
82    fn values() {
83        assert!((PI - 3.141592653589793).abs() < 1e-15);
84        assert!((TAU - 2.0 * PI).abs() < 1e-15);
85        assert!((E - 2.718281828459045).abs() < 1e-15);
86        assert!((180.0 * DEG_TO_RAD - PI).abs() < 1e-15);
87        assert!((f32::PI - f32::TAU / 2.0).abs() < 1e-6);
88        assert!((HALF_PI - PI / 2.0).abs() < 1e-15);
89        assert!((SQRT_PI - PI.sqrt()).abs() < 1e-15);
90        assert!((LOG2_E * LN_2 - 1.0).abs() < 1e-15);
91        assert!((LOG10_E * LN_10 - 1.0).abs() < 1e-15);
92        assert!((SQRT_2_INV - 1.0 / SQRT_2).abs() < 1e-15);
93        assert!(INF.is_infinite());
94        assert!(NAN.is_nan());
95        assert!((LN_2PI - (2.0 * PI).ln()).abs() < 1e-15);
96        assert!((INV_PI - 1.0 / PI).abs() < 1e-15);
97        assert!((INV_SQRT_PI - 1.0 / SQRT_PI).abs() < 1e-15);
98        assert!((TWO_SQRT_PI - 2.0 / SQRT_PI).abs() < 1e-15);
99        assert!((E_INV - 1.0 / E).abs() < 1e-15);
100        assert!((LOG10_2 - 2.0_f64.log10()).abs() < 1e-15);
101        assert!((SILVER_RATIO - (1.0 + SQRT_2)).abs() < 1e-15);
102    }
103}