## Name

**calc** - RPN calculator

## SYNOPSIS

**calc**

**calc**
<
*commands*

## DESCRIPTION

**calc**
is a RPN calculator in the spirit of the HP calculators.

## CALC SETTINGS

### dsp

Control the number of stack entries to display (4 by default).

```
4:
3:
2:
1: 1.00
> 2 dsp
2:
1: 1.00
>
```

### prec

Specify float precision (2 by default).

```
1: 3.14
> 4 prec
1: 3.1416
>
```

### rad

Switch to radius mode.

### deg

Switch to degree mode.

## STACK MANAGEMENT

### clear

Clear the stack.

### dropn

Remove the n topmost elements of the stack.

```
4: 2.00
3: 33.00
2: 44.00
1: 55.00
> 3 dropn
4:
3:
2:
1: 2.00
>
```

### drop2

Shortcut for 2 dropn.

### drop

Shortcut for 1 dropn.

### dupn

Duplicate the n topmost elements of the stack.

```
4:
3:
2: 3.14
1: 34.00
> 2 dupn
4: 3.14
3: 34.00
2: 3.14
1: 34.00
>
```

### dup2

Shortcut for 2 dupn.

### dup

Shortcut for 1 dupn.

### pick

Pick an element in the stack and copy it at the top of the stack.

```
4:
3: 123.00
2: 33.00
1: 44.00
> 3 pick
4: 123.00
3: 33.00
2: 44.00
1: 123.00
>
```

### over

Shortcut for 2 pick.

### roll

Pick an element in the stack and move it at the top of the stack.

```
4:
3: 123.00
2: 33.00
1: 44.00
> 3 roll
4:
3: 33.00
2: 44.00
1: 123.00
>
```

### swap

Shortcut for 2 roll.

### rot

Shortcut for 3 roll.

### rolld

Pick the topmost element and move it downward the stack.

```
4: 1.00
3: 2.00
2: 3.00
1: 4.00
> 3 rolld
4: 1.00
3: 4.00
2: 2.00
1: 3.00
>
```

### depth

Push the size of the stack on the stack.

## ARITHMETIC OPERATORS

### add, +

Add two topmost elements of the stack.

### sub, -

Substract two topmost elements of the stack.

### mul, *

Multiply two topmost elements of the stack.

### div, /

Divide two topmost elements of the stack.

### modulo, %

Modulo of two topmost elements of the stack.

### pow

Exponentiation operator of two topmost elements of the stack.

### sq

Shortcut for 2 pow (square value of topmost element).

### sqrt

Shortcut for .5 pow (square root value of topmost element).

### neg

Negate topmost element of the stack.

### abs

Replace topmost element of the stack by its absolute value.

### ceil

Replace topmost element of the stack by its ceiling value.

### floor

Replace topmost element of the stack by its floor value.

### round

Replace topmost element of the stack by its round value.

### sum

Sum every element of the stack.

### avg

Compute average value of the stack.

## COMPARATORS

### equal

Test if second element equals first one.

### le

Test if second element is less or equal compared to first one.

### lt

Test if second element is less than first one.

### ge

Test if second element is greater or equal compared to first one.

### gt

Test if second element is greater than first one.

## BASE NUMBERS

**calc**
accepts numbers in 'base mode' format, using the following syntax:

#...b

binary base number (example #01b)

#...o

octal base number (example #12o)

#...d

decimal base number (example #23d)

#...h

hexadecimal base number (example #ea1h)

Base numbers are displayed in decimal base by default.
See commands
*bin*,
*oct*,
*dec*,
*hex*
to change the default base number display mode.

### base

Turn a float number into a base number.

### float

Turn a base number into a float number.

### bin

Display base numbers in base 2.

### oct

Display base numbers in base 8.

### dec

Display base numbers in base 10.

### hex

Display base numbers in base 16.

## BITWISE OPERATORS

### blshift

Binary left shift operator.

```
4:
3:
2:
1: 1.00
> 2 blshift
4:
3:
2:
1: 4.00
>
```

### brshift

Binary right shift operator.

### band

Binary and between two topmost elements.

### bor

Binary or between two topmost elements.

### bxor

Binary xor between two topmost elements.

## CONSTANTS

### pi

The Pi constant.

### e

Natural logarithm.

## TRIGONOMETRY

### cos

Cosinus.

### sin

Sinus.

### tan

Tangent.

### acos

Arc-cosinus.

### asin

Arc-sinus.

### atan

Arc-tangent.

### cosh

Hyperbolic-cosinus.

### sinh

Hyperbolic-sinus.

### tanh

Hyperbolic-tangent.

## LABELS

**calc**
supports the notion of labels, where values can be stored to / retrieved
from. A valid label name is made of alphabetic characters and underscore
character.

A label can be entered as is. If a value is already assigned to a label, the stored value is pushed on the stack. Otherwise, the label name is put on the stack. To put a label on the stack without evaluation, enter it in single quotes.

### mem

Dump a list of labels and their associated value.

### sto

Store a value into a label:

```
4:
3:
2:
1:
> 2 'two' sto
4:
3:
2:
1:
> mem
two: 2.00
4:
3:
2:
1:
> two
4:
3:
2:
1: 2.00
>
```

### sto+

Increment value stored in a label with the topmost value of the stack.

```
4:
3:
2:
1: 5.00
> 'two' sto+
4:
3:
2:
1:
> two
4:
3:
2:
1: 7.00
>
```

### rcl

Recall a value stored in a label.

```
4:
3:
2:
1:
> 'two' rcl
4:
3:
2:
1: 7.00
>
```

### purge

Unassign value stored in a label.

```
4:
3:
2:
1:
> 'two' purge
```

## PROGRAMS

### <<...>>

Sequences of commands can be specified between double angle brackets:

```
4:
3:
2:
1:
> <<3 4 5 6>>
4:
3:
2:
1: <<3.00 4.00 5.00 6.00>>
>
```

### eval

A program on top of the stack can be evaluted with the eval command:

```
4:
3:
2:
1: <<3.00 4.00 5.00 6.00>>
> eval
4: 3.00
3: 4.00
2: 5.00
1: 6.00
>
```

## CONTROL FLOW

### ift

If-then conditionnal. Expect a program as a first argument, and an int value as a second argument. program is evaluated if float value is not zero.

```
4:
3:
2: 1
1: <<3.00 4.00 add>>
> ift
4:
3:
2:
1: 7.00
>
```

### ifte

If-then-else conditionnal. Expect programs on first and second arguments, and an int value as a third argument. Evaluate first program if third argument is not zero, evaluate second program otherwise.

```
4:
3: 0
2: <<1.00 1.00 add>>
1: <<2.00 2.00 mul>>
> ifte
4:
3:
2:
1: 2.00
>
```

### whileop

While loop operator. Expect programs on first and second arguments. Evaluate first program as long a second program evaluate to a float value that is not zero.

## COMMENTS

The '@' character mark the beginning of a comment. Following characters until EOL are discarded.

```
4:
3:
2:
1:
> @ this is a comment
```

## RCFILE

On startup,
**calc**
parse the $HOME/.config/calc/calcrc if it exists. You can store there
your custom commands. For example, this rc file defines a rgb command
by storing a program into the 'rgb' label:

```
$ cat ~/.config/calc/calcrc
@ 'rgb' command to convert an hexadecimal color value into RGB format
<<dup 16 brshift #ffh band swap dup 8 brshift #ffh band swap #ffh band>> 'rgb' sto
$ calc
4:
3:
2:
1:
> #63c6a5h rgb
4:
3: #99d
2: #198d
1: #165d
>
```

## AUTHOR

Gerome Fournier <jef@foutaise.org>.