pub fn si(n: i32, x: f64) -> f64 {
if x == 0.0 {
return x
}
let kmax = max_order(n);
let (mut si, co) = x.sin_cos();
let mut si2 = 0.0; let mut si1 = si; let mut sum = si;
for k in 2..=kmax {
si = 2.0*co*si1 - si2; si2 = si1;
si1 = si;
sum += si/(k as f64).powi(n);
}
sum
}
pub fn co(n: i32, x: f64) -> f64 {
let kmax = max_order(n);
let co = x.cos();
let mut co2 = 1.0; let mut co1 = co; let mut sum = co;
for k in 2..=kmax {
let con = 2.0*co*co1 - co2; co2 = co1;
co1 = con;
sum += con/(k as f64).powi(n);
}
sum
}
fn max_order(n: i32) -> i32 {
(f64::EPSILON.powf(-(n as f64).recip())).ceil() as i32
}