use num_traits::Float;
pub fn cospi(mut x: f64) -> f64 {
if x.is_nan() {
return x;
} if !x.is_finite() {
return f64::nan();
}
x = x.abs() % 2.0;
if x % 1.0 == 0.5 {
return 0.0;
}
if x == 1.0 {
return -1.0;
}
if x == 0.0 {
return 1.0;
}
(std::f64::consts::PI * x).cos()
}
pub fn sinpi(mut x: f64) -> f64 {
if x.is_nan() {
return x;
} if !x.is_finite() {
return f64::nan();
}
x %= 2.0;
if x <= -1.0 {
x += 2.0
} else if x > 1.0 {
x -= 2.0
}
if x == 0.0 || x == 1.0 {
return 0.0;
}
if x == 0.5 {
return 1.0;
}
if x == -0.5 {
return -1.0;
}
(std::f64::consts::PI * x).sin()
}
pub fn tanpi(mut x: f64) -> f64 {
if x.is_nan() {
return x;
} if !x.is_finite() {
return f64::nan();
}
x %= 1.0;
if x <= -0.5 {
x += 1.
} else if x > 0.5 {
x -= 1.
}
if x == 0.0 {
0.0
} else if x == 0.5 {
f64::nan()
} else if x == 0.25 {
1.0
} else if x == -0.25 {
-1.0
} else {
(std::f64::consts::PI * x).tan()
}
}