eqeval 0.2.0

An equation parser using the finum crate
Documentation
  • Coverage
  • 0%
    0 out of 10 items documented0 out of 3 items with examples
  • Size
  • Source code size: 73.38 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 2.2 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 29s Average build duration of successful builds.
  • all releases: 32s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • sanieren823

eqeval

eqeval converts equations strings to their respective value using the finum crate. We therefore avoid any floating-point errors and are entirely reliant on the precision values provided by the finum crate.

Usage

Add this to your Cargo.toml:

[dependencies]

eqeval = "0.2.0"

Creating custom variables

Creating custom variables is done via the Variable struct. To create an instance of this struct you need:

  • a name
  • the value (as a FiLong)

Creating custom functions

In order to create a custom function for the equation evaluator, you have use the Function struct. Each function needs:

  • a name
  • the actual function (parameters: vector of FiLong; output type: FiLong)
  • a special value (this value, usually 0, can provide additional context e. g. trigonometric functions)
Special Value Function
0 Base case; no special handeling
1 For trig. function with parameters given in degrees
2 For trig. function that return a value in degrees

Potential Issues

  • Make sure your custom functions do not include rad_to_deg/deg_to_rad in its entirety in the name
  • Functions musn't include any of the following symbols: #, +, -, *, /, ^, @, !, ? (I did not include a check for that; if you're actually trying to use a operand's symbol in a function name that on you)

Your first equation

Generally parsing equations is done by using the eval! macro. You can choose to provide additional context in form of the deg boolean or one/both of the two context vectors for variables and functions.

How to write an equation

The Equation must always be provided as a String. These are the symbols for the operands:

Symbol Function Example
+ Addition 2 + 4 → 6
- Subtraction or Negative Value 7 - 3 → 4 or -5 → -5
* Multiplication 12 * 4 → 48
/ Division 39 / 13 → 13
^ Exponentiation 2 ^ 8 → 256
@ Logarithm 81 @ 3 → ${\log_3 81}$ → 4
! Factorial 3! → 1 * 2 * 3 → 6
? Termial 6? → 1 + 2 + 3 + 4 + 5 + 6 → 21

Generally there's no limit in equation size (aside from String limits in rust) or in context provided but it'll run faster for smaller equations/fewer context added

How equations get parsed

The general Order of Operations: (lower number → parsed earlier):

  1. parenthesis
  2. functions (sin, abs)
  3. exponentiation/logarithm
  4. factorials/termials
  5. modulu
  6. multiplication/division
  7. addition/subtraction

An Example Equation

This is an example equation with variables as context:

fn main() {
    let mut context: Vec<Variable> = Vec::new();
    context.push(Variable{name: String::from("re"), val: FiLong::two()});
    context.push(Variable{name: String::from("pl"), val: FiLong::six()});
    println!("{}", eval!("re! + (9^0.35) * 1^2!@8 - (4 + 5(3sin(0.213) - 9)) * abs(2.23) + pl? + 7.0cos(-31.9)(3)!^2", vars: context));
}

The result should be: 330.40574755336320971885