1 | //! Embedded-friendly (i.e. `#![no_std]`) math library featuring fast, safe |
2 | //! floating point approximations for common arithmetic operations, as well as |
3 | //! 2D and 3D vector types, statistical analysis functions, and quaternions. |
4 | //! |
5 | //! ## Floating point approximations: `F32` and `F32Ext` |
6 | //! |
7 | //! `micromath` supports approximating many arithmetic operations on `f32` |
8 | //! using bitwise operations, providing great performance and small code size |
9 | //! at the cost of precision. For use cases like graphics and signal |
10 | //! processing, these approximations are often sufficient and the performance |
11 | //! gains worth the lost precision. |
12 | //! |
13 | //! These approximations are defined on the [`F32`] newtype wrapper. |
14 | //! |
15 | //! ### `F32Ext` extension trait |
16 | //! |
17 | //! Floating point approximations can used via the the [`F32Ext`] trait which |
18 | //! is impl'd for `f32`, providing a drop-in `std`-compatible API. |
19 | //! |
20 | //! ``` |
21 | //! use micromath::F32Ext; |
22 | //! |
23 | //! let n = 2.0.sqrt(); |
24 | //! assert_eq!(n, 1.5); // close enough |
25 | //! ``` |
26 | //! |
27 | //! Since the `F32Ext` trait provides methods which are already defined in |
28 | //! `std`, in cases where your crate links `std` the `F32Ext` versions of |
29 | //! the same methods will not be used, in which case you will get an unused |
30 | //! import warning for `F32Ext`. |
31 | //! |
32 | //! If you encounter this, add an `#[allow(unused_imports)]` above the import. |
33 | //! |
34 | //! ``` |
35 | //! #[allow(unused_imports)] |
36 | //! use micromath::F32Ext; |
37 | //! ``` |
38 | //! |
39 | //! ## Vector types |
40 | //! |
41 | //! See the [`vector`] module for more information on vector types. |
42 | //! |
43 | //! The following vector types are available, all of which have `pub x` and |
44 | //! `pub y` (and on 3D vectors, `pub z`) members: |
45 | //! |
46 | //! | Rust | 2D | 3D | |
47 | //! |-------|---------|---------| |
48 | //! | `i8` | `I8x2` | `I8x3` | |
49 | //! | `i16` | `I16x2` | `I16x3` | |
50 | //! | `i32` | `I32x2` | `I32x3` | |
51 | //! | `u8` | `U8x2` | `U8x3` | |
52 | //! | `u16` | `U16x2` | `U16x3` | |
53 | //! | `u32` | `U32x2` | `U32x3` | |
54 | //! | `f32` | `F32x2` | `F32x3` | |
55 | //! |
56 | //! ## Statistical analysis |
57 | //! |
58 | //! See the [`statistics`] module for more information on statistical analysis |
59 | //! traits and functionality. |
60 | //! |
61 | //! The following traits are available and impl'd for slices and iterators of |
62 | //! `f32` (and can be impl'd for other types): |
63 | //! |
64 | //! - [`Mean`][`statistics::Mean`] - compute arithmetic mean with the `mean()` method. |
65 | //! - [`StdDev`][`statistics::StdDev`] - compute standard deviation with the `stddev()` method. |
66 | //! - [`Trim`][`statistics::Trim`] - cull outliers from a sample slice with the `trim()` method. |
67 | //! - [`Variance`][`statistics::Variance`] - compute variance with the `variance()` method. |
68 | |
69 | #![no_std ] |
70 | #![cfg_attr (docsrs, feature(doc_cfg))] |
71 | #![doc ( |
72 | html_logo_url = "https://raw.githubusercontent.com/tarcieri/micromath/main/img/micromath-sq.png" , |
73 | html_root_url = "https://docs.rs/micromath/2.0.0" |
74 | )] |
75 | #![forbid (unsafe_code)] |
76 | #![warn ( |
77 | missing_docs, |
78 | rust_2018_idioms, |
79 | trivial_casts, |
80 | trivial_numeric_casts, |
81 | unused_qualifications |
82 | )] |
83 | |
84 | #[cfg (feature = "statistics" )] |
85 | #[cfg_attr (docsrs, doc(cfg(feature = "statistics" )))] |
86 | pub mod statistics; |
87 | |
88 | #[cfg (feature = "vector" )] |
89 | #[cfg_attr (docsrs, doc(cfg(feature = "vector" )))] |
90 | pub mod vector; |
91 | |
92 | mod f32ext; |
93 | mod float; |
94 | #[cfg (feature = "quaternion" )] |
95 | mod quaternion; |
96 | |
97 | pub use crate::{f32ext::F32Ext, float::F32}; |
98 | |
99 | #[cfg (feature = "quaternion" )] |
100 | pub use crate::quaternion::Quaternion; |
101 | |
102 | #[cfg (feature = "num-traits" )] |
103 | #[cfg_attr (docsrs, doc(cfg(feature = "num-traits" )))] |
104 | pub use num_traits; |
105 | |