pub fn sqrt(x: f64) -> f64 {
x.sqrt()
}
pub fn pow<T: Into<f64>>(x: T, y: T) -> f64 {
let xf = x.into();
let yf = y.into();
xf.powf(yf)
}
pub fn abs<T: Into<f64> + Copy>(x: T) -> f64 {
x.into().abs()
}
pub fn min<T: Into<f64> + Copy>(a: T, b: T) -> f64 {
let a = a.into();
let b = b.into();
a.min(b)
}
pub fn max<T: Into<f64> + Copy>(a: T, b: T) -> f64 {
let a = a.into();
let b = b.into();
a.max(b)
}
pub fn clamp<T: Into<f64> + Copy>(x: T, min_val: T, max_val: T) -> f64 {
let x = x.into();
let min_val = min_val.into();
let max_val = max_val.into();
x.max(min_val).min(max_val)
}