Next: Algebraic-Style Calculations, Up: Basic Tutorial [Contents][Index]

Calc normally uses Reverse Polish notation (RPN). You may be familiar with the RPN system from Hewlett-Packard calculators, FORTH, or PostScript. (Reverse Polish Notation is named after the Polish mathematician Jan Lukasiewicz.)

The central component of an RPN calculator is the *stack*. A
calculator stack is like a stack of dishes. New dishes (numbers) are
added at the top of the stack, and numbers are normally only removed
from the top of the stack.

In an operation like ‘`2+3`’, the 2 and 3 are called the *operands*
and the ‘`+`’ is the *operator*. In an RPN calculator you always
enter the operands first, then the operator. Each time you type a
number, Calc adds or *pushes* it onto the top of the Stack.
When you press an operator key like `+`, Calc *pops* the appropriate
number of operands from the stack and pushes back the result.

Thus we could add the numbers 2 and 3 in an RPN calculator by typing:
`2 RET 3 RET +`. (The `RET` key, Return, corresponds to
the `ENTER` key on traditional RPN calculators.) Try this now if
you wish; type `C-x * c` to switch into the Calc window (you can type
`C-x * c` again or `C-x * o` to switch back to the Tutorial window).
The first four keystrokes “push” the numbers 2 and 3 onto the stack.
The `+` key “pops” the top two numbers from the stack, adds them,
and pushes the result (5) back onto the stack. Here’s how the stack
will look at various points throughout the calculation:

. 1: 2 2: 2 1: 5 . . 1: 3 . . C-x * c 2 RET 3 RET + DEL

The ‘`.`’ symbol is a marker that represents the top of the stack.
Note that the “top” of the stack is really shown at the bottom of
the Stack window. This may seem backwards, but it turns out to be
less distracting in regular use.

The numbers ‘`1:`’ and ‘`2:`’ on the left are *stack level
numbers*. Old RPN calculators always had four stack levels called
‘`x`’, ‘`y`’, ‘`z`’, and ‘`t`’. Calc’s stack can grow
as large as you like, so it uses numbers instead of letters. Some
stack-manipulation commands accept a numeric argument that says
which stack level to work on. Normal commands like `+` always
work on the top few levels of the stack.

The Stack buffer is just an Emacs buffer, and you can move around in
it using the regular Emacs motion commands. But no matter where the
cursor is, even if you have scrolled the ‘`.`’ marker out of
view, most Calc commands always move the cursor back down to level 1
before doing anything. It is possible to move the ‘`.`’ marker
upwards through the stack, temporarily “hiding” some numbers from
commands like `+`. This is called *stack truncation* and
we will not cover it in this tutorial; see Truncating the Stack,
if you are interested.

You don’t really need the second `RET` in `2 RET 3
RET +`. That’s because if you type any operator name or
other non-numeric key when you are entering a number, the Calculator
automatically enters that number and then does the requested command.
Thus `2 RET 3 +` will work just as well.

Examples in this tutorial will often omit `RET` even when the
stack displays shown would only happen if you did press `RET`:

```
1: 2 2: 2 1: 5
. 1: 3 .
.
2 RET 3 +
```

Here, after pressing `3` the stack would really show ‘`1: 2`’
with ‘`Calc: 3`’ in the minibuffer. In these situations, you can
press the optional `RET` to see the stack as the figure shows.

(•) **Exercise 1.** (This tutorial will include exercises
at various points. Try them if you wish. Answers to all the exercises
are located at the end of the Tutorial chapter. Each exercise will
include a cross-reference to its particular answer. If you are
reading with the Emacs Info system, press `f` and the
exercise number to go to the answer, then the letter `l` to
return to where you were.)

Here’s the first exercise: What will the keystrokes `1 RET 2
RET 3 RET 4 + * -` compute? (‘`*`’ is the symbol for
multiplication.) Figure it out by hand, then try it with Calc to see
if you’re right. See 1. (•)

(•) **Exercise 2.** Compute
‘`2*4 + 7*9.5 + 5/4`’
using the stack. See 2. (•)

The `DEL` key is called Backspace on some keyboards. It is
whatever key you would use to correct a simple typing error when
regularly using Emacs. The `DEL` key pops and throws away the
top value on the stack. (You can still get that value back from
the Trail if you should need it later on.) There are many places
in this tutorial where we assume you have used `DEL` to erase the
results of the previous example at the beginning of a new example.
In the few places where it is really important to use `DEL` to
clear away old results, the text will remind you to do so.

(It won’t hurt to let things accumulate on the stack, except that whenever you give a display-mode-changing command Calc will have to spend a long time reformatting such a large stack.)

Since the `-` key is also an operator (it subtracts the top two
stack elements), how does one enter a negative number? Calc uses
the `_` (underscore) key to act like the minus sign in a number.
So, typing `-5 RET` won’t work because the `-` key
will try to do a subtraction, but `_5 RET` works just fine.

You can also press `n`, which means “change sign.” It changes
the number at the top of the stack (or the number being entered)
from positive to negative or vice-versa: `5 n RET`.

If you press `RET` when you’re not entering a number, the effect
is to duplicate the top number on the stack. Consider this calculation:

1: 3 2: 3 1: 9 2: 9 1: 81 . 1: 3 . 1: 9 . . . 3 RET RET * RET *

(Of course, an easier way to do this would be `3 RET 4 ^`,
to raise 3 to the fourth power.)

The space-bar key (denoted `SPC` here) performs the same function
as `RET`; you could replace all three occurrences of `RET` in
the above example with `SPC` and the effect would be the same.

Another stack manipulation key is `TAB`. This exchanges the top
two stack entries. Suppose you have computed `2 RET 3 +`
to get 5, and then you realize what you really wanted to compute
was ‘`20 / (2+3)`’.

1: 5 2: 5 2: 20 1: 4 . 1: 20 1: 5 . . . 2 RET 3 + 20 TAB /

Planning ahead, the calculation would have gone like this:

1: 20 2: 20 3: 20 2: 20 1: 4 . 1: 2 2: 2 1: 5 . . 1: 3 . . 20 RET 2 RET 3 + /

A related stack command is `M-TAB` (hold `META` and type
`TAB`). It rotates the top three elements of the stack upward,
bringing the object in level 3 to the top.

1: 10 2: 10 3: 10 3: 20 3: 30 . 1: 20 2: 20 2: 30 2: 10 . 1: 30 1: 10 1: 20 . . . 10 RET 20 RET 30 RET M-TAB M-TAB

(•) **Exercise 3.** Suppose the numbers 10, 20, and 30 are
on the stack. Figure out how to add one to the number in level 2
without affecting the rest of the stack. Also figure out how to add
one to the number in level 3. See 3. (•)

Operations like `+`, `-`, `*`, `/`, and `^` pop two
arguments from the stack and push a result. Operations like `n` and
`Q` (square root) pop a single number and push the result. You can
think of them as simply operating on the top element of the stack.

1: 3 1: 9 2: 9 1: 25 1: 5 . . 1: 16 . . . 3 RET RET * 4 RET RET * + Q

(Note that capital `Q` means to hold down the Shift key while
typing `q`. Remember, plain unshifted `q` is the Quit command.)

Here we’ve used the Pythagorean Theorem to determine the hypotenuse of a
right triangle. Calc actually has a built-in command for that called
`f h`, but let’s suppose we can’t remember the necessary keystrokes.
We can still enter it by its full name using `M-x` notation:

1: 3 2: 3 1: 5 . 1: 4 . . 3 RET 4 RET M-x calc-hypot

All Calculator commands begin with the word ‘`calc-`’. Since it
gets tiring to type this, Calc provides an `x` key which is just
like the regular Emacs `M-x` key except that it types the ‘`calc-`’
prefix for you:

1: 3 2: 3 1: 5 . 1: 4 . . 3 RET 4 RET x hypot

What happens if you take the square root of a negative number?

```
1: 4 1: -4 1: (0, 2)
. . .
4 RET n Q
```

The notation ‘`(a, b)`’ represents a complex number.
Complex numbers are more traditionally written ‘`a + b i`’;
Calc can display in this format, too, but for now we’ll stick to the
‘`(a, b)`’ notation.

If you don’t know how complex numbers work, you can safely ignore this feature. Complex numbers only arise from operations that would be errors in a calculator that didn’t have complex numbers. (For example, taking the square root or logarithm of a negative number produces a complex result.)

Complex numbers are entered in the notation shown. The `(` and
`,` and `)` keys manipulate “incomplete complex numbers.”

1: ( ... 2: ( ... 1: (2, ... 1: (2, ... 1: (2, 3) . 1: 2 . 3 . . . ( 2 , 3 )

You can perform calculations while entering parts of incomplete objects. However, an incomplete object cannot actually participate in a calculation:

```
1: ( ... 2: ( ... 3: ( ... 1: ( ... 1: ( ...
. 1: 2 2: 2 5 5
. 1: 3 . .
.
(error)
( 2 RET 3 + +
```

Adding 5 to an incomplete object makes no sense, so the last command produces an error message and leaves the stack the same.

Incomplete objects can’t participate in arithmetic, but they can be moved around by the regular stack commands.

2: 2 3: 2 3: 3 1: ( ... 1: (2, 3) 1: 3 2: 3 2: ( ... 2 . . 1: ( ... 1: 2 3 . . . 2 RET 3 RET ( M-TAB M-TAB )

Note that the `,` (comma) key did not have to be used here.
When you press `)` all the stack entries between the incomplete
entry and the top are collected, so there’s never really a reason
to use the comma. It’s up to you.

(•) **Exercise 4.** To enter the complex number ‘`(2, 3)`’,
your friend Joe typed `( 2 , SPC 3 )`. What happened?
(Joe thought of a clever way to correct his mistake in only two
keystrokes, but it didn’t quite work. Try it to find out why.)
See 4. (•)

Vectors are entered the same way as complex numbers, but with square brackets in place of parentheses. We’ll meet vectors again later in the tutorial.

Any Emacs command can be given a *numeric prefix argument* by
typing a series of `META`-digits beforehand. If `META` is
awkward for you, you can instead type `C-u` followed by the
necessary digits. Numeric prefix arguments can be negative, as in
`M-- M-3 M-5` or `C-u - 3 5`. Calc commands use numeric
prefix arguments in a variety of ways. For example, a numeric prefix
on the `+` operator adds any number of stack entries at once:

1: 10 2: 10 3: 10 3: 10 1: 60 . 1: 20 2: 20 2: 20 . . 1: 30 1: 30 . . 10 RET 20 RET 30 RET C-u 3 +

For stack manipulation commands like `RET`, a positive numeric
prefix argument operates on the top `n` stack entries at once. A
negative argument operates on the entry in level `n` only. An
argument of zero operates on the entire stack. In this example, we copy
the second-to-top element of the stack:

1: 10 2: 10 3: 10 3: 10 4: 10 . 1: 20 2: 20 2: 20 3: 20 . 1: 30 1: 30 2: 30 . . 1: 20 . 10 RET 20 RET 30 RET C-u -2 RET

Another common idiom is `M-0 DEL`, which clears the stack.
(The `M-0` numeric prefix tells `DEL` to operate on the
entire stack.)

Next: Algebraic-Style Calculations, Up: Basic Tutorial [Contents][Index]