Added missing math extensions
This commit is contained in:
78
firmware/jerk_control/src/math_ext.rs
Normal file
78
firmware/jerk_control/src/math_ext.rs
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
|
||||||
|
pub trait Roots {
|
||||||
|
fn sqrt(self) -> Self;
|
||||||
|
fn cbrt(self) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(ignore)]
|
||||||
|
impl Roots for u64 {
|
||||||
|
fn sqrt(self) -> Self {
|
||||||
|
let mut estimate = self / 2;
|
||||||
|
for _ in 0..6 {
|
||||||
|
estimate = (self / estimate + estimate) / 2;
|
||||||
|
}
|
||||||
|
estimate
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cbrt(self) -> Self {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(ignore)]
|
||||||
|
impl Roots for u32 {
|
||||||
|
fn sqrt(self) -> Self {
|
||||||
|
let mut estimate = self / 2;
|
||||||
|
for _ in 0..5 {
|
||||||
|
estimate = (self / estimate + estimate) / 2;
|
||||||
|
}
|
||||||
|
estimate
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cbrt(self) -> Self {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn sqrt_approx(value: f32) -> f32 {
|
||||||
|
f32::from_bits((value.to_bits() + 0x3f80_0000) >> 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cbrt_approx(value: f32) -> f32 {
|
||||||
|
let value = value.to_bits();
|
||||||
|
|
||||||
|
const EXP_BIAS: i32 = 0x3f80_0000;
|
||||||
|
|
||||||
|
f32::from_bits((value & 0x8000_0000) |
|
||||||
|
(((value as i32 & 0x7fff_ffff) - EXP_BIAS) / 3 + EXP_BIAS) as u32)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Roots for f32 {
|
||||||
|
fn sqrt(self) -> Self {
|
||||||
|
let mut estimate = sqrt_approx(self);
|
||||||
|
for _ in 0..5 {
|
||||||
|
estimate = (self / estimate + estimate) / 2.;
|
||||||
|
}
|
||||||
|
estimate
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cbrt(self) -> Self {
|
||||||
|
let mut estimate = cbrt_approx(self); // TODO: improve this with bit twiddling
|
||||||
|
|
||||||
|
// Use halley's method to refine the approximation.
|
||||||
|
for _ in 0..3 {
|
||||||
|
let e3 = estimate * estimate * estimate;
|
||||||
|
estimate = estimate * (e3 + self + self) / ( e3 + e3 + self);
|
||||||
|
}
|
||||||
|
|
||||||
|
estimate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::Roots;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user