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

interprets the top of the stack as an | |

text | |

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

.SH SOURCE | |

.B \*9/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. |