mathhook_core/functions/elementary/
log_eval.rs

1//! Logarithm function evaluation
2
3use crate::core::{Expression, MathConstant, Number};
4
5/// Evaluate natural logarithm ln(x)
6///
7/// # Mathematical Definition
8///
9/// ln(x) = log_e(x), inverse of exp(x)
10///
11/// # Arguments
12///
13/// * `arg` - Expression to compute logarithm of
14///
15/// # Returns
16///
17/// Logarithm expression
18///
19/// # Examples
20///
21/// ```
22/// use mathhook_core::functions::elementary::log_eval::ln;
23/// use mathhook_core::expr;
24///
25/// let result = ln(&expr!(1));
26/// assert_eq!(result, expr!(0));
27/// ```
28pub 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
38/// Evaluate base-10 logarithm log10(x)
39///
40/// # Mathematical Definition
41///
42/// log10(x) = log_10(x)
43///
44/// # Arguments
45///
46/// * `arg` - Expression to compute logarithm of
47///
48/// # Returns
49///
50/// Logarithm expression
51///
52/// # Examples
53///
54/// ```
55/// use mathhook_core::functions::elementary::log_eval::log10;
56/// use mathhook_core::expr;
57///
58/// let result = log10(&expr!(10));
59/// assert_eq!(result, expr!(1));
60/// ```
61pub 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}