|
|
1.1 root 1: .TH DC 1
2: .SH NAME
3: dc \- desk calculator
4: .SH SYNOPSIS
5: .B dc
6: [
7: .I file
8: ]
9: .SH DESCRIPTION
10: .I Dc
11: is an arbitrary precision desk calculator.
12: Ordinarily it operates on decimal integers,
13: but one may specify an input base, output base,
14: and a number of fractional digits to be maintained.
15: The overall structure of
16: .I dc
17: is
18: a stacking (reverse Polish) calculator.
19: If an argument is given,
20: input is taken from that file until its end,
21: then from the standard input.
22: The following constructions are recognized:
23: .TP
24: number
25: The value of the number is pushed on the stack.
26: A number is an unbroken string of the digits
27: .B 0-9A-F
28: or
29: .BR 0-9a-f .
30: A hexadecimal number beginning with a lower case
31: letter must be preceded by a zero to distinguish it
32: from the command associated with the letter.
33: It may be preceded by an underscore
34: .B _
35: to input a
36: negative number.
37: Numbers may contain decimal points.
38: .TP
39: .L
40: + - / * % ^
41: Add
42: .LR + ,
43: subtract
44: .LR - ,
45: multiply
46: .LR * ,
47: divide
48: .LR / ,
49: remainder
50: .LR % ,
51: or exponentiate
52: .L ^
53: the top two values on the stack.
54: The two entries are popped off the stack;
55: the result is pushed on the stack in their place.
56: Any fractional part of an exponent is ignored.
57: .TP
58: .BI s x
59: .br
60: .ns
61: .TP
62: .BI S x
63: Pop the top of the stack and store into
64: a register named
65: .IR x ,
66: where
67: .I x
68: may be any character.
69: Under operation
70: .B S
71: register
72: .I x
73: is treated as a stack and the value is pushed on it.
74: .TP
75: .BI l x
76: .br
77: .ns
78: .TP
79: .BI L x
80: Push the value in register
81: .I x
82: onto the stack.
83: The register
84: .I x
85: is not altered.
86: All registers start with zero value.
87: Under operation
88: .B L
89: register
90: .I x
91: is treated as a stack and its top value is popped onto the main stack.
92: .TP
93: .B d
94: Duplicate the
95: top value on the stack.
96: .TP
97: .B p
98: Print the top value on the stack.
99: The top value remains unchanged.
100: .B P
101: interprets the top of the stack as an
102: text
103: string,
104: removes it, and prints it.
105: .TP
106: .B f
107: Print the values on the stack.
108: .TP
109: .B q
110: .br
111: .ns
112: .TP
113: .B Q
114: Exit the program.
115: If executing a string, the recursion level is
116: popped by two.
117: Under operation
118: .B Q
119: the top value on the stack is popped and the string execution level is popped
120: by that value.
121: .TP
122: .B x
123: Treat the top element of the stack as a character string
124: and execute it as a string of
125: .I dc
126: commands.
127: .TP
128: .B X
129: Replace the number on the top of the stack with its scale factor.
130: .TP
131: .B "[ ... ]"
132: Put the bracketed
133: text
134: string on the top of the stack.
135: .TP
136: .PD0
137: .BI < x
138: .TP
139: .BI > x
140: .TP
141: .BI = x
142: .PD
143: Pop and compare the
144: top two elements of the stack.
145: Register
146: .I x
147: is executed if they obey the stated
148: relation.
149: .TP
150: .B v
151: Replace the top element on the stack by its square root.
152: Any existing fractional part of the argument is taken
153: into account, but otherwise the scale factor is ignored.
154: .TP
155: .B !
156: Interpret the rest of the line as a shell command.
157: .TP
158: .B c
159: Clear the stack.
160: .TP
161: .B i
162: The top value on the stack is popped and used as the
163: number base for further input.
164: .TP
165: .B I
166: Push the input base on the top of the stack.
167: .TP
168: .B o
169: The top value on the stack is popped and used as the
170: number base for further output.
171: In bases larger than 10, each `digit' prints as a group of decimal digits.
172: .TP
173: .B O
174: Push the output base on the top of the stack.
175: .TP
176: .B k
177: Pop the top of the stack, and use that value as
178: a non-negative scale factor:
179: the appropriate number of places
180: are printed on output,
181: and maintained during multiplication, division, and exponentiation.
182: The interaction of scale factor,
183: input base, and output base will be reasonable if all are changed
184: together.
185: .TP
186: .B z
187: Push the stack level onto the stack.
188: .TP
189: .B Z
190: Replace the number on the top of the stack with its length.
191: .TP
192: .B ?
193: A line of input is taken from the input source (usually the terminal)
194: and executed.
195: .TP
196: .B "; :"
197: Used by
198: .I bc
199: for array operations.
200: .PP
201: The scale factor set by
202: .B k
203: determines how many digits are kept to the right of
204: the decimal point.
205: If
206: .I s
207: is the current scale factor,
208: .I sa
209: is the scale of the first operand,
210: .I sb
211: is the scale of the second,
212: and
213: .I b
214: is the (integer) second operand,
215: results are truncated to the following scales.
216: .IP
217: .nf
218: \fL+\fR,\fL-\fR max(\fIsa,sb\fR)
219: \fL*\fR min(\fIsa\fR+\fIsb \fR, max\fR(\fIs,sa,sb\fR))
220: \fL/\fI s
221: \fL%\fR so that dividend = divisor*quotient + remainder; remainder has sign of dividend
222: \fL^\fR min(\fIsa\fR\(mu|\fIb\fR|, max(\fIs,sa\fR))
223: \fLv\fR max(\fIs,sa\fR)
224: .fi
225: .SH EXAMPLES
226: .EX
227: [la1+dsa*pla10>y]sy
228: 0sa1
229: lyx
230: .EE
231: .ns
232: .IP
233: Print the first ten values of
234: .IR n !
235: .SH SOURCE
236: .B /sys/src/cmd/dc.c
237: .SH "SEE ALSO"
238: .IR bc (1),
239: .IR hoc (1)
240: .SH DIAGNOSTICS
241: .I x
242: .LR "is unimplemented" ,
243: where
244: .I x
245: is an octal number: an internal error.
246: .br
247: `Out of headers'
248: for too many numbers being kept around.
249: .br
250: `Nesting depth'
251: for too many levels of nested execution.
252: .SH BUGS
253: When the input base exceeds 16,
254: there is no notation for digits greater than
255: .BR F .
256: .PP
257: Past its time.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.