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