Modified jerk planner to use no_std and custom sqrt and cbrt routines. These routines do not seem to work yet

This commit is contained in:
TQ Hirsch
2022-04-24 23:59:13 +02:00
parent ce6a6be1e9
commit 7685ed1ab7
6 changed files with 96 additions and 6 deletions

View File

@@ -7,4 +7,6 @@ edition = "2021"
[dependencies]
jerk_control = { path = "../jerk_control" }
structopt = { version = "0.3.26" }
# structopt = { version = "0.3.26" }
rayon = "1.5.2"

View File

@@ -0,0 +1,47 @@
use rayon::prelude::*;
fn ulp(f: f32) -> f32 {
f32::from_bits((f.to_bits() & 0x7f80_0000) - 0x0b80_0000)
}
fn fn_err(actual: f32, calc: f32) -> f32 {
(calc - actual).abs() / actual
}
fn test_all(fname: &str, actual: fn(f32) -> f32, calc: fn(f32) -> f32) {
let mut max_err = 0f32;
let mut max_err_value = 0f32;
(0x01..=0xfe).into_par_iter()
.map(|exp| {
(0x0..=0x7f_ffff).map(|mant| f32::from_bits((exp << 23) + mant))
.max_by_key(|value| fn_err(actual(*value), calc(*value)).to_bits())
.unwrap()
})
.map(|value| (value,fn_err(actual(value), calc(value))))
.collect::<Vec<_>>();
for i in (0x0400_0000..0x0f7f_ffffu32).map(f32::from_bits) {
// range of normalized floats...
let err = fn_err(actual(i), calc(i));
if err > max_err {
max_err = err;
max_err_value = i;
}
}
let max_err_pct = max_err * 100f32;
println!("{}: {}% @ {}", fname, max_err_pct, max_err_value);
println!(
"Value: 0x{:08x}\n
Calculated: 0x{:08x}\n
Actual: 0x{:08x}",
max_err_value.to_bits(),
calc(max_err_value).to_bits(), actual(max_err_value).to_bits())
}
fn main() {
// test_all("sqrt", f32::sqrt, jerk_control::math_ext::Roots::sqrt);
test_all("cbrt", f32::cbrt, jerk_control::math_ext::Roots::cbrt);
}