equation 1.0.0

A Rust library for mathematical expression evaluation and simplification
Documentation
# Equation

[![CI](https://github.com/davidrhyswhite/equation/actions/workflows/ci.yaml/badge.svg)](https://github.com/davidrhyswhite/equation/actions/workflows/ci.yaml.0)

A Rust library for mathematical expression evaluation and simplification.

### TODO

- [x] Rewrite pest parsing as PrattParser;
- [x] Modulo `%` & exponent `**` support;
- [x] Unary minus operator support;
- [x] Support fractions as ~~`f32`~~ `f64`;
- [x] Support basic triggernomic ratio functions sine, cosine & tangent as `sin`, `cos` & `tan`;
- [ ] Support functions with additional arguments, `atan2(y, x)`;
- [ ] Support evaluate `steps` parameter to break evaluation steps into a `Vec<&str>`;
- [ ] Support simplification & evaluation of algebraic expressions;
- [ ] Support for vectors and basic vector arithmetic & operations;

## Getting started

Add the following lines to your `Cargo.toml` dependencies:

```toml
[dependencies]
equation = "1.0.0"
```

## Examples

Evaluate basic arithmetic equations and return a `f64`.

```rust
use equation::evaluate;

fn main() {
    let result = evaluate("(1 + 2) * (1 + 2)"); // Returns Ok(9.0)
    match result {
        Ok(val) => println!("{}", val),
        Err(e) => println!("Error: {:?}", e),
    }
}
```

### Support

**Basic arithematic**

```rust
evaluate("(1 + 2) * 1 + 2"); // Returns Ok(5.0)
evaluate("4 * 3");           // Returns Ok(12.0)
evaluate("8 / 2");           // Returns Ok(4.0)
evaluate("16 - 4");          // Returns Ok(12.0)
```

**Negative calculations**

Unary operator. Returns the negation of its operand.

```rust
evaluate("-4 * 3"); // Returns Ok(-12.0)
evaluate("-8 / 2"); // Returns Ok(-4.0)
evaluate("-(4 + 4)"); // Returns Ok(-8.0)
```

**Exponentation**

Calculates the base to the exponent power, `base ^ exponent`.

```rust
evaluate("2 ^ 8");   // Returns Ok(256.0)
evaluate("2 exp 9"); // Returns Ok(512.0)
```

**Modulus**

Returns the integer remainder of dividing the two operands.	

```rust
evaluate("10 % 2");   // Returns Ok(0.0)
evaluate("10 % 4");   // Returns Ok(2.0)
evaluate("10 mod 3"); // Returns Ok(1.0)
```

**Triggernomic functions**


| Function      | Description                                | Example                   | Result                     |
| ------------- | ------------------------------------------ | ------------------------- | -------------------------- |
| sin           | Sine of the input                          | `evaluate("sin(10.0));`   | `Ok(-0.5440211108893698)`  |
| cos           | Cosine of the input                        | `evaluate("cos(10.0));`   | `Ok(-0.8390715290764524)`  |
| tan           | Tangent of the input                       | `evaluate("tan(10.0));`   | `Ok(0.6483608274590867)`   |
| asin          | Inverse sine of the input                  | `evaluate("asin(0.5));`   | `Ok(0.5235987755982988);)` |
| acos          | Inverse cosine of the input                | `evaluate("acos(0.5));`   | `Ok(1.0471975511965976);)` |
| atan          | Inverse tangent of the input               | `evaluate("atan(10.0));`  | `Ok(1.4711276743037345);)` |
| sinh          | Hyperbolic sine of the input               | `evaluate("sinh(10.0));`  | `Ok(11013.232874703393);)` |
| cosh          | Hyperbolic cosine of the input             | `evaluate("cosh(10.0));`  | `Ok(11013.232920103323);)` |
| tanh          | Hyperbolic tangent of the input            | `evaluate("tanh(10.0));`  | `Ok(0.9999999958776927);)` |
| asinh         | Inverse hyperbolic sine of the input       | `evaluate("asinh(10.0));` | `Ok(2.99822295029797);)`   |
| acosh         | Inverse hyperbolic cosine of the input     | `evaluate("acosh(10.0));` | `Ok(2.993222846126381);)`  |
| atanh         | Inverse hyperbolic tangent of the input    | `evaluate("atanh(10.0));` | `Ok(0.5493061443340549);)` |

## License

Licensed under MIT license ([LICENSE-MIT]LICENSE-MIT | https://opensource.org/licenses/MIT) or under the Apache 2.0 ([LICENSE-APACHE]LICENSE-APACHE | https://opensource.org/license/apache-2-0/).