UPDATE: Adds LOG10 and LN for Elsa
This commit is contained in:
committed by
Nicolás Hatcher Andrés
parent
df913e73d4
commit
2a5f001361
@@ -378,6 +378,16 @@ impl Model {
|
||||
}
|
||||
}
|
||||
|
||||
single_number_fn!(fn_log10, |f| if f <= 0.0 {
|
||||
Err(Error::NUM)
|
||||
} else {
|
||||
Ok(f64::log10(f))
|
||||
});
|
||||
single_number_fn!(fn_ln, |f| if f <= 0.0 {
|
||||
Err(Error::NUM)
|
||||
} else {
|
||||
Ok(f64::ln(f))
|
||||
});
|
||||
single_number_fn!(fn_sin, |f| Ok(f64::sin(f)));
|
||||
single_number_fn!(fn_cos, |f| Ok(f64::cos(f)));
|
||||
single_number_fn!(fn_tan, |f| Ok(f64::tan(f)));
|
||||
@@ -431,6 +441,47 @@ impl Model {
|
||||
CalcResult::Number(f64::atan2(y, x))
|
||||
}
|
||||
|
||||
pub(crate) fn fn_log(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult {
|
||||
let n_args = args.len();
|
||||
if !(1..=2).contains(&n_args) {
|
||||
return CalcResult::new_args_number_error(cell);
|
||||
}
|
||||
let x = match self.get_number(&args[0], cell) {
|
||||
Ok(f) => f,
|
||||
Err(s) => return s,
|
||||
};
|
||||
let y = if n_args == 1 {
|
||||
10.0
|
||||
} else {
|
||||
match self.get_number(&args[1], cell) {
|
||||
Ok(f) => f,
|
||||
Err(s) => return s,
|
||||
}
|
||||
};
|
||||
if x <= 0.0 {
|
||||
return CalcResult::Error {
|
||||
error: Error::NUM,
|
||||
origin: cell,
|
||||
message: "Number must be positive".to_string(),
|
||||
};
|
||||
}
|
||||
if y == 1.0 {
|
||||
return CalcResult::Error {
|
||||
error: Error::DIV,
|
||||
origin: cell,
|
||||
message: "Logarithm base cannot be 1".to_string(),
|
||||
};
|
||||
}
|
||||
if y <= 0.0 {
|
||||
return CalcResult::Error {
|
||||
error: Error::NUM,
|
||||
origin: cell,
|
||||
message: "Logarithm base must be positive".to_string(),
|
||||
};
|
||||
}
|
||||
CalcResult::Number(f64::log(x, y))
|
||||
}
|
||||
|
||||
pub(crate) fn fn_power(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult {
|
||||
if args.len() != 2 {
|
||||
return CalcResult::new_args_number_error(cell);
|
||||
|
||||
@@ -54,6 +54,9 @@ pub enum Function {
|
||||
Columns,
|
||||
Cos,
|
||||
Cosh,
|
||||
Log,
|
||||
Log10,
|
||||
Ln,
|
||||
Max,
|
||||
Min,
|
||||
Pi,
|
||||
@@ -250,7 +253,7 @@ pub enum Function {
|
||||
}
|
||||
|
||||
impl Function {
|
||||
pub fn into_iter() -> IntoIter<Function, 195> {
|
||||
pub fn into_iter() -> IntoIter<Function, 198> {
|
||||
[
|
||||
Function::And,
|
||||
Function::False,
|
||||
@@ -277,6 +280,9 @@ impl Function {
|
||||
Function::Atanh,
|
||||
Function::Abs,
|
||||
Function::Pi,
|
||||
Function::Ln,
|
||||
Function::Log,
|
||||
Function::Log10,
|
||||
Function::Sqrt,
|
||||
Function::Sqrtpi,
|
||||
Function::Atan2,
|
||||
@@ -534,6 +540,10 @@ impl Function {
|
||||
"POWER" => Some(Function::Power),
|
||||
"ATAN2" => Some(Function::Atan2),
|
||||
|
||||
"LN" => Some(Function::Ln),
|
||||
"LOG" => Some(Function::Log),
|
||||
"LOG10" => Some(Function::Log10),
|
||||
|
||||
"MAX" => Some(Function::Max),
|
||||
"MIN" => Some(Function::Min),
|
||||
"PRODUCT" => Some(Function::Product),
|
||||
@@ -734,6 +744,9 @@ impl fmt::Display for Function {
|
||||
Function::Switch => write!(f, "SWITCH"),
|
||||
Function::True => write!(f, "TRUE"),
|
||||
Function::Xor => write!(f, "XOR"),
|
||||
Function::Log => write!(f, "LOG"),
|
||||
Function::Log10 => write!(f, "LOG10"),
|
||||
Function::Ln => write!(f, "LN"),
|
||||
Function::Sin => write!(f, "SIN"),
|
||||
Function::Cos => write!(f, "COS"),
|
||||
Function::Tan => write!(f, "TAN"),
|
||||
@@ -961,6 +974,9 @@ impl Model {
|
||||
Function::True => self.fn_true(args, cell),
|
||||
Function::Xor => self.fn_xor(args, cell),
|
||||
// Math and trigonometry
|
||||
Function::Log => self.fn_log(args, cell),
|
||||
Function::Log10 => self.fn_log10(args, cell),
|
||||
Function::Ln => self.fn_ln(args, cell),
|
||||
Function::Sin => self.fn_sin(args, cell),
|
||||
Function::Cos => self.fn_cos(args, cell),
|
||||
Function::Tan => self.fn_tan(args, cell),
|
||||
|
||||
Reference in New Issue
Block a user