mathhook_core/functions/elementary/
log_eval.rs1use crate::core::{Expression, MathConstant, Number};
4
5pub fn ln(arg: &Expression) -> Expression {
29 match arg {
30 Expression::Constant(MathConstant::E) => Expression::integer(1),
31 Expression::Number(Number::Integer(1)) => Expression::integer(0),
32 Expression::Number(Number::Float(f)) if *f > 0.0 => Expression::float(f.ln()),
33 Expression::Number(Number::Integer(i)) if *i > 0 => Expression::float((*i as f64).ln()),
34 _ => Expression::function("ln", vec![arg.clone()]),
35 }
36}
37
38pub fn log10(arg: &Expression) -> Expression {
62 match arg {
63 Expression::Number(Number::Integer(1)) => Expression::integer(0),
64 Expression::Number(Number::Integer(10)) => Expression::integer(1),
65 Expression::Number(Number::Float(f)) if *f > 0.0 => Expression::float(f.log10()),
66 Expression::Number(Number::Integer(i)) if *i > 0 => Expression::float((*i as f64).log10()),
67 _ => Expression::function("log10", vec![arg.clone()]),
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn test_ln_one() {
77 assert_eq!(ln(&Expression::integer(1)), Expression::integer(0));
78 }
79
80 #[test]
81 fn test_log10_one() {
82 assert_eq!(log10(&Expression::integer(1)), Expression::integer(0));
83 }
84
85 #[test]
86 fn test_log10_ten() {
87 assert_eq!(log10(&Expression::integer(10)), Expression::integer(1));
88 }
89}