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