calcYet another CLI calculator. Inspired by the excellent https://github.com/alfredxing/calc.
With a Rust toolchain in place:
sh
cargo install --force calc
Alternately, you can download a precompiled executable of the most recent release.
sh
$ calc "1/(2+(3*(4-5)))"
-1
$ calc "round(12345 / 543)"
23
When non-flag arguments are present, calc interprets them as an expression and evaluates them immediately.
sh
$ calc
2
-15
29.608813203268074
30.608813203268074
-30
NaN
In the absence of non-flag arguments, calc launches a simple shell which just evaluates each line of input.
Every invocation of calc interprets all arguments as a single data type. By default, calc uses f64, but other data types
can be chosen by command-line flag:
f64 (default): signed 64-bit floating point operationsu64: unsigned 64-bit integer operationsi64: signed 64-bit integer operationsNote that the data type chosen will restrict the available operators, functions, and constants. For example, trigonometric operations are not available on integers, and bit-shifting operations are not available on floats.
Numbers may contain _ characters at any point. Those symbols are ignored; they are for user convenience and readability only.
calc can handle inputs in several numeric bases.
Un-annotated numbers are assumed to be base 10. Example: 123.45.
Note: this is the only format which is legal for non-integral numbers.
Numbers with a 0b prefix are in base 2. Example: 0b0110_1010.
Numbers with a 0o prefix are in base 8. Example: 0o755.
Note: a leading 0 is not in itself an octal prefix. Example: 0755 equals 0d755.
Numbers with a 0d prefix are in base 10. Example: 1234_5678.
0x prefix are in base 16. Example: 0xdead_beef.It is legal to intermix inputs of varying bases.
The output format of an expression can be specified by adding a : symbol followed by a format
specifier to the expression.
The format specifier can be anything recognized by the num-runtime-fmt crate.
sh
$ calc -u "0o644 | 0o111 :#o"
0o755
$ calc -u '0o755 & !0o111 :04o'
0644
1010 1011
b000_0000_0000_000a
1010
$ calc pi / 3 :v#04.4
0d01.0471
The following order of operations is used to resolve expressions:
(...))- !)<< >> <<< >>> **)& | ^)* / // %)+ -)Operations at the same level of precedence are resolved from left to right.
-: Negation!: Bitwise Not+: Addition-: Subtraction*: Multiplication/: Division//: Truncating Division: divides, truncating all data after the decimal point.**: Exponentiation% : Arithmetic remainder<<: Left Shift>>: Right Shift<<<: Wrapping Left Shift (Rotate Left)>>>: Wrappping Right Shift (Rotate Right)&: Bitwise And|: Bitwise Or^: Bitwise Xorabs: Absolute Valueceil: Smallest integer greater than or equal to the inputfloor: Greatest integer less than or equal to the inputround: Nearest integer to the input; halfway cases away from 0.0sin: Sinecos: Cosinetan: Tangentsinh: Hyperbolic Sinecosh: Hyperbolic Cosinetanh: Hyperbolic Tangentasin: Arcineacos: Arccosineatan: Arctangentasinh: Inverse Hyperbolic Sineacosh: Inverse Hyperbolic Cosineatanh: Inverse Hyperbolic Tangentrad: Convert a number in degrees to radiansdec: Convert a number in radians to degreessqrt: Square Rootcbrt: Cube Rootlog: Base-10 Logarithmlg: Base-2 Logarithmln: Natural (Base-e) Logarithmexp: e**xTrigonometric functions operate on radians.
e: Euler's Numberpi: Archimedes' Constantπ: Archimedes' ConstantIn shell mode, calc keeps the results of all expressions in memory until it is quit.
The pseudovariable @ always refers to the result of the previous expression.
The pseudovariable @@ always refers to the result of the expression before the previous.
Any number of @ symbols can be chained this way.
Simply chaining @ symbols can get cumbersome. The syntax @{N}, where N is an integer,
refers to the Nth previous result. @{1} always refers to the result of the previous expression;
it is equivalent to @. @{3} refers to the result 3 expressions ago; it is equivalent to @@@.
The pseuaovariable @[0] always refers to the result of the first expression in this shell session.
Likewise, @[1] refers to the second, and so on. The shell interface indicates the current expression.
Implicit multiplication is not supported. Use a multiplication operator such as *.
Floating point operations can compound lossily, and calc makes no special efforts to guard against
this kind of error. For example:
sh
$ calc 'sin(rad(45)) - (sqrt(2) / 2)'
-0.00000000000000011102230246251565
This crate includes both library code and CLI code. The CLI code is all gated behind feature cli; the
cli feature is in the default features. This means that the CLI is built by default. However, it is
possible to use this crate as a library without building any of the CLI code by including in your
Cargo.toml:
toml
[dependencies]
calc = { version = "*", default-features = false }