softposit/p32e2/
math.rs

1use super::P32E2;
2
3pub mod sleef;
4
5const HALF: P32E2 = P32E2::new(0x_3800_0000);
6const TWO: P32E2 = P32E2::new(0x_4800_0000);
7
8impl P32E2 {
9    #[inline]
10    pub const fn trunc(self) -> Self {
11        if self.gt(Self::ZERO) {
12            self.floor()
13        } else {
14            self.ceil()
15        }
16    }
17    #[inline]
18    pub const fn fract(self) -> Self {
19        self.sub(self.trunc())
20    }
21    #[inline]
22    pub const fn div_euclid(self, rhs: Self) -> Self {
23        let q = self.div(rhs).trunc();
24        if self.rem(rhs).lt(Self::ZERO) {
25            return if rhs.gt(Self::ZERO) {
26                q.sub(Self::ONE)
27            } else {
28                q.add(Self::ONE)
29            };
30        }
31        q
32    }
33    #[inline]
34    pub const fn rem_euclid(self, rhs: Self) -> Self {
35        let r = self.rem(rhs);
36        if r.lt(Self::ZERO) {
37            r.add(rhs.abs())
38        } else {
39            r
40        }
41    }
42    #[inline]
43    pub fn powi(self, _n: i32) -> Self {
44        todo!()
45    }
46    #[inline]
47    pub fn powf(self, other: Self) -> Self {
48        sleef::pow(self, other)
49    }
50    #[inline]
51    pub fn exp(self) -> Self {
52        sleef::exp(self)
53    }
54    #[inline]
55    pub fn exp2(self) -> Self {
56        sleef::exp2(self)
57    }
58    #[inline]
59    pub fn exp10(self) -> Self {
60        sleef::exp10(self)
61    }
62    #[inline]
63    pub fn ln(self) -> Self {
64        sleef::ln(self)
65    }
66    #[inline]
67    pub fn log(self, _base: Self) -> Self {
68        todo!()
69    }
70    #[inline]
71    pub fn log2(self) -> Self {
72        sleef::log2(self)
73    }
74    #[inline]
75    pub fn log10(self) -> Self {
76        todo!()
77    }
78    #[inline]
79    pub fn cbrt(self) -> Self {
80        sleef::cbrt(self)
81    }
82    #[inline]
83    pub fn hypot(self, other: Self) -> Self {
84        sleef::hypot(self, other)
85    }
86    #[inline]
87    pub fn sin(self) -> Self {
88        sleef::sin(self)
89    }
90    #[inline]
91    pub fn cos(self) -> Self {
92        sleef::cos(self)
93    }
94    #[inline]
95    pub fn tan(self) -> Self {
96        sleef::tan(self)
97    }
98    #[inline]
99    pub fn asin(self) -> Self {
100        sleef::asin(self)
101    }
102    #[inline]
103    pub fn acos(self) -> Self {
104        sleef::acos(self)
105    }
106    #[inline]
107    pub fn atan(self) -> Self {
108        sleef::atan(self)
109    }
110    #[inline]
111    pub fn atan2(self, other: Self) -> Self {
112        sleef::atan2(self, other)
113    }
114    #[inline]
115    pub fn sin_cos(self) -> (Self, Self) {
116        sleef::sin_cos(self)
117    }
118    #[inline]
119    pub fn exp_m1(self) -> Self {
120        todo!()
121    }
122    #[inline]
123    pub const fn ln_1p(self) -> Self {
124        todo!()
125    }
126    #[inline]
127    pub fn sinh(self) -> Self {
128        sleef::sinh(self)
129    }
130    #[inline]
131    pub fn cosh(self) -> Self {
132        sleef::cosh(self)
133    }
134    #[inline]
135    pub fn tanh(self) -> Self {
136        sleef::tanh(self)
137    }
138    #[inline]
139    pub fn asinh(self) -> Self {
140        if self.is_nar() {
141            self
142        } else {
143            self.add(self.mul(self).add(Self::ONE).sqrt()).ln()
144        }
145    }
146    #[inline]
147    pub fn acosh(self) -> Self {
148        match self {
149            x if x.lt(Self::ONE) => Self::NAR,
150            x => x.add(x.mul(x).sub(Self::ONE).sqrt()).ln(),
151        }
152    }
153    #[inline]
154    pub const fn atanh(self) -> Self {
155        HALF.mul(TWO.mul(self).div(Self::ONE.sub(self)).ln_1p())
156    }
157}
158
159mod ceil;
160mod floor;
161mod mul_add;
162mod round;
163mod sqrt;