1use crate::types::{U0F128, U1F127, U2F126, U3F125};
35
36pub const TAU: U3F125 = U3F125::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);
39
40pub const FRAC_TAU_2: U2F126 = U2F126::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);
43
44pub const FRAC_TAU_3: U2F126 = U2F126::from_bits(0x860A_91C1_6B9B_2C23_2DD9_9707_AB3D_688B);
47
48pub const FRAC_TAU_4: U1F127 = U1F127::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);
51
52pub const FRAC_TAU_6: U1F127 = U1F127::from_bits(0x860A_91C1_6B9B_2C23_2DD9_9707_AB3D_688B);
55
56pub const FRAC_TAU_8: U0F128 = U0F128::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);
59
60pub const FRAC_TAU_12: U0F128 = U0F128::from_bits(0x860A_91C1_6B9B_2C23_2DD9_9707_AB3D_688B);
63
64pub const FRAC_1_TAU: U0F128 = U0F128::from_bits(0x28BE_60DB_9391_054A_7F09_D5F4_7D4D_3770);
67
68pub const FRAC_2_TAU: U0F128 = U0F128::from_bits(0x517C_C1B7_2722_0A94_FE13_ABE8_FA9A_6EE0);
71
72pub const FRAC_4_TAU: U0F128 = U0F128::from_bits(0xA2F9_836E_4E44_1529_FC27_57D1_F534_DDC0);
75
76pub const PI: U2F126 = U2F126::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);
79
80pub const FRAC_PI_2: U1F127 = U1F127::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);
83
84pub const FRAC_PI_3: U1F127 = U1F127::from_bits(0x860A_91C1_6B9B_2C23_2DD9_9707_AB3D_688B);
87
88pub const FRAC_PI_4: U0F128 = U0F128::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);
91
92pub const FRAC_PI_6: U0F128 = U0F128::from_bits(0x860A_91C1_6B9B_2C23_2DD9_9707_AB3D_688B);
95
96pub const FRAC_PI_8: U0F128 = U0F128::from_bits(0x6487_ED51_10B4_611A_6263_3145_C06E_0E68);
99
100pub const FRAC_1_PI: U0F128 = U0F128::from_bits(0x517C_C1B7_2722_0A94_FE13_ABE8_FA9A_6EE0);
103
104pub const FRAC_2_PI: U0F128 = U0F128::from_bits(0xA2F9_836E_4E44_1529_FC27_57D1_F534_DDC0);
107
108pub const FRAC_2_SQRT_PI: U1F127 = U1F127::from_bits(0x906E_BA82_14DB_688D_71D4_8A7F_6BFE_C344);
111
112pub const SQRT_2: U1F127 = U1F127::from_bits(0xB504_F333_F9DE_6484_597D_89B3_754A_BE9F);
115
116pub const FRAC_1_SQRT_2: U0F128 = U0F128::from_bits(0xB504_F333_F9DE_6484_597D_89B3_754A_BE9F);
119
120pub const E: U2F126 = U2F126::from_bits(0xADF8_5458_A2BB_4A9A_AFDC_5620_273D_3CF1);
123
124pub const LOG2_10: U2F126 = U2F126::from_bits(0xD49A_784B_CD1B_8AFE_492B_F6FF_4DAF_DB4C);
127
128pub const LOG2_E: U1F127 = U1F127::from_bits(0xB8AA_3B29_5C17_F0BB_BE87_FED0_691D_3E88);
131
132pub const LOG10_2: U0F128 = U0F128::from_bits(0x4D10_4D42_7DE7_FBCC_47C4_ACD6_05BE_48BC);
135
136pub const LOG10_E: U0F128 = U0F128::from_bits(0x6F2D_EC54_9B94_38CA_9AAD_D557_D699_EE19);
139
140pub const LN_2: U0F128 = U0F128::from_bits(0xB172_17F7_D1CF_79AB_C9E3_B398_03F2_F6AF);
143
144pub const LN_10: U2F126 = U2F126::from_bits(0x935D_8DDD_AAA8_AC16_EA56_D62B_82D3_0A28);
147
148#[cfg(test)]
149#[allow(clippy::cognitive_complexity, clippy::float_cmp)]
150mod tests {
151 use crate::{
152 consts::*,
153 traits::{Fixed, FromFixed},
154 };
155 use core::{convert::TryFrom, f32, f64};
156
157 #[cfg(feature = "f16")]
158 #[test]
159 fn cmp_f16() {
160 use half::{self, f16};
161 assert_eq!(f16::from_fixed(TAU), f16::from_f32(f32::consts::PI * 2.0));
162 assert_eq!(f16::from_fixed(FRAC_TAU_2), f16::PI);
163 assert_eq!(
164 f16::from_fixed(FRAC_TAU_3),
165 f16::from_f32(f32::consts::FRAC_PI_3 * 2.0)
166 );
167 assert_eq!(f16::from_fixed(FRAC_TAU_4), f16::FRAC_PI_2);
168 assert_eq!(f16::from_fixed(FRAC_TAU_6), f16::FRAC_PI_3);
169 assert_eq!(f16::from_fixed(FRAC_TAU_8), f16::FRAC_PI_4);
170 assert_eq!(f16::from_fixed(FRAC_TAU_12), f16::FRAC_PI_6);
171 assert_eq!(
172 f16::from_fixed(FRAC_1_TAU),
173 f16::from_f32(f32::consts::FRAC_1_PI * 0.5)
174 );
175 assert_eq!(f16::from_fixed(FRAC_2_TAU), f16::FRAC_1_PI);
176 assert_eq!(f16::from_fixed(FRAC_4_TAU), f16::FRAC_2_PI);
177 assert_eq!(f16::from_fixed(PI), f16::PI);
178 assert_eq!(f16::from_fixed(FRAC_PI_2), f16::FRAC_PI_2);
179 assert_eq!(f16::from_fixed(FRAC_PI_3), f16::FRAC_PI_3);
180 assert_eq!(f16::from_fixed(FRAC_PI_4), f16::FRAC_PI_4);
181 assert_eq!(f16::from_fixed(FRAC_PI_6), f16::FRAC_PI_6);
182 assert_eq!(f16::from_fixed(FRAC_PI_8), f16::FRAC_PI_8);
183 assert_eq!(f16::from_fixed(FRAC_1_PI), f16::FRAC_1_PI);
184 assert_eq!(f16::from_fixed(FRAC_2_PI), f16::FRAC_2_PI);
185 assert_eq!(f16::from_fixed(FRAC_2_SQRT_PI), f16::FRAC_2_SQRT_PI);
186 assert_eq!(f16::from_fixed(SQRT_2), f16::SQRT_2);
187 assert_eq!(f16::from_fixed(FRAC_1_SQRT_2), f16::FRAC_1_SQRT_2);
188 assert_eq!(f16::from_fixed(E), f16::E);
189 assert_eq!(f16::from_fixed(LOG2_E), f16::LOG2_E);
191 assert_eq!(f16::from_fixed(LOG10_E), f16::LOG10_E);
193 assert_eq!(f16::from_fixed(LN_2), f16::LN_2);
194 assert_eq!(f16::from_fixed(LN_10), f16::LN_10);
195 }
196
197 #[cfg(feature = "f16")]
198 #[test]
199 fn cmp_bf16() {
200 use half::{self, bf16};
201 assert_eq!(bf16::from_fixed(TAU), bf16::from_f32(f32::consts::PI * 2.0));
202 assert_eq!(bf16::from_fixed(FRAC_TAU_2), bf16::PI);
203 assert_eq!(
204 bf16::from_fixed(FRAC_TAU_3),
205 bf16::from_f32(f32::consts::FRAC_PI_3 * 2.0)
206 );
207 assert_eq!(bf16::from_fixed(FRAC_TAU_4), bf16::FRAC_PI_2);
208 assert_eq!(bf16::from_fixed(FRAC_TAU_6), bf16::FRAC_PI_3);
209 assert_eq!(bf16::from_fixed(FRAC_TAU_8), bf16::FRAC_PI_4);
210 assert_eq!(bf16::from_fixed(FRAC_TAU_12), bf16::FRAC_PI_6);
211 assert_eq!(
212 bf16::from_fixed(FRAC_1_TAU),
213 bf16::from_f32(f32::consts::FRAC_1_PI * 0.5)
214 );
215 assert_eq!(bf16::from_fixed(FRAC_2_TAU), bf16::FRAC_1_PI);
216 assert_eq!(bf16::from_fixed(FRAC_4_TAU), bf16::FRAC_2_PI);
217 assert_eq!(bf16::from_fixed(PI), bf16::PI);
218 assert_eq!(bf16::from_fixed(FRAC_PI_2), bf16::FRAC_PI_2);
219 assert_eq!(bf16::from_fixed(FRAC_PI_3), bf16::FRAC_PI_3);
220 assert_eq!(bf16::from_fixed(FRAC_PI_4), bf16::FRAC_PI_4);
221 assert_eq!(bf16::from_fixed(FRAC_PI_6), bf16::FRAC_PI_6);
222 assert_eq!(bf16::from_fixed(FRAC_PI_8), bf16::FRAC_PI_8);
223 assert_eq!(bf16::from_fixed(FRAC_1_PI), bf16::FRAC_1_PI);
224 assert_eq!(bf16::from_fixed(FRAC_2_PI), bf16::FRAC_2_PI);
225 assert_eq!(bf16::from_fixed(FRAC_2_SQRT_PI), bf16::FRAC_2_SQRT_PI);
226 assert_eq!(bf16::from_fixed(SQRT_2), bf16::SQRT_2);
227 assert_eq!(bf16::from_fixed(FRAC_1_SQRT_2), bf16::FRAC_1_SQRT_2);
228 assert_eq!(bf16::from_fixed(E), bf16::E);
229 assert_eq!(bf16::from_fixed(LOG2_E), bf16::LOG2_E);
231 assert_eq!(bf16::from_fixed(LOG10_E), bf16::LOG10_E);
233 assert_eq!(bf16::from_fixed(LN_2), bf16::LN_2);
234 assert_eq!(bf16::from_fixed(LN_10), bf16::LN_10);
235 }
236
237 #[test]
238 fn cmp_f32() {
239 assert_eq!(f32::from_fixed(TAU), f32::consts::PI * 2.0);
240 assert_eq!(f32::from_fixed(FRAC_TAU_2), f32::consts::PI);
241 assert_eq!(f32::from_fixed(FRAC_TAU_3), f32::consts::FRAC_PI_3 * 2.0);
242 assert_eq!(f32::from_fixed(FRAC_TAU_4), f32::consts::FRAC_PI_2);
243 assert_eq!(f32::from_fixed(FRAC_TAU_6), f32::consts::FRAC_PI_3);
244 assert_eq!(f32::from_fixed(FRAC_TAU_8), f32::consts::FRAC_PI_4);
245 assert_eq!(f32::from_fixed(FRAC_TAU_12), f32::consts::FRAC_PI_6);
246 assert_eq!(f32::from_fixed(FRAC_1_TAU), f32::consts::FRAC_1_PI * 0.5);
247 assert_eq!(f32::from_fixed(FRAC_2_TAU), f32::consts::FRAC_1_PI);
248 assert_eq!(f32::from_fixed(FRAC_4_TAU), f32::consts::FRAC_2_PI);
249 assert_eq!(f32::from_fixed(PI), f32::consts::PI);
250 assert_eq!(f32::from_fixed(FRAC_PI_2), f32::consts::FRAC_PI_2);
251 assert_eq!(f32::from_fixed(FRAC_PI_3), f32::consts::FRAC_PI_3);
252 assert_eq!(f32::from_fixed(FRAC_PI_4), f32::consts::FRAC_PI_4);
253 assert_eq!(f32::from_fixed(FRAC_PI_6), f32::consts::FRAC_PI_6);
254 assert_eq!(f32::from_fixed(FRAC_PI_8), f32::consts::FRAC_PI_8);
255 assert_eq!(f32::from_fixed(FRAC_1_PI), f32::consts::FRAC_1_PI);
256 assert_eq!(f32::from_fixed(FRAC_2_PI), f32::consts::FRAC_2_PI);
257 assert_eq!(f32::from_fixed(FRAC_2_SQRT_PI), f32::consts::FRAC_2_SQRT_PI);
258 assert_eq!(f32::from_fixed(SQRT_2), f32::consts::SQRT_2);
259 assert_eq!(f32::from_fixed(FRAC_1_SQRT_2), f32::consts::FRAC_1_SQRT_2);
260 assert_eq!(f32::from_fixed(E), f32::consts::E);
261 assert_eq!(f32::from_fixed(LOG2_E), f32::consts::LOG2_E);
263 assert_eq!(f32::from_fixed(LOG10_E), f32::consts::LOG10_E);
265 assert_eq!(f32::from_fixed(LN_2), f32::consts::LN_2);
266 assert_eq!(f32::from_fixed(LN_10), f32::consts::LN_10);
267 }
268
269 #[test]
270 fn cmp_f64() {
271 assert_eq!(f64::from_fixed(TAU), f64::consts::PI * 2.0);
272 assert_eq!(f64::from_fixed(FRAC_TAU_2), f64::consts::PI);
273 assert_eq!(f64::from_fixed(FRAC_TAU_3), f64::consts::FRAC_PI_3 * 2.0);
274 assert_eq!(f64::from_fixed(FRAC_TAU_4), f64::consts::FRAC_PI_2);
275 assert_eq!(f64::from_fixed(FRAC_TAU_6), f64::consts::FRAC_PI_3);
276 assert_eq!(f64::from_fixed(FRAC_TAU_8), f64::consts::FRAC_PI_4);
277 assert_eq!(f64::from_fixed(FRAC_TAU_12), f64::consts::FRAC_PI_6);
278 assert_eq!(f64::from_fixed(FRAC_1_TAU), f64::consts::FRAC_1_PI * 0.5);
279 assert_eq!(f64::from_fixed(FRAC_2_TAU), f64::consts::FRAC_1_PI);
280 assert_eq!(f64::from_fixed(FRAC_4_TAU), f64::consts::FRAC_2_PI);
281 assert_eq!(f64::from_fixed(PI), f64::consts::PI);
282 assert_eq!(f64::from_fixed(FRAC_PI_2), f64::consts::FRAC_PI_2);
283 assert_eq!(f64::from_fixed(FRAC_PI_3), f64::consts::FRAC_PI_3);
284 assert_eq!(f64::from_fixed(FRAC_PI_4), f64::consts::FRAC_PI_4);
285 assert_eq!(f64::from_fixed(FRAC_PI_6), f64::consts::FRAC_PI_6);
286 assert_eq!(f64::from_fixed(FRAC_PI_8), f64::consts::FRAC_PI_8);
287 assert_eq!(f64::from_fixed(FRAC_1_PI), f64::consts::FRAC_1_PI);
288 assert_eq!(f64::from_fixed(FRAC_2_PI), f64::consts::FRAC_2_PI);
289 assert_eq!(f64::from_fixed(FRAC_2_SQRT_PI), f64::consts::FRAC_2_SQRT_PI);
290 assert_eq!(f64::from_fixed(SQRT_2), f64::consts::SQRT_2);
291 assert_eq!(f64::from_fixed(FRAC_1_SQRT_2), f64::consts::FRAC_1_SQRT_2);
292 assert_eq!(f64::from_fixed(E), f64::consts::E);
293 assert_eq!(f64::from_fixed(LOG2_E), f64::consts::LOG2_E);
295 assert_eq!(f64::from_fixed(LOG10_E), f64::consts::LOG10_E);
297 assert_eq!(f64::from_fixed(LN_2), f64::consts::LN_2);
298 assert_eq!(f64::from_fixed(LN_10), f64::consts::LN_10);
299 }
300
301 fn compare_parse<F: Fixed>(f: F, s: &str)
302 where
303 F::Bits: TryFrom<u8>,
304 {
305 let sf = F::from_str(s).unwrap();
306 let f_plus = f + F::from_bits(F::Bits::try_from(1).ok().unwrap());
307 assert!(f <= sf && sf <= f_plus);
308 }
309
310 #[test]
311 fn cmp_parse() {
312 compare_parse(TAU, "6.283185307179586476925286766559005768394");
313 compare_parse(FRAC_TAU_2, "3.141592653589793238462643383279502884197");
314 compare_parse(FRAC_TAU_3, "2.094395102393195492308428922186335256131");
315 compare_parse(FRAC_TAU_4, "1.570796326794896619231321691639751442098");
316 compare_parse(FRAC_TAU_6, "1.047197551196597746154214461093167628065");
317 compare_parse(FRAC_TAU_8, "0.7853981633974483096156608458198757210492");
318 compare_parse(FRAC_TAU_12, "0.5235987755982988730771072305465838140328");
319 compare_parse(FRAC_1_TAU, "0.1591549430918953357688837633725143620344");
320 compare_parse(FRAC_2_TAU, "0.3183098861837906715377675267450287240689");
321 compare_parse(FRAC_4_TAU, "0.6366197723675813430755350534900574481378");
322 compare_parse(PI, "3.141592653589793238462643383279502884197");
323 compare_parse(FRAC_PI_2, "1.570796326794896619231321691639751442098");
324 compare_parse(FRAC_PI_3, "1.047197551196597746154214461093167628065");
325 compare_parse(FRAC_PI_4, "0.7853981633974483096156608458198757210492");
326 compare_parse(FRAC_PI_6, "0.5235987755982988730771072305465838140328");
327 compare_parse(FRAC_PI_8, "0.3926990816987241548078304229099378605246");
328 compare_parse(FRAC_1_PI, "0.3183098861837906715377675267450287240689");
329 compare_parse(FRAC_2_PI, "0.6366197723675813430755350534900574481378");
330 compare_parse(FRAC_2_SQRT_PI, "1.128379167095512573896158903121545171688");
331 compare_parse(SQRT_2, "1.414213562373095048801688724209698078569");
332 compare_parse(FRAC_1_SQRT_2, "0.7071067811865475244008443621048490392848");
333 compare_parse(E, "2.718281828459045235360287471352662497757");
334 compare_parse(LOG2_10, "3.321928094887362347870319429489390175864");
335 compare_parse(LOG2_E, "1.442695040888963407359924681001892137426");
336 compare_parse(LOG10_2, "0.3010299956639811952137388947244930267681");
337 compare_parse(LOG10_E, "0.4342944819032518276511289189166050822943");
338 compare_parse(LN_2, "0.6931471805599453094172321214581765680755");
339 compare_parse(LN_10, "2.302585092994045684017991454684364207601");
340 }
341}