#[inline(always)]
pub fn add(values: &[f64]) -> f64 {
if values.is_empty() {
return 0.0;
}
values.iter().sum()
}
#[inline(always)]
pub fn sub(values: &[f64]) -> f64 {
if values.is_empty() {
panic!("`sub` function needs at least one argument");
}
let first = values[0];
first - values[1..].iter().sum::<f64>()
}
#[inline(always)]
pub fn mul(values: &[f64]) -> f64 {
if values.is_empty() {
return 1.0;
}
values.iter().product()
}
#[inline(always)]
pub fn div(values: &[f64]) -> f64 {
if values.is_empty() {
panic!("`div` function needs at least one argument");
}
let mut result = values[0];
for &v in &values[1..] {
result /= v;
}
result
}