DC(1) DC(1)
NAME
dc - desk calculator
SYNOPSIS
dc [ file ]
DESCRIPTION
Dc is an arbitrary precision desk calculator. Ordinarily it
operates on decimal integers, but one may specify an input
base, output base, and a number of fractional digits to be
maintained. The overall structure of dc is a stacking
(reverse Polish) calculator. If an argument is given, input
is taken from that file until its end, then from the stan-
dard input. The following constructions are recognized:
number
The value of the number is pushed on the stack. A num-
ber is an unbroken string of the digits 0-9A-F or
0-9a-f. A hexadecimal number beginning with a lower
case letter must be preceded by a zero to distinguish
it from the command associated with the letter. It may
be preceded by an underscore _ to input a negative num-
ber. Numbers may contain decimal points.
+ - / * % ^
Add `+', subtract `-', multiply `*', divide `/',
remainder `%', or exponentiate `^' the top two values
on the stack. The two entries are popped off the
stack; the result is pushed on the stack in their
place. Any fractional part of an exponent is ignored.
sx
Sx Pop the top of the stack and store into a register
named x, where x may be any character. Under operation
S register x is treated as a stack and the value is
pushed on it.
lx
Lx Push the value in register x onto the stack. The reg-
ister x is not altered. All registers start with zero
value. Under operation L register x is treated as a
stack and its top value is popped onto the main stack.
d Duplicate the top value on the stack.
p Print the top value on the stack. The top value
remains unchanged. P interprets the top of the stack
as an text string, removes it, and prints it.
f Print the values on the stack.
Page 1 Plan 9 (printed 10/28/25)
DC(1) DC(1)
q
Q Exit the program. If executing a string, the recursion
level is popped by two. Under operation Q the top
value on the stack is popped and the string execution
level is popped by that value.
x Treat the top element of the stack as a character
string and execute it as a string of dc commands.
X Replace the number on the top of the stack with its
scale factor.
[ ... ]
Put the bracketed text string on the top of the stack.
<x
>x
=x Pop and compare the top two elements of the stack.
Register x is executed if they obey the stated rela-
tion.
v Replace the top element on the stack by its square
root. Any existing fractional part of the argument is
taken into account, but otherwise the scale factor is
ignored.
! Interpret the rest of the line as a shell command.
c Clear the stack.
i The top value on the stack is popped and used as the
number base for further input.
I Push the input base on the top of the stack.
o The top value on the stack is popped and used as the
number base for further output. In bases larger than
10, each `digit' prints as a group of decimal digits.
O Push the output base on the top of the stack.
k Pop the top of the stack, and use that value as a non-
negative scale factor: the appropriate number of places
are printed on output, and maintained during multipli-
cation, division, and exponentiation. The interaction
of scale factor, input base, and output base will be
reasonable if all are changed together.
z Push the stack level onto the stack.
Z Replace the number on the top of the stack with its
length.
Page 2 Plan 9 (printed 10/28/25)
DC(1) DC(1)
? A line of input is taken from the input source (usually
the terminal) and executed.
; : Used by bc for array operations.
The scale factor set by k determines how many digits are
kept to the right of the decimal point. If s is the current
scale factor, sa is the scale of the first operand, sb is
the scale of the second, and b is the (integer) second
operand, results are truncated to the following scales.
+,- max(sa,sb)
* min(sa+sb , max(s,sa,sb))
/ s
% so that dividend = divisor*quotient + remainder; remainder has sign of dividend
^ min(sax|b|, max(s,sa))
v max(s,sa)
EXAMPLES
Print the first ten values of n!
[la1+dsa*pla10>y]sy
0sa1
lyx
SOURCE
/sys/src/cmd/dc.c
SEE ALSO
bc(1), hoc(1)
DIAGNOSTICS
x `is unimplemented', where x is an octal number: an inter-
nal error.
`Out of headers' for too many numbers being kept around.
`Nesting depth' for too many levels of nested execution.
BUGS
When the input base exceeds 16, there is no notation for
digits greater than F.
Past its time.
Page 3 Plan 9 (printed 10/28/25)