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;