mathhook_core/functions/elementary/
exp_eval.rs

1//! Exponential function evaluation
2
3use crate::core::{Expression, Number};
4
5/// Evaluate exponential function e^x
6///
7/// # Mathematical Definition
8///
9/// exp(x) = e^x where e ≈ 2.71828...
10///
11/// # Arguments
12///
13/// * `arg` - Exponent expression
14///
15/// # Returns
16///
17/// Exponential expression
18///
19/// # Examples
20///
21/// ```
22/// use mathhook_core::functions::elementary::exp_eval::exp;
23/// use mathhook_core::expr;
24///
25/// let result = exp(&expr!(0));
26/// assert_eq!(result, expr!(1));
27/// ```
28pub fn exp(arg: &Expression) -> Expression {
29    match arg {
30        Expression::Number(Number::Integer(0)) => Expression::integer(1),
31        Expression::Number(Number::Float(f)) => Expression::float(f.exp()),
32        Expression::Number(Number::Integer(i)) => Expression::float((*i as f64).exp()),
33        _ => Expression::function("exp", vec![arg.clone()]),
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_exp_zero() {
43        assert_eq!(exp(&Expression::integer(0)), Expression::integer(1));
44    }
45
46    #[test]
47    fn test_exp_one() {
48        let result = exp(&Expression::integer(1));
49        if let Expression::Number(Number::Float(f)) = result {
50            assert!((f - std::f64::consts::E).abs() < 1e-10);
51        } else {
52            panic!("Expected float result");
53        }
54    }
55}