use std::ops::Neg;
pub fn sgn(xin: f64) -> f64 {
if xin > 0.0 {
return 1.0;
} else {
return -1.0;
}
}
pub fn sgn2_64(xin: f64) -> i32 {
if xin > 0.0 {
1
} else if xin == 0.0 {
0
} else {
-1
}
}
pub fn limit_float<T>(fin: T, f_bound: T) -> T
where
T: Default + Copy + PartialOrd + Neg<Output = T>,
{
let f_value: T;
if fin > f_bound {
f_value = f_bound;
} else if fin < -f_bound {
f_value = -f_bound;
} else {
f_value = fin;
}
f_value
}
#[cfg(test)]
mod tests {
use super::*;
use approx::assert_relative_eq;
#[test]
fn test_sgn2_64() {
assert_eq!(sgn2_64(10.0), 1);
assert_eq!(sgn2_64(-5.0), -1);
assert_eq!(sgn2_64(0.0), 0);
}
#[test]
fn test_limit_float() {
assert_relative_eq!(limit_float(0.0, 1.0), 0.0);
assert_relative_eq!(limit_float(-0.0, 1.0), 0.0);
assert_relative_eq!(limit_float(1.0, 1.0), 1.0);
assert_relative_eq!(limit_float(-1.0, 1.0), -1.0);
assert_relative_eq!(limit_float(1.8, 1.0), 1.0);
assert_relative_eq!(limit_float(-1.8, 1.0), -1.0);
assert_relative_eq!(limit_float(0.5, 1.0), 0.5);
}
#[test]
fn test_sgn() {
assert_relative_eq!(sgn(0.0), -1.0);
assert_relative_eq!(sgn(-0.0), -1.0);
assert_relative_eq!(sgn(1.0), 1.0);
assert_relative_eq!(sgn(-1.0), -1.0);
}
}