simba/simd/
simd_real.rs

1use crate::scalar::RealField;
2use crate::simd::{SimdComplexField, SimdPartialOrd, SimdSigned};
3
4/// Lanewise generalization of `RealField` for SIMD reals.
5///
6/// Each lane of an SIMD real field should contain one real field.
7/// This is implemented by scalar reals like `f32` and `f64` as well as SIMD reals like `portable_simd::f32x4`.
8#[allow(missing_docs)]
9pub trait SimdRealField:
10    SimdPartialOrd + SimdSigned + SimdComplexField<SimdRealField = Self>
11{
12    /// Copies the sign of `sign` to `self`.
13    ///
14    /// - Returns `self.simd_abs()` if `sign` is positive or positive-zero.
15    /// - Returns `-self.simd_abs()` if `sign` is negative or negative-zero.
16    fn simd_copysign(self, sign: Self) -> Self;
17    fn simd_atan2(self, other: Self) -> Self;
18
19    fn simd_default_epsilon() -> Self;
20    fn simd_pi() -> Self;
21    fn simd_two_pi() -> Self;
22    fn simd_frac_pi_2() -> Self;
23    fn simd_frac_pi_3() -> Self;
24    fn simd_frac_pi_4() -> Self;
25    fn simd_frac_pi_6() -> Self;
26    fn simd_frac_pi_8() -> Self;
27    fn simd_frac_1_pi() -> Self;
28    fn simd_frac_2_pi() -> Self;
29    fn simd_frac_2_sqrt_pi() -> Self;
30
31    fn simd_e() -> Self;
32    fn simd_log2_e() -> Self;
33    fn simd_log10_e() -> Self;
34    fn simd_ln_2() -> Self;
35    fn simd_ln_10() -> Self;
36}
37
38// Blanket impl RealField => SimdRealField
39impl<T: RealField> SimdRealField for T {
40    #[inline(always)]
41    fn simd_atan2(self, other: Self) -> Self {
42        self.atan2(other)
43    }
44
45    #[inline(always)]
46    fn simd_default_epsilon() -> Self {
47        Self::default_epsilon()
48    }
49    #[inline(always)]
50    fn simd_copysign(self, sign: Self) -> Self {
51        self.copysign(sign)
52    }
53    #[inline(always)]
54    fn simd_pi() -> Self {
55        Self::pi()
56    }
57    #[inline(always)]
58    fn simd_two_pi() -> Self {
59        Self::two_pi()
60    }
61    #[inline(always)]
62    fn simd_frac_pi_2() -> Self {
63        Self::frac_pi_2()
64    }
65    #[inline(always)]
66    fn simd_frac_pi_3() -> Self {
67        Self::frac_pi_3()
68    }
69    #[inline(always)]
70    fn simd_frac_pi_4() -> Self {
71        Self::frac_pi_4()
72    }
73    #[inline(always)]
74    fn simd_frac_pi_6() -> Self {
75        Self::frac_pi_6()
76    }
77    #[inline(always)]
78    fn simd_frac_pi_8() -> Self {
79        Self::frac_pi_8()
80    }
81    #[inline(always)]
82    fn simd_frac_1_pi() -> Self {
83        Self::frac_1_pi()
84    }
85    #[inline(always)]
86    fn simd_frac_2_pi() -> Self {
87        Self::frac_2_pi()
88    }
89    #[inline(always)]
90    fn simd_frac_2_sqrt_pi() -> Self {
91        Self::frac_2_sqrt_pi()
92    }
93
94    #[inline(always)]
95    fn simd_e() -> Self {
96        Self::e()
97    }
98    #[inline(always)]
99    fn simd_log2_e() -> Self {
100        Self::log2_e()
101    }
102    #[inline(always)]
103    fn simd_log10_e() -> Self {
104        Self::log10_e()
105    }
106    #[inline(always)]
107    fn simd_ln_2() -> Self {
108        Self::ln_2()
109    }
110    #[inline(always)]
111    fn simd_ln_10() -> Self {
112        Self::ln_10()
113    }
114}