Module xxcalc::polynomial_calculator
[−]
[src]
Defines a PolynomialCalculator with common arithmetic operations, functions
and constants already defined.
It supports various arithmetical operations, functions and some constants by
default. Operators such as addition +, subtraction -, multiplication *,
division / and exponentiation ^ are available on polynomials. Please note
that a simple floating point numbers (represented using double f64 type) are
supported as well, as these are special case of a polynomial (a constant
polynomial of a degree zero).
Furthermore functions such as arbitrary base logarithm log(number, base),
decimal logarithm log10(number) and evaluation of the polynomial
bind(polynomial, number) are provided by default too. Symbols such as inf,
nan, pi and e are defined too.
In order to write polynomials the x symbol must be used (which internally
is a constant defining a polynomial with coefficient one for the power of one).
In order to make the polynomial calculator reusable it is split into two
functional units: a PolynomialParser and a PolynomialEvaluator. A PolynomialParser,
extends basic infix parser with knowledge of basic arithmetic operators (+, -,
*, /, ^) with correct precedence (priority) and associativity. One can use
this parser to implement the other ones. Then, a PolynomialEvaluator is defined,
which extends a basic RPN evaluator with functions handling these operators and
handlers for log, log10 and bind functions, as well as the common constants.
The function handlers are available in the public module, so one can reuse them
when implementing a custom evaluator. These handlers try to do operations in-place
where possible, as a result no additional instances of Polynomial are created.
Examples
A PolynomialCalculator provides an easy way to integrate the calculator into
your project. It simply takes a string expression and returns evaluated value.
use xxcalc::polynomial_calculator::PolynomialCalculator; use xxcalc::calculator::Calculator; use xxcalc::polynomial::Polynomial; assert_eq!(PolynomialCalculator.process("(2+2)*-2"), Ok(Polynomial::constant(-8.0))); assert_eq!(PolynomialCalculator.process("(2+2)*-2").unwrap().as_f64().unwrap(), -8.0); assert_eq!(String::from(PolynomialCalculator.process("(x+1)*(-0.13x^18-x^7)").unwrap()), "-0.13x^19-0.13x^18-x^8-x^7");Run
However, the highest performance can be obtained by using a tokenizer, parser and
evaluator directly. A PolynomialCalculator creates a new instance of these for each
evaluation, which wastes buffers and requires multiple allocations from the operating
system.
use xxcalc::tokenizer::Tokenizer; use xxcalc::polynomial_calculator::{PolynomialParser, PolynomialEvaluator}; use xxcalc::{StringProcessor, TokensProcessor, TokensReducer}; use xxcalc::polynomial::Polynomial; let mut tokenizer = Tokenizer::default(); let mut parser = PolynomialParser::default(); let evaluator = PolynomialEvaluator::default(); // process some input for _ in 0..10 { let tokenized = tokenizer.process("(2+2)*-2"); let parsed = parser.process(tokenized); assert_eq!(evaluator.process(parsed.unwrap()), Ok(Polynomial::constant(-8.0))); }Run
Modules
| functions |
Implementations of function handlers used in operators and functions. |
Structs
| PolynomialCalculator |
|
| PolynomialEvaluator |
Extends |
| PolynomialParser |
Extends |