Fixed up nostd support, verified that sqrt and cbrt routines work to within 1ULP
This commit is contained in:
@@ -5,43 +5,30 @@ fn ulp(f: f32) -> f32 {
|
||||
}
|
||||
|
||||
fn fn_err(actual: f32, calc: f32) -> f32 {
|
||||
(calc - actual).abs() / actual
|
||||
(calc - actual).abs() / ulp(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()
|
||||
let errors =
|
||||
(0x01..=0xfe).into_par_iter()
|
||||
.map(|exp| {
|
||||
(0x0..=0x7f_ffff).map(|mant| f32::from_bits((exp << 23) + mant))
|
||||
let max_err_place = (0x0..=0x7f_ffff).map(|mant| f32::from_bits((exp << 23) + mant))
|
||||
.max_by_key(|value| fn_err(actual(*value), calc(*value)).to_bits())
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
(exp, max_err_place, fn_err(actual(max_err_place), calc(max_err_place)))
|
||||
})
|
||||
.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;
|
||||
}
|
||||
for (exp, base, err) in errors {
|
||||
println!("{},{},{}", exp as i32 - 127,base, err);
|
||||
}
|
||||
|
||||
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("sqrt", f32::sqrt, jerk_control::math_ext::Roots::sqrt);
|
||||
test_all("cbrt", f32::cbrt, jerk_control::math_ext::Roots::cbrt);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user