Skip to main content

use_math_constants/
lib.rs

1#![forbid(unsafe_code)]
2
3//! Reusable mathematical constants expressed as plain `f64` values.
4
5/// Mathematical constant $\pi$, dimensionless.
6pub const PI: f64 = std::f64::consts::PI;
7
8/// Mathematical constant $\tau = 2\pi$, dimensionless.
9pub const TAU: f64 = std::f64::consts::TAU;
10
11/// Mathematical constant $e$, dimensionless.
12pub const E: f64 = std::f64::consts::E;
13
14/// Approximate mathematical constant $\varphi$, the golden ratio, dimensionless.
15pub const PHI: f64 = 1.618_033_988_749_895_f64;
16
17/// Mathematical constant $\sqrt{2}$, dimensionless.
18pub const SQRT_2: f64 = std::f64::consts::SQRT_2;
19
20/// Approximate mathematical constant $\sqrt{3}$, dimensionless.
21pub const SQRT_3: f64 = 1.732_050_807_568_877_2_f64;
22
23/// Mathematical constant $\ln(2)$, dimensionless.
24pub const LN_2: f64 = std::f64::consts::LN_2;
25
26/// Mathematical constant $\ln(10)$, dimensionless.
27pub const LN_10: f64 = std::f64::consts::LN_10;
28
29/// Mathematical constant $\log_2(e)$, dimensionless.
30pub const LOG2_E: f64 = std::f64::consts::LOG2_E;
31
32/// Mathematical constant $\log_{10}(e)$, dimensionless.
33pub const LOG10_E: f64 = std::f64::consts::LOG10_E;
34
35/// Mathematical constant $1 / \pi$, dimensionless.
36pub const FRAC_1_PI: f64 = std::f64::consts::FRAC_1_PI;
37
38/// Mathematical constant $2 / \pi$, dimensionless.
39pub const FRAC_2_PI: f64 = std::f64::consts::FRAC_2_PI;
40
41/// Mathematical constant $\pi / 2$, dimensionless.
42pub const FRAC_PI_2: f64 = std::f64::consts::FRAC_PI_2;
43
44/// Mathematical constant $\pi / 3$, dimensionless.
45pub const FRAC_PI_3: f64 = std::f64::consts::FRAC_PI_3;
46
47/// Mathematical constant $\pi / 4$, dimensionless.
48pub const FRAC_PI_4: f64 = std::f64::consts::FRAC_PI_4;
49
50/// Mathematical constant $\pi / 6$, dimensionless.
51pub const FRAC_PI_6: f64 = std::f64::consts::FRAC_PI_6;
52
53/// Mathematical constant $\pi / 8$, dimensionless.
54pub const FRAC_PI_8: f64 = std::f64::consts::FRAC_PI_8;
55
56#[cfg(test)]
57mod tests {
58    use super::{FRAC_PI_4, PHI, PI, TAU};
59
60    fn approx_eq(left: f64, right: f64, relative_tolerance: f64) {
61        let scale = left.abs().max(right.abs()).max(1.0);
62        let delta = (left - right).abs();
63
64        assert!(
65            delta <= relative_tolerance * scale,
66            "left={left:e} right={right:e} delta={delta:e} rel_tol={relative_tolerance:e}"
67        );
68    }
69
70    #[test]
71    fn tau_matches_twice_pi() {
72        assert_eq!(TAU, 2.0 * PI);
73    }
74
75    #[test]
76    fn phi_matches_its_defining_quadratic() {
77        approx_eq(PHI * PHI, PHI + 1.0, 1.0e-12);
78    }
79
80    #[test]
81    fn quarter_turns_reconstruct_pi() {
82        assert_eq!(FRAC_PI_4 * 4.0, PI);
83    }
84}