4 releases (2 breaking)

0.4.0 Aug 7, 2022
0.3.0 Feb 24, 2021
0.2.1 Feb 12, 2021
0.1.0 May 21, 2020
0.0.2 Nov 21, 2014

#289 in Math

Download history 16/week @ 2024-08-05 19/week @ 2024-08-12 7/week @ 2024-08-19 12/week @ 2024-08-26 14/week @ 2024-09-02 13/week @ 2024-09-09 7/week @ 2024-09-16 30/week @ 2024-09-23 20/week @ 2024-09-30 7/week @ 2024-10-07 27/week @ 2024-10-14 7/week @ 2024-10-21 8/week @ 2024-10-28 14/week @ 2024-11-04 320/week @ 2024-11-11 155/week @ 2024-11-18

498 downloads per month
Used in haalka

GPL-3.0-only

50KB
1K SLoC

Rust 1K SLoC // 0.0% comments LALRPOP 127 SLoC // 0.1% comments

calc

Build and Test Status

Yet another CLI calculator. Inspired by the excellent https://github.com/alfredxing/calc.

Installation

With a Rust toolchain in place:

cargo install --force calc

Alternately, you can download a precompiled executable of the most recent release.

Usage

Expression Mode

$ 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.

Shell Mode

$ calc
[0]: 1 + 1
2
[1]: 3*(5/(3-4))
-15
[2]: 3*pi**2
29.608813203268074
[3]: @+1
30.608813203268074
[4]: @@@*2
-30
[5]: ln(-1)
NaN

In the absence of non-flag arguments, calc launches a simple shell which just evaluates each line of input.

Reference

Data Types

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 operations
  • u64: unsigned 64-bit integer operations
  • i64: signed 64-bit integer operations

Note 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.

Numeric Input Format

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.

  • Numbers with a 0x prefix are in base 16. Example: 0xdead_beef.

It is legal to intermix inputs of varying bases.

Numeric Output Format

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.

$ calc -u "0o644 | 0o111 :#o"
0o755
$ calc -u '0o755 & !0o111 :04o'
0644
[0]: 0xab :b 4
1010 1011
[1]: @[0] >>> 4 :x_4
b000_0000_0000_000a
[2]: @ & 0xF :4b
1010
$ calc pi / 3 :v#04.4
0d01.0471

Order of Operations

The following order of operations is used to resolve expressions:

  • Parentheses ((...))
  • Unary Prefix Operators (- !)
  • Shifts and Exponentiation (<< >> <<< >>> **)
  • Bitwise operations (& | ^)
  • Multiplication and Division (* / // %)
  • Addition and Subtraction (+ -)

Operations at the same level of precedence are resolved from left to right.

Unary Prefix Operators

  • -: Negation
  • !: Bitwise Not

Infix Operators

  • +: 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 Xor

Functions

  • abs: Absolute Value
  • ceil: Smallest integer greater than or equal to the input
  • floor: Greatest integer less than or equal to the input
  • round: Nearest integer to the input; halfway cases away from 0.0
  • sin: Sine
  • cos: Cosine
  • tan: Tangent
  • sinh: Hyperbolic Sine
  • cosh: Hyperbolic Cosine
  • tanh: Hyperbolic Tangent
  • asin: Arcine
  • acos: Arccosine
  • atan: Arctangent
  • asinh: Inverse Hyperbolic Sine
  • acosh: Inverse Hyperbolic Cosine
  • atanh: Inverse Hyperbolic Tangent
  • rad: Convert a number in degrees to radians
  • dec: Convert a number in radians to degrees
  • sqrt: Square Root
  • cbrt: Cube Root
  • log: Base-10 Logarithm
  • lg: Base-2 Logarithm
  • ln: Natural (Base-e) Logarithm
  • exp: e**x

Trigonometric functions operate on radians.

Constants

  • e: Euler's Number
  • pi: Archimedes' Constant
  • π: Archimedes' Constant

History

In 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.

Warnings

No Implicit Multiplication

Implicit multiplication is not supported. Use a multiplication operator such as *.

Floating Point Errors

Floating point operations can compound lossily, and calc makes no special efforts to guard against this kind of error. For example:

$ calc 'sin(rad(45)) - (sqrt(2) / 2)'
-0.00000000000000011102230246251565

Crate Structure

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:

[dependencies]
calc = { version = "*", default-features = false }

Dependencies

~3–18MB
~194K SLoC