xref: /freebsd/usr.bin/dc/dc.1 (revision 3c4ba5f55438f7afd4f4b0b56f88f2bb505fd6a6)
1.\"	$FreeBSD$
2.\"	$OpenBSD: dc.1,v 1.27 2012/08/19 12:07:21 jmc Exp $
3.\"
4.\" Copyright (C) Caldera International Inc.  2001-2002.
5.\" All rights reserved.
6.\"
7.\" Redistribution and use in source and binary forms, with or without
8.\" modification, are permitted provided that the following conditions
9.\" are met:
10.\" 1. Redistributions of source code and documentation must retain the above
11.\"    copyright notice, this list of conditions and the following disclaimer.
12.\" 2. Redistributions in binary form must reproduce the above copyright
13.\"    notice, this list of conditions and the following disclaimer in the
14.\"    documentation and/or other materials provided with the distribution.
15.\" 3. All advertising materials mentioning features or use of this software
16.\"    must display the following acknowledgement:
17.\"	This product includes software developed or owned by Caldera
18.\"	International, Inc.
19.\" 4. Neither the name of Caldera International, Inc. nor the names of other
20.\"    contributors may be used to endorse or promote products derived from
21.\"    this software without specific prior written permission.
22.\"
23.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
24.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
25.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27.\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT,
28.\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
33.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34.\" POSSIBILITY OF SUCH DAMAGE.
35.\"
36.\"	@(#)dc.1	8.1 (Berkeley) 6/6/93
37.\"
38.Dd September 4, 2019
39.Dt DC 1
40.Os
41.Sh NAME
42.Nm dc
43.Nd desk calculator
44.Sh SYNOPSIS
45.Nm
46.Op Fl hxV
47.Op Fl e Ar expression
48.Op Fl f Ar filename
49.Op Ar filename
50.Sh DESCRIPTION
51.Nm
52is an arbitrary precision arithmetic package.
53The overall structure of
54.Nm
55is
56a stacking (reverse Polish) calculator i.e.\&
57numbers are stored on a stack.
58Adding a number pushes it onto the stack.
59Arithmetic operations pop arguments off the stack
60and push the results.
61See also the
62.Xr bc 1
63utility, which is a preprocessor for
64.Nm
65providing infix notation and a C-like syntax
66which implements functions and reasonable control
67structures for programs.
68The options are as follows:
69.Bl -tag -width Ds
70.It Fl e Ar expr , Fl Fl expression Ar expr
71Evaluate
72.Ar expression .
73If multiple
74.Fl e
75options are specified, they will be processed in the order given.
76.It Fl f Ar filename , Fl Fl file Ar filename
77Process the content of the given file before further calculations are done.
78If multiple
79.Fl f
80options are specified, they will be processed in the order given.
81.It Fl h , Fl Fl help
82Print short usage info.
83.It Fl V , Fl Fl version
84Print version info.
85.It Fl x
86Enable extended register mode.
87This mode is used by
88.Xr bc 1
89to allow more than 256 registers.
90See
91.Sx Registers
92for a more detailed description.
93.El
94.Pp
95If neither
96.Ar expression
97nor
98.Ar file
99are specified on the command line,
100.Nm
101reads from the standard input.
102Otherwise
103.Ar expression
104and
105.Ar file
106are processed and
107.Nm
108exits.
109.Pp
110Ordinarily,
111.Nm
112operates on decimal integers,
113but one may specify an input base, output base,
114and a number of fractional digits (scale) to be maintained.
115Whitespace is ignored, except where it signals the end of a number,
116end of a line or when a register name is expected.
117The following constructions are recognized:
118.Bl -tag -width "number"
119.It Va number
120The value of the number is pushed on the stack.
121A number is an unbroken string of the digits 0\-9 and letters A\-F.
122It may be preceded by an underscore
123.Pq Sq _
124to input a negative number.
125A number may contain a single decimal point.
126A number may also contain the characters A\-F, with the values 10\-15.
127.It Cm "+ - / * % ~ ^"
128The
129top two values on the stack are added
130(+),
131subtracted
132(\-),
133multiplied (*),
134divided (/),
135remaindered (%),
136divided and remaindered (~),
137or exponentiated (^).
138The two entries are popped off the stack;
139the result is pushed on the stack in their place.
140Any fractional part of an exponent is ignored.
141.Pp
142For addition, subtraction, and remainder, the scale of the result is the
143maximum of scales of the operands.
144For division the scale of the result is defined
145by the scale set by the
146.Ic k
147operation.
148For multiplication, the scale is defined by the expression
149.Sy min(a+b,max(a,b,scale)) ,
150where
151.Sy a
152and
153.Sy b
154are the scales of the operands, and
155.Sy scale
156is the scale defined by the
157.Ic k
158operation.
159For exponentiation with a non-negative exponent, the scale of the result is
160.Sy min(a*b,max(scale,a)) ,
161where
162.Sy a
163is the scale of the base, and
164.Sy b
165is the
166.Em value
167of the exponent.
168If the exponent is negative, the scale of the result is the scale
169defined by the
170.Ic k
171operation.
172.Pp
173In the case of the division and modulus operator (~),
174the resultant quotient is pushed first followed by the remainder.
175This is a shorthand for the sequence:
176.Bd -literal -offset indent -compact
177x y / x y %
178.Ed
179The division and modulus operator is a non-portable extension.
180.It Ic a
181Pop the top value from the stack.
182If that value is a number, compute the integer part of the number modulo 256.
183If the result is zero, push an empty string.
184Otherwise push a one character string by interpreting the computed value
185as an
186.Tn ASCII
187character.
188.Pp
189If the top value is a string, push a string containing the first character
190of the original string.
191If the original string is empty, an empty string is pushed back.
192The
193.Ic a
194operator is a non-portable extension.
195.It Ic c
196All values on the stack are popped.
197.It Ic d
198The top value on the stack is duplicated.
199.It Ic e
200Equivalent to
201.Ic p ,
202except that the output is written to the standard error stream.
203.It Ic f
204All values on the stack are printed, separated by newlines.
205.It Ic G
206The top two numbers are popped from the stack and compared.
207A one is pushed if the top of the stack is equal to the second number
208on the stack.
209A zero is pushed otherwise.
210This is a non-portable extension.
211.It Ic I
212Pushes the input base on the top of the stack.
213.It Ic i
214The top value on the stack is popped and used as the
215base for further input.
216The initial input base is 10.
217.It Ic J
218Pop the top value from the stack.
219The recursion level is popped by that value and, following that,
220the input is skipped until the first occurrence of the
221.Ic M
222operator.
223The
224.Ic J
225operator is a non-portable extension, used by the
226.Xr bc 1
227command.
228.It Ic K
229The current scale factor is pushed onto the stack.
230.It Ic k
231The top of the stack is popped, and that value is used as
232a non-negative scale factor:
233the appropriate number of places
234are printed on output,
235and maintained during multiplication, division, and exponentiation.
236The interaction of scale factor,
237input base, and output base will be reasonable if all are changed
238together.
239.It Ic L Ns Ar x
240Register
241.Ar x
242is treated as a stack and its top value is popped onto the main stack.
243.It Ic l Ns Ar x
244The
245value in register
246.Ar x
247is pushed on the stack.
248The register
249.Ar x
250is not altered.
251Initially, all registers contain the value zero.
252.It Ic M
253Mark used by the
254.Ic J
255operator.
256The
257.Ic M
258operator is a non-portable extensions, used by the
259.Xr bc 1
260command.
261.It Ic N
262The top of the stack is replaced by one if the top of the stack
263is equal to zero.
264If the top of the stack is unequal to zero, it is replaced by zero.
265This is a non-portable extension.
266.It Ic n
267The top value on the stack is popped and printed without a newline.
268This is a non-portable extension.
269.It Ic O
270Pushes the output base on the top of the stack.
271.It Ic o
272The top value on the stack is popped and used as the
273base for further output.
274The initial output base is 10.
275.It Ic P
276The top of the stack is popped.
277If the top of the stack is a string, it is printed without a trailing newline.
278If the top of the stack is a number, it is interpreted as a
279base 256 number, and each digit of this base 256 number is printed as
280an
281.Tn ASCII
282character, without a trailing newline.
283.It Ic p
284The top value on the stack is printed with a trailing newline.
285The top value remains unchanged.
286.It Ic Q
287The top value on the stack is popped and the string execution level is popped
288by that value.
289.It Ic q
290Exits the program.
291If executing a string, the recursion level is
292popped by two.
293.It Ic R
294The top of the stack is removed (popped).
295This is a non-portable extension.
296.It Ic r
297The top two values on the stack are reversed (swapped).
298This is a non-portable extension.
299.It Ic S Ns Ar x
300Register
301.Ar x
302is treated as a stack.
303The top value of the main stack is popped and pushed on it.
304.It Ic s Ns Ar x
305The
306top of the stack is popped and stored into
307a register named
308.Ar x .
309.It Ic v
310Replaces the top element on the stack by its square root.
311The scale of the result is the maximum of the scale of the argument
312and the current value of scale.
313.It Ic X
314Replaces the number on the top of the stack with its scale factor.
315If the top of the stack is a string, replace it with the integer 0.
316.It Ic x
317Treats the top element of the stack as a character string
318and executes it as a string of
319.Nm
320commands.
321.It Ic Z
322Replaces the number on the top of the stack with its length.
323The length of a string is its number of characters.
324The length of a number is its number of digits, not counting the minus sign
325and decimal point.
326.It Ic z
327The stack level is pushed onto the stack.
328.It Cm \&[ Ns ... Ns Cm \&]
329Puts the bracketed
330.Tn ASCII
331string onto the top of the stack.
332If the string includes brackets, these must be properly balanced.
333The backslash character
334.Pq Sq \e
335may be used as an escape character, making it
336possible to include unbalanced brackets in strings.
337To include a backslash in a string, use a double backslash.
338.It Xo
339.Cm < Ns Va x
340.Cm > Ns Va x
341.Cm = Ns Va x
342.Cm !< Ns Va x
343.Cm !> Ns Va x
344.Cm != Ns Va x
345.Xc
346The top two elements of the stack are popped and compared.
347Register
348.Ar x
349is executed if they obey the stated
350relation.
351.It Xo
352.Cm < Ns Va x Ns e Ns Va y
353.Cm > Ns Va x Ns e Ns Va y
354.Cm = Ns Va x Ns e Ns Va y
355.Cm !< Ns Va x Ns e Ns Va y
356.Cm !> Ns Va x Ns e Ns Va y
357.Cm != Ns Va x Ns e Ns Va y
358.Xc
359These operations are variants of the comparison operations above.
360The first register name is followed by the letter
361.Sq e
362and another register name.
363Register
364.Ar x
365will be executed if the relation is true, and register
366.Ar y
367will be executed if the relation is false.
368This is a non-portable extension.
369.It Ic \&(
370The top two numbers are popped from the stack and compared.
371A one is pushed if the top of the stack is less than the second number
372on the stack.
373A zero is pushed otherwise.
374This is a non-portable extension.
375.It Ic {
376The top two numbers are popped from the stack and compared.
377A one is pushed if the top of stack is less than or equal to the
378second number on the stack.
379A zero is pushed otherwise.
380This is a non-portable extension.
381.It Ic \&!
382Interprets the rest of the line as a
383.Ux
384command.
385.It Ic \&?
386A line of input is taken from the input source (usually the terminal)
387and executed.
388.It Ic \&: Ns Ar r
389Pop two values from the stack.
390The second value on the stack is stored into the array
391.Ar r
392indexed by the top of stack.
393.It Ic \&; Ns Ar r
394Pop a value from the stack.
395The value is used as an index into register
396.Ar r .
397The value in this register is pushed onto the stack.
398.Pp
399Array elements initially have the value zero.
400Each level of a stacked register has its own array associated with
401it.
402The command sequence
403.Bd -literal -offset indent
404[first] 0:a [dummy] Sa [second] 0:a 0;a p La 0;a p
405.Ed
406.Pp
407will print
408.Bd -literal -offset indent
409second
410first
411.Ed
412.Pp
413since the string
414.Ql second
415is written in an array that is later popped, to reveal the array that
416stored
417.Ql first .
418.It Ic #
419Skip the rest of the line.
420This is a non-portable extension.
421.El
422.Ss Registers
423Registers have a single character name
424.Ar x ,
425where
426.Ar x
427may be any character, including space, tab or any other special character.
428If extended register mode is enabled using the
429.Fl x
430option and the register identifier
431.Ar x
432has the value 255, the next two characters are interpreted as a
433two-byte register index.
434The set of standard single character registers and the set of extended
435registers do not overlap.
436Extended register mode is a non-portable extension.
437.Sh EXAMPLES
438An example which prints the first ten values of
439.Ic n! :
440.Bd -literal -offset indent
441[la1+dsa*pla10>y]sy
4420sa1
443lyx
444.Ed
445.Pp
446Independent of the current input base, the command
447.Bd -literal -offset indent
448Ai
449.Ed
450.Pp
451will reset the input base to decimal 10.
452.Sh DIAGNOSTICS
453.Bl -diag
454.It %c (0%o) is unimplemented
455an undefined operation was called.
456.It stack empty
457for not enough elements on the stack to do what was asked.
458.It stack register '%c' (0%o) is empty
459for an
460.Ar L
461operation from a stack register that is empty.
462.It Runtime warning: non-zero scale in exponent
463for a fractional part of an exponent that is being ignored.
464.It divide by zero
465for trying to divide by zero.
466.It remainder by zero
467for trying to take a remainder by zero.
468.It square root of negative number
469for trying to take the square root of a negative number.
470.It index too big
471for an array index that is larger than 2048.
472.It negative index
473for a negative array index.
474.It "input base must be a number between 2 and 16"
475for trying to set an illegal input base.
476.It output base must be a number greater than 1
477for trying to set an illegal output base.
478.It scale must be a nonnegative number
479for trying to set a negative or zero scale.
480.It scale too large
481for trying to set a scale that is too large.
482A scale must be representable as a 32-bit unsigned number.
483.It Q command argument exceeded string execution depth
484for trying to pop the recursion level more than the current
485recursion level.
486.It Q command requires a number >= 1
487for trying to pop an illegal number of recursion levels.
488.It recursion too deep
489for too many levels of nested execution.
490.Pp
491The recursion level is increased by one if the
492.Ar x
493or
494.Ar ?\&
495operation or one of the compare operations resulting in the execution
496of register is executed.
497As an exception, the recursion level is not increased if the operation
498is executed as the last command of a string.
499For example, the commands
500.Bd -literal -offset indent
501[lax]sa
5021 lax
503.Ed
504.Pp
505will execute an endless loop, while the commands
506.Bd -literal -offset indent
507[laxp]sa
5081 lax
509.Ed
510.Pp
511will terminate because of a too deep recursion level.
512.It J command argument exceeded string execution depth
513for trying to pop the recursion level more than the current
514recursion level.
515.It mark not found
516for a failed scan for an occurrence of the
517.Ic M
518operator.
519.El
520.Sh SEE ALSO
521.Xr bc 1
522.Pp
523.An -nosplit
524.An L. L. Cherry ,
525.An R. Morris
526"DC \- An Interactive Desk Calculator"
527.Pa /usr/share/doc/usd/05.dc/ .
528.Sh STANDARDS
529The arithmetic operations of the
530.Nm
531utility are expected to conform to the definition listed in the
532.Xr bc 1
533section of the
534.St -p1003.2
535specification.
536.Sh HISTORY
537The
538.Nm
539command first appeared in
540.At v1 .
541A complete rewrite of the
542.Nm
543command using the
544.Xr bn 3
545big number routines first appeared in
546.Ox 3.5 .
547.Sh AUTHORS
548.An -nosplit
549The original version of the
550.Nm
551command was written by
552.An Robert Morris
553and
554.An Lorinda Cherry .
555The current version of the
556.Nm
557utility was written by
558.An Otto Moerbeek .
559