2011-03-30 13:49:47 +00:00
|
|
|
.TH DC 1
|
|
|
|
.SH NAME
|
|
|
|
dc \- desk calculator
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.B dc
|
|
|
|
[
|
|
|
|
.I file
|
|
|
|
]
|
|
|
|
.SH DESCRIPTION
|
|
|
|
.I 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
|
|
|
|
.I dc
|
|
|
|
is
|
|
|
|
a stacking (reverse Polish) calculator.
|
|
|
|
If an argument is given,
|
|
|
|
input is taken from that file until its end,
|
|
|
|
then from the standard input.
|
|
|
|
The following constructions are recognized:
|
|
|
|
.TP
|
|
|
|
number
|
|
|
|
The value of the number is pushed on the stack.
|
|
|
|
A number is an unbroken string of the digits
|
|
|
|
.B 0-9A-F
|
|
|
|
or
|
|
|
|
.BR 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
|
|
|
|
.B _
|
|
|
|
to input a
|
|
|
|
negative number.
|
|
|
|
Numbers may contain decimal points.
|
|
|
|
.TP
|
|
|
|
.L
|
|
|
|
+ - / * % ^
|
|
|
|
Add
|
|
|
|
.LR + ,
|
|
|
|
subtract
|
|
|
|
.LR - ,
|
|
|
|
multiply
|
|
|
|
.LR * ,
|
|
|
|
divide
|
|
|
|
.LR / ,
|
|
|
|
remainder
|
|
|
|
.LR % ,
|
|
|
|
or exponentiate
|
|
|
|
.L ^
|
|
|
|
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.
|
|
|
|
.TP
|
|
|
|
.BI s x
|
|
|
|
.br
|
|
|
|
.ns
|
|
|
|
.TP
|
|
|
|
.BI S x
|
|
|
|
Pop the top of the stack and store into
|
|
|
|
a register named
|
|
|
|
.IR x ,
|
|
|
|
where
|
|
|
|
.I x
|
|
|
|
may be any character.
|
|
|
|
Under operation
|
|
|
|
.B S
|
|
|
|
register
|
|
|
|
.I x
|
|
|
|
is treated as a stack and the value is pushed on it.
|
|
|
|
.TP
|
|
|
|
.BI l x
|
|
|
|
.br
|
|
|
|
.ns
|
|
|
|
.TP
|
|
|
|
.BI L x
|
|
|
|
Push the value in register
|
|
|
|
.I x
|
|
|
|
onto the stack.
|
|
|
|
The register
|
|
|
|
.I x
|
|
|
|
is not altered.
|
|
|
|
All registers start with zero value.
|
|
|
|
Under operation
|
|
|
|
.B L
|
|
|
|
register
|
|
|
|
.I x
|
|
|
|
is treated as a stack and its top value is popped onto the main stack.
|
|
|
|
.TP
|
|
|
|
.B d
|
|
|
|
Duplicate the
|
|
|
|
top value on the stack.
|
|
|
|
.TP
|
|
|
|
.B p
|
|
|
|
Print the top value on the stack.
|
|
|
|
The top value remains unchanged.
|
|
|
|
.B P
|
2013-07-08 18:19:22 +00:00
|
|
|
interprets the top of the stack as a text
|
2011-03-30 13:49:47 +00:00
|
|
|
string,
|
|
|
|
removes it, and prints it.
|
|
|
|
.TP
|
|
|
|
.B f
|
|
|
|
Print the values on the stack.
|
|
|
|
.TP
|
|
|
|
.B q
|
|
|
|
.br
|
|
|
|
.ns
|
|
|
|
.TP
|
|
|
|
.B Q
|
|
|
|
Exit the program.
|
|
|
|
If executing a string, the recursion level is
|
|
|
|
popped by two.
|
|
|
|
Under operation
|
|
|
|
.B Q
|
|
|
|
the top value on the stack is popped and the string execution level is popped
|
|
|
|
by that value.
|
|
|
|
.TP
|
|
|
|
.B x
|
|
|
|
Treat the top element of the stack as a character string
|
|
|
|
and execute it as a string of
|
|
|
|
.I dc
|
|
|
|
commands.
|
|
|
|
.TP
|
|
|
|
.B X
|
|
|
|
Replace the number on the top of the stack with its scale factor.
|
|
|
|
.TP
|
|
|
|
.B "[ ... ]"
|
|
|
|
Put the bracketed
|
|
|
|
text
|
|
|
|
string on the top of the stack.
|
|
|
|
.TP
|
|
|
|
.PD0
|
|
|
|
.BI < x
|
|
|
|
.TP
|
|
|
|
.BI > x
|
|
|
|
.TP
|
|
|
|
.BI = x
|
|
|
|
.PD
|
|
|
|
Pop and compare the
|
|
|
|
top two elements of the stack.
|
|
|
|
Register
|
|
|
|
.I x
|
|
|
|
is executed if they obey the stated
|
|
|
|
relation.
|
|
|
|
.TP
|
|
|
|
.B 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.
|
|
|
|
.TP
|
|
|
|
.B !
|
|
|
|
Interpret the rest of the line as a shell command.
|
|
|
|
.TP
|
|
|
|
.B c
|
|
|
|
Clear the stack.
|
|
|
|
.TP
|
|
|
|
.B i
|
|
|
|
The top value on the stack is popped and used as the
|
|
|
|
number base for further input.
|
|
|
|
.TP
|
|
|
|
.B I
|
|
|
|
Push the input base on the top of the stack.
|
|
|
|
.TP
|
|
|
|
.B 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.
|
|
|
|
.TP
|
|
|
|
.B O
|
|
|
|
Push the output base on the top of the stack.
|
|
|
|
.TP
|
|
|
|
.B 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 multiplication, division, and exponentiation.
|
|
|
|
The interaction of scale factor,
|
|
|
|
input base, and output base will be reasonable if all are changed
|
|
|
|
together.
|
|
|
|
.TP
|
|
|
|
.B z
|
|
|
|
Push the stack level onto the stack.
|
|
|
|
.TP
|
|
|
|
.B Z
|
|
|
|
Replace the number on the top of the stack with its length.
|
|
|
|
.TP
|
|
|
|
.B ?
|
|
|
|
A line of input is taken from the input source (usually the terminal)
|
|
|
|
and executed.
|
|
|
|
.TP
|
|
|
|
.B "; :"
|
|
|
|
Used by
|
|
|
|
.I bc
|
|
|
|
for array operations.
|
|
|
|
.PP
|
|
|
|
The scale factor set by
|
|
|
|
.B k
|
|
|
|
determines how many digits are kept to the right of
|
|
|
|
the decimal point.
|
|
|
|
If
|
|
|
|
.I s
|
|
|
|
is the current scale factor,
|
|
|
|
.I sa
|
|
|
|
is the scale of the first operand,
|
|
|
|
.I sb
|
|
|
|
is the scale of the second,
|
|
|
|
and
|
|
|
|
.I b
|
|
|
|
is the (integer) second operand,
|
|
|
|
results are truncated to the following scales.
|
|
|
|
.IP
|
|
|
|
.nf
|
|
|
|
\fL+\fR,\fL-\fR max(\fIsa,sb\fR)
|
|
|
|
\fL*\fR min(\fIsa\fR+\fIsb \fR, max\fR(\fIs,sa,sb\fR))
|
|
|
|
\fL/\fI s
|
|
|
|
\fL%\fR so that dividend = divisor*quotient + remainder; remainder has sign of dividend
|
|
|
|
\fL^\fR min(\fIsa\fR\(mu|\fIb\fR|, max(\fIs,sa\fR))
|
|
|
|
\fLv\fR max(\fIs,sa\fR)
|
|
|
|
.fi
|
|
|
|
.SH EXAMPLES
|
|
|
|
.LP
|
|
|
|
Print the first ten values of
|
|
|
|
.IR n !
|
|
|
|
.IP
|
|
|
|
.EX
|
|
|
|
[la1+dsa*pla10>y]sy
|
|
|
|
0sa1
|
|
|
|
lyx
|
|
|
|
.EE
|
2018-05-24 14:42:43 +00:00
|
|
|
.LP
|
|
|
|
Print π.
|
|
|
|
.IP
|
|
|
|
.EX
|
|
|
|
1sq180sr60st2si[3li*1+d1+*3*suli27*12-lq*5lr*+lt
|
|
|
|
5*/d48+Psy10lqlid2*1-***10lulqli5*2-*lr+lylt*-**
|
|
|
|
srsqlult*stli1+silmx]smlmx
|
|
|
|
.EE
|
2011-03-30 13:49:47 +00:00
|
|
|
.SH SOURCE
|
|
|
|
.B /sys/src/cmd/dc.c
|
|
|
|
.SH "SEE ALSO"
|
|
|
|
.IR bc (1),
|
|
|
|
.IR hoc (1)
|
|
|
|
.SH DIAGNOSTICS
|
|
|
|
.I x
|
|
|
|
.LR "is unimplemented" ,
|
|
|
|
where
|
|
|
|
.I x
|
|
|
|
is an octal number: an internal error.
|
|
|
|
.br
|
|
|
|
`Out of headers'
|
|
|
|
for too many numbers being kept around.
|
|
|
|
.br
|
|
|
|
`Nesting depth'
|
|
|
|
for too many levels of nested execution.
|
|
|
|
.SH BUGS
|
|
|
|
When the input base exceeds 16,
|
|
|
|
there is no notation for digits greater than
|
|
|
|
.BR F .
|
|
|
|
.PP
|
|
|
|
Past its time.
|