1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//! # Expression calculator
//!
//! Calculator transparently supports operations with different type of numbers,
//! converting to appropriate type when it is needed. For instance,
//! `sqrt(-2)` is automatically converted from integer number `-2` to complex
//! one `-2+0i` and is evaluated to `0+1.4142135623730951i`
//!
//! Extra feature: trigonometric functions support both radians and degrees:
//! * Radians are just float numbers: `sin(pi/2)` returns `1`
//! * Degrees can be written in one of the following forms: `12°30'45"` or `12d30m45s` or `12.5125d`
//!
//! Internally degrees are stored and act as float numbers. They only support
//! their own input format. Output format is always a float number.
//!
//! If two numbers have different types, they are converted to highest type and
//! then the result is calculated. The list of number types starting from highest:
//! * Complex numbers. Two input formats supported: `1+2i` and `1+i2`. `i` can be capital. `j` can
//! be used instead of `i`
//! * Float numbers (degrees are float numbers, too)
//! * Rational numbers
//! * Big integer numbers
//!
//! Note: sometimes higher types are converted to lower ones. It may happen
//! after multiplication, division, and squaring a number. Examples:
//! * `sqr(0+2i)` -> `-4` - automatically complex is converted to float number
//! * `1.5 / 0.5` -> `3` - float to big integer
//! * `1\2 + 1\2` -> `1` - half and half is an integer one
//!
//! The list of supported functions:
//! * trigonometric functions (including inverted ones): sin, cos, tan, asin, acos, atan
//! * hyperbolic functions (including inverted ones): sinh, cosh, tanh, asinh, acosh, atanh
//! * square and square root: sqr and sqrt
//! * exponent, logarithm: exp, ln
//! * complex functions: norm, re, im, conjugate
//! * rounding: ceil, floor, trunc, round
//! * float to rational: ratio
//! * absolute value and sign: abs, signum
//! * fractional part of a float number: fract
//!
//! Operators (starting from highest priority):
//! * `!` - factorial (when used after a number or closing bracket)
//! * `-` - unary minus
//! * `**` - power
//! * `*`, `/`, `//` - multiplication, division, integer division
//! * `+`, `-` - addition, subtraction
//! * `&`, `^` - bitwise AND and XOR
//! * `|`, `<<`, `>>` - bitwise OR, SHL, and SHR
//! * `==`, `!=`, `>`, `<`, `>=`, and `<=` - comparison operators
//!
//! Predefined constants:
//! * `PI` - 3.14159...
//! * `E` - 2.71828...
//! * `PHI` - golden section - 1.6180...
//!
//! The calculator does not have special type for boolean numbers. When using logical
//! operators any zero value is treated as `false` and `true` otherwise. So, doing
//! double NOT transforms any number into big integer `1` or `0` depending on if the
//! original value was zero

#[macro_use]
extern crate pest_derive;

pub mod errors;
pub mod parse;
pub mod stack;
pub mod value;