devela/num/float/wrapper/
consts.rs

1// devela::num::float::wrapper::consts
2//
3//! Constants
4//!
5//! - <https://en.wikipedia.org/wiki/List_of_mathematical_constants>
6//
7// NOTE: In sync with num::float::constants
8
9#![allow(clippy::excessive_precision, reason = "constants are defined with 81 decimals")]
10#![allow(dead_code, reason = "WIP f16,f128")]
11
12use super::super::constants::{ExtFloatConst, *};
13use crate::Float;
14#[cfg(feature = "nightly_float")]
15use ::core::{f128, f16};
16
17/// impl. floating-point technical constants
18macro_rules! float_technical_const_impls {
19    () => {
20        float_technical_const_impls![
21            // Uses Lomont's single precision magic number for fisqrt
22            f32:u32[8, 0x5f37_59df, 1e-6],
23
24            // Uses Lomont's double precision magic number for fisqrt
25            // f64[11, 0x5fe6_eb50_c7b5_37a9, 1e-15],
26            //
27            // Uses Matthew Robertson's double precision magic number
28            f64:u64[11, 0x5fe6_eb50_c7b5_37a9, 1e-12]
29        ];
30        #[cfg(feature = "nightly_float")]
31        float_technical_const_impls![
32            // Uses a half-precision magic number found by brute-force
33            f16:u16[5, 0x59b9, 1e-3],
34            // Uses Matthew Robertson's quadruple precision magic number
35            f128:u128[15, 0x5ffe_6eb5_0c7b_537a_9cd9_f02e_504f_cfbf, 1e-30]
36        ];
37    };
38    (
39        // $f:    the floating-point type
40        // $u:    unsigned integer type with the same bit-size
41        // [
42        // $ebit:  bits for the exponent
43        // $fisr: magic fisr constant
44        // $nrt:  newton-rapson-tolerance for sqrt()
45        // ]
46        $( $f:ty:$u:ty
47        [$ebit:literal, $fisr:literal, $nrt:literal] ),+) => {
48        $( float_technical_const_impls![@$f:$u[$ebit, $fisr, $nrt]]; )+
49    };
50    (@$f:ty:$u:ty
51        [$ebit:literal, $fisr:literal, $nrt:literal] ) => {
52        impl Float<$f> {
53            // MAYBE move below (split them up)
54            // MAYBE move to ExtFloatConst (make all public)
55            #[doc = SIGNIFICAND_BITS!()]
56            pub const SIGNIFICAND_BITS: u32 = <$f>::MANTISSA_DIGITS -1;
57            #[doc = EXPONENT_BIAS!()]
58            pub const EXPONENT_BIAS: u32 = <$f>::MAX_EXP as u32 - 1;
59            #[doc = EXPONENT_BITS!()]
60            pub const EXPONENT_BITS: u32 = $ebit;
61
62            /// Fast inverse square root magic constant.
63            pub(super) const FISR_MAGIC: $u = $fisr;
64
65            /// Tolerances for the difference between successive guesses using the
66            /// Newton-Raphson method for square root calculation:
67            pub(super) const NR_TOLERANCE: $f = $nrt;
68        }
69    };
70}
71float_technical_const_impls![];
72
73/// impl mathematical constants
74///
75/// $f: the floating-point type.
76macro_rules! float_const_impls {
77    () => {
78        float_const_impls![f32, f64];
79        #[cfg(feature = "nightly_float")]
80        float_const_impls![f16, f128];
81    };
82    ($( $f:ty),+) => { $( float_const_impls![@$f]; )+ };
83    (@$f:ty) => {
84        /// # *Mathematical constants*.
85        ///
86        /// See [`ExtFloatConst`].
87        impl Float<$f> {
88            #[doc = ONE!()]
89            pub const ONE: Float<$f> = Float(<$f>::ONE);
90            #[doc = ZERO!()]
91            pub const ZERO: Float<$f> = Float(<$f>::ZERO);
92            #[doc = NEG_ONE!()]
93            pub const NEG_ONE: Float<$f> = Float(<$f>::NEG_ONE);
94            #[doc = NEG_ZERO!()]
95            pub const NEG_ZERO: Float<$f> = Float(<$f>::NEG_ZERO);
96
97            // ...
98
99            #[doc = NAN!()]
100            pub const NAN: Float<$f> = Float(<$f>::NAN);
101            #[doc = INFINITY!()]
102            pub const INFINITY: Float<$f> = Float(<$f>::INFINITY);
103            #[doc = NEG_INFINITY!()]
104            pub const NEG_INFINITY: Float<$f> = Float(<$f>::NEG_INFINITY);
105
106            #[doc = EPSILON!()]
107            pub const EPSILON: Float<$f> = Float(<$f>::EPSILON);
108
109            #[doc = LOW_MARGIN!()]
110            pub const LOW_MARGIN: Float<$f> = Float(<$f>::LOW_MARGIN);
111            #[doc = MEDIUM_MARGIN!()]
112            pub const MEDIUM_MARGIN: Float<$f> = Float(<$f>::MEDIUM_MARGIN);
113            #[doc = HIGH_MARGIN!()]
114            pub const HIGH_MARGIN: Float<$f> = Float(<$f>::HIGH_MARGIN);
115
116            #[doc = RADIX!()]
117            pub const RADIX: u32 = <$f>::RADIX;
118            #[doc = DIGITS!()]
119            pub const DIGITS: u32 = <$f>::DIGITS;
120            #[doc = MANTISSA_DIGITS!()]
121            pub const MANTISSA_DIGITS: u32 = <$f>::MANTISSA_DIGITS;
122
123            #[doc = MIN!()]
124            pub const MIN: Float<$f> = Float(<$f>::MIN);
125            #[doc = MIN_POSITIVE!()]
126            pub const MIN_POSITIVE: Float<$f> = Float(<$f>::MIN_POSITIVE);
127            #[doc = MAX!()]
128            pub const MAX: Float<$f> = Float(<$f>::MAX);
129
130            #[doc = MIN_EXP!()]
131            pub const MIN_EXP: i32 = <$f>::MIN_EXP;
132            #[doc = MAX_EXP!()]
133            pub const MAX_EXP: i32 = <$f>::MAX_EXP;
134
135            #[doc = MIN_10_EXP!()]
136            pub const MIN_10_EXP: i32 = <$f>::MIN_10_EXP;
137            #[doc = MAX_10_EXP!()]
138            pub const MAX_10_EXP: i32 = <$f>::MAX_10_EXP;
139
140            /* Mathematical constants related to Pi (π) */
141
142            #[doc = PI!()]
143            pub const PI: Float<$f> = Float(<$f>::PI);
144            #[doc = FRAC_PI_2!()]
145            pub const FRAC_PI_2: Float<$f> = Float(<$f>::FRAC_PI_2);
146            #[doc = FRAC_PI_3!()]
147            pub const FRAC_PI_3: Float<$f> = Float(<$f>::FRAC_PI_3);
148            #[doc = FRAC_PI_4!()]
149            pub const FRAC_PI_4: Float<$f> = Float(<$f>::FRAC_PI_4);
150            #[doc = FRAC_PI_6!()]
151            pub const FRAC_PI_6: Float<$f> = Float(<$f>::FRAC_PI_6);
152            #[doc = FRAC_PI_8!()]
153            pub const FRAC_PI_8: Float<$f> = Float(<$f>::FRAC_PI_8);
154            #[doc = SQRT_PI!()]
155            pub const SQRT_PI: Float<$f> = Float(<$f>::SQRT_PI);
156            #[doc = FRAC_1_PI!()]
157            pub const FRAC_1_PI: Float<$f> = Float(<$f>::FRAC_1_PI);
158            #[doc = FRAC_1_SQRT_PI!()]
159            pub const FRAC_1_SQRT_PI: Float<$f> = Float(<$f>::FRAC_1_SQRT_PI);
160            #[doc = FRAC_1_SQRT_2PI!()]
161            pub const FRAC_1_SQRT_2PI: Float<$f> = Float(<$f>::FRAC_1_SQRT_2PI);
162            #[doc = FRAC_2_PI!()]
163            pub const FRAC_2_PI: Float<$f> = Float(<$f>::FRAC_2_PI);
164            #[doc = FRAC_2_SQRT_PI!()]
165            pub const FRAC_2_SQRT_PI: Float<$f> = Float(<$f>::FRAC_2_SQRT_PI);
166
167            /* Mathematical constants related to Tau (τ) */
168
169            #[doc = TAU!()]
170            pub const TAU: Float<$f> = Float(<$f>::TAU);
171            #[doc = FRAC_TAU_2!()]
172            pub const FRAC_TAU_2: Float<$f> = Self::PI;
173            #[doc = FRAC_TAU_3!()]
174            pub const FRAC_TAU_3: Float<$f> = Float(<$f>::FRAC_TAU_3);
175            #[doc = FRAC_TAU_4!()]
176            pub const FRAC_TAU_4: Float<$f> = Self::FRAC_PI_2;
177            #[doc = FRAC_TAU_5!()]
178            pub const FRAC_TAU_5: Float<$f> = Float(<$f>::FRAC_TAU_5);
179            #[doc = FRAC_TAU_6!()]
180            pub const FRAC_TAU_6: Float<$f> = Self::FRAC_PI_3;
181            #[doc = FRAC_TAU_8!()]
182            pub const FRAC_TAU_8: Float<$f> = Self::FRAC_PI_4;
183            #[doc = FRAC_TAU_9!()]
184            pub const FRAC_TAU_9: Float<$f> = Float(<$f>::FRAC_TAU_9);
185            #[doc = FRAC_TAU_12!()]
186            pub const FRAC_TAU_12: Float<$f> = Self::FRAC_PI_6;
187            #[doc = FRAC_TAU_16!()]
188            pub const FRAC_TAU_16: Float<$f> = Self::FRAC_PI_8;
189            #[doc = FRAC_TAU_24!()]
190            pub const FRAC_TAU_24: Float<$f> = Float(<$f>::FRAC_TAU_24);
191            #[doc = FRAC_TAU_72!()]
192            pub const FRAC_TAU_72: Float<$f> = Float(<$f>::FRAC_TAU_72);
193            #[doc = FRAC_360_TAU!()]
194            pub const FRAC_360_TAU: Float<$f> = Float(<$f>::FRAC_360_TAU);
195            #[doc = SQRT_TAU!()]
196            pub const SQRT_TAU: Float<$f> = Float(<$f>::SQRT_TAU);
197            #[doc = FRAC_1_TAU!()]
198            pub const FRAC_1_TAU: Float<$f> = Float(<$f>::FRAC_1_TAU);
199            #[doc = FRAC_1_SQRT_TAU!()]
200            pub const FRAC_1_SQRT_TAU: Float<$f> = Float(<$f>::FRAC_1_SQRT_TAU);
201            #[doc = FRAC_2_TAU!()]
202            pub const FRAC_2_TAU: Float<$f> = Self::FRAC_1_PI;
203            #[doc = FRAC_2_SQRT_TAU!()]
204            pub const FRAC_2_SQRT_TAU: Float<$f> = Float(<$f>::FRAC_2_SQRT_TAU);
205
206            /* Degrees */
207
208            #[doc = ARC_DEGREE!()]
209            pub const ARC_DEGREE: Float<$f> = Float(<$f>::ARC_DEGREE);
210            #[doc = ARC_MINUTE!()]
211            pub const ARC_MINUTE: Float<$f> = Float(<$f>::ARC_MINUTE);
212            #[doc = ARC_SECOND!()]
213            pub const ARC_SECOND: Float<$f> = Float(<$f>::ARC_SECOND);
214
215            /* Mathematical constants related to Phi (φ) */
216
217            #[doc = PHI!()]
218            pub const PHI: Float<$f> = Float(<$f>::PHI);
219            #[doc = SQ_PHI!()]
220            pub const SQ_PHI: Float<$f> = Float(<$f>::SQ_PHI);
221            #[doc = FRAC_1_PHI!()]
222            pub const FRAC_1_PHI: Float<$f> = Float(<$f>::FRAC_1_PHI);
223            #[doc = NEG_FRAC_1_PHI!()]
224            pub const NEG_FRAC_1_PHI: Float<$f> = Float(<$f>::NEG_FRAC_1_PHI);
225            #[doc = SQRT_PHI!()]
226            pub const SQRT_PHI: Float<$f> = Float(<$f>::SQRT_PHI);
227            #[doc = FRAC_1_SQRT_PHI!()]
228            pub const FRAC_1_SQRT_PHI: Float<$f> = Float(<$f>::FRAC_1_SQRT_PHI);
229            #[doc = TRIBONACCI!()]
230            pub const TRIBONACCI: Float<$f> = Float(<$f>::TRIBONACCI);
231
232            /* Mathematical constants related to integer roots */
233
234            #[doc = SQRT_2!()]
235            pub const SQRT_2: Float<$f> = Float(<$f>::SQRT_2);
236            #[doc = FRAC_1_SQRT_2!()]
237            pub const FRAC_1_SQRT_2: Float<$f> = Float(<$f>::FRAC_1_SQRT_2);
238            #[doc = SQRT_3!()]
239            pub const SQRT_3: Float<$f> = Float(<$f>::SQRT_3);
240            #[doc = FRAC_1_SQRT_3!()]
241            pub const FRAC_1_SQRT_3: Float<$f> = Float(<$f>::FRAC_1_SQRT_3);
242            #[doc = SQRT_5!()]
243            pub const SQRT_5: Float<$f> = Float(<$f>::SQRT_5);
244            #[doc = SQRT_6!()]
245            pub const SQRT_6: Float<$f> = Float(<$f>::SQRT_6);
246            #[doc = SQRT_7!()]
247            pub const SQRT_7: Float<$f> = Float(<$f>::SQRT_7);
248            #[doc = SQRT_8!()]
249            pub const SQRT_8: Float<$f> = Float(<$f>::SQRT_8);
250            #[doc = SQRT_10!()]
251            pub const SQRT_10: Float<$f> = Float(<$f>::SQRT_10);
252            #[doc = SQRT_11!()]
253            pub const SQRT_11: Float<$f> = Float(<$f>::SQRT_11);
254            #[doc = SQRT_12!()]
255            pub const SQRT_12: Float<$f> = Float(<$f>::SQRT_12);
256            #[doc = SQRT_2!()]
257            pub const CBRT_2: Float<$f> = Float(<$f>::CBRT_2);
258            #[doc = CBRT_3!()]
259            pub const CBRT_3: Float<$f> = Float(<$f>::CBRT_3);
260            #[doc = FRAC_1_CBRT_3!()]
261            pub const FRAC_1_CBRT_3: Float<$f> = Float(<$f>::FRAC_1_CBRT_3);
262
263            /* Other mathematical constants */
264
265            #[doc = E!()]
266            pub const E: Float<$f> = Float(<$f>::E);
267            #[doc = EGAMMA!()]
268            pub const EGAMMA: Float<$f> = Float(<$f>::EGAMMA);
269            #[doc = LOG2_E!()]
270            pub const LOG2_E: Float<$f> = Float(<$f>::LOG2_E);
271            #[doc = LOG2_10!()]
272            pub const LOG2_10: Float<$f> = Float(<$f>::LOG2_10);
273            #[doc = LOG10_E!()]
274            pub const LOG10_E: Float<$f> = Float(<$f>::LOG10_E);
275            #[doc = LOG10_2!()]
276            pub const LOG10_2: Float<$f> = Float(<$f>::LOG10_2);
277            #[doc = LN_2!()]
278            pub const LN_2: Float<$f> = Float(<$f>::LN_2);
279            #[doc = LN_10!()]
280            pub const LN_10: Float<$f> = Float(<$f>::LN_10);
281        }
282    };
283}
284float_const_impls!();