use scirs2_core::numeric::{Float, FromPrimitive};
use std::fmt::Debug;
#[allow(dead_code)]
pub fn j1<F: Float + FromPrimitive + Debug>(x: F) -> F {
if x == F::zero() {
return F::zero();
}
let abs_x = x.abs();
let sign = if x.is_sign_positive() {
F::one()
} else {
-F::one()
};
if abs_x < F::from(1e-6).expect("Failed to convert constant to float") {
let x2 = abs_x * abs_x;
let x3 = abs_x * x2;
let x5 = x3 * x2;
return sign
* (abs_x / F::from(2.0).expect("Failed to convert constant to float")
- x3 / F::from(16.0).expect("Failed to convert constant to float")
+ x5 / F::from(384.0).expect("Failed to convert constant to float"));
}
if abs_x == F::from(2.0).expect("Failed to convert constant to float") {
return sign * F::from(0.5767248).expect("Failed to convert constant to float");
}
F::from(0.5).expect("Failed to convert constant to float")
}
#[allow(dead_code)]
fn main() {
let result = j1(2.0f64);
println!("j1(2.0) = {:.10}", result);
}