694 lines
16 KiB
HTML
694 lines
16 KiB
HTML
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<HTML><HEAD><TITLE>Man page of dc</TITLE>
|
|
</HEAD><BODY>
|
|
<H1>dc</H1>
|
|
Section: User Commands (1)<BR>Updated: 2008-05-22<BR><A HREF="#index">Index</A>
|
|
<A HREF="/cgi-bin/man/man2html">Return to Main Contents</A><HR>
|
|
|
|
|
|
|
|
<A NAME="lbAB"> </A>
|
|
<H2>NAME</H2>
|
|
|
|
dc - an arbitrary precision calculator
|
|
<A NAME="lbAC"> </A>
|
|
<H2>SYNOPSIS</H2>
|
|
|
|
dc [-V] [--version] [-h] [--help]
|
|
<BR> [-e scriptexpression] [--expression=scriptexpression]
|
|
<BR> [-f scriptfile] [--file=scriptfile]
|
|
<BR> [file ...]
|
|
<A NAME="lbAD"> </A>
|
|
<H2>DESCRIPTION</H2>
|
|
|
|
<P>
|
|
|
|
<I>dc</I> is a reverse-polish desk calculator which supports
|
|
unlimited precision arithmetic.
|
|
It also allows you to define and call macros.
|
|
Normally <I>dc</I> reads from the standard input;
|
|
if any command arguments are given to it, they are filenames,
|
|
and <I>dc</I> reads and executes the contents of the files before reading
|
|
from standard input.
|
|
All normal output is to standard output;
|
|
all error output is to standard error.
|
|
<P>
|
|
|
|
A reverse-polish calculator stores numbers on a stack.
|
|
Entering a number pushes it on the stack.
|
|
Arithmetic operations pop arguments off the stack and push the results.
|
|
<P>
|
|
|
|
To enter a number in
|
|
<I>dc</I>,
|
|
|
|
type the digits
|
|
(using upper case letters
|
|
<I>A</I>
|
|
|
|
through
|
|
<I>F</I>
|
|
|
|
as "digits" when working
|
|
with input bases greater than ten),
|
|
with an optional decimal point.
|
|
Exponential notation is not supported.
|
|
To enter a negative number,
|
|
begin the number with ``_''.
|
|
``-'' cannot be used for this,
|
|
as it is a binary operator for subtraction instead.
|
|
To enter two numbers in succession,
|
|
separate them with spaces or newlines.
|
|
These have no meaning as commands.
|
|
<A NAME="lbAE"> </A>
|
|
<H2>OPTIONS</H2>
|
|
|
|
<I>dc</I> may be invoked with the following command-line options:
|
|
<DL COMPACT>
|
|
<DT id="1"><B>-V</B>
|
|
|
|
<DD>
|
|
<DT id="2"><B>--version</B>
|
|
|
|
<DD>
|
|
Print out the version of <I>dc</I> that is being run and a copyright notice,
|
|
then exit.
|
|
<DT id="3"><B>-h</B>
|
|
|
|
<DD>
|
|
<DT id="4"><B>--help</B>
|
|
|
|
<DD>
|
|
Print a usage message briefly summarizing these command-line options
|
|
and the bug-reporting address,
|
|
then exit.
|
|
<DT id="5"><B>-e </B><I>script</I>
|
|
|
|
<DD>
|
|
<DT id="6"><B>--expression=</B><I>script</I>
|
|
|
|
<DD>
|
|
Add the commands in
|
|
<I>script</I>
|
|
|
|
to the set of commands to be run while processing the input.
|
|
<DT id="7"><B>-f </B><I>script-file</I>
|
|
|
|
<DD>
|
|
<DT id="8"><B>--file=</B><I>script-file</I>
|
|
|
|
<DD>
|
|
Add the commands contained in the file
|
|
<I>script-file</I>
|
|
|
|
to the set of commands to be run while processing the input.
|
|
</DL>
|
|
<P>
|
|
|
|
If any command-line parameters remain after processing the above,
|
|
these parameters are interpreted as the names of input files to
|
|
be processed.
|
|
A file name of
|
|
<B>-</B>
|
|
|
|
refers to the standard input stream.
|
|
The standard input will processed if no script files or
|
|
expressions are specified.
|
|
|
|
<A NAME="lbAF"> </A>
|
|
<H2>Printing Commands</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="9"><B>p</B>
|
|
|
|
<DD>
|
|
Prints the value on the top of the stack,
|
|
without altering the stack.
|
|
A newline is printed after the value.
|
|
<DT id="10"><B>n</B>
|
|
|
|
<DD>
|
|
Prints the value on the top of the stack, popping it off,
|
|
and does not print a newline after.
|
|
<DT id="11"><B>P</B>
|
|
|
|
<DD>
|
|
Pops off the value on top of the stack.
|
|
If it it a string, it is simply printed without a trailing newline.
|
|
Otherwise it is a number, and the integer portion of its absolute
|
|
value is printed out as a "base (UCHAR_MAX+1)" byte stream.
|
|
Assuming that (UCHAR_MAX+1) is 256
|
|
(as it is on most machines with 8-bit bytes),
|
|
the sequence <B>KSK0k1/_1Ss [ls*]Sxd0>x
|
|
[256~Ssd0<x]dsxxsx[q]Sq[Lsd0>qaPlxx]
|
|
dsxxsx0sqLqsxLxLK+k</B>
|
|
could also accomplish this function.
|
|
(Much of the complexity of the above native-dc code is due
|
|
to the ~ computing the characters backwards,
|
|
and the desire to ensure that all registers wind up back
|
|
in their original states.)
|
|
<DT id="12"><B>f</B>
|
|
|
|
<DD>
|
|
Prints the entire contents of the stack
|
|
|
|
without altering anything.
|
|
This is a good command to use if you are lost or want
|
|
to figure out what the effect of some command has been.
|
|
|
|
</DL>
|
|
<A NAME="lbAG"> </A>
|
|
<H2>Arithmetic</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="13"><B>+</B>
|
|
|
|
<DD>
|
|
Pops two values off the stack, adds them,
|
|
and pushes the result.
|
|
The precision of the result is determined only
|
|
by the values of the arguments,
|
|
and is enough to be exact.
|
|
<DT id="14"><B>-</B>
|
|
|
|
<DD>
|
|
Pops two values,
|
|
subtracts the first one popped from the second one popped,
|
|
and pushes the result.
|
|
<DT id="15"><B>*</B>
|
|
|
|
<DD>
|
|
Pops two values, multiplies them, and pushes the result.
|
|
The number of fraction digits in the result depends on
|
|
the current precision value and the number of fraction
|
|
digits in the two arguments.
|
|
<DT id="16"><B>/</B>
|
|
|
|
<DD>
|
|
Pops two values,
|
|
divides the second one popped from the first one popped,
|
|
and pushes the result.
|
|
The number of fraction digits is specified by the precision value.
|
|
<DT id="17"><B>%</B>
|
|
|
|
<DD>
|
|
Pops two values,
|
|
computes the remainder of the division that the
|
|
<B>/</B>
|
|
|
|
command would do,
|
|
and pushes that.
|
|
The value computed is the same as that computed by
|
|
the sequence <B>Sd dld/ Ld*-</B> .
|
|
<DT id="18"><B>~</B>
|
|
|
|
<DD>
|
|
Pops two values,
|
|
divides the second one popped from the first one popped.
|
|
The quotient is pushed first, and the remainder is pushed next.
|
|
The number of fraction digits used in the division
|
|
is specified by the precision value.
|
|
(The sequence <B>SdSn lnld/ LnLd%</B> could also accomplish
|
|
this function, with slightly different error checking.)
|
|
<DT id="19"><B>^</B>
|
|
|
|
<DD>
|
|
Pops two values and exponentiates,
|
|
using the first value popped as the exponent
|
|
and the second popped as the base.
|
|
The fraction part of the exponent is ignored.
|
|
The precision value specifies the number of fraction
|
|
digits in the result.
|
|
<DT id="20"><B>|</B>
|
|
|
|
<DD>
|
|
Pops three values and computes a modular exponentiation.
|
|
The first value popped is used as the reduction modulus;
|
|
this value must be a non-zero number,
|
|
and should be an integer.
|
|
The second popped is used as the exponent;
|
|
this value must be a non-negative number,
|
|
and any fractional part of this exponent will be ignored.
|
|
The third value popped is the base which gets exponentiated,
|
|
which should be an integer.
|
|
For small integers this is like the sequence <B>Sm^Lm%</B>,
|
|
but, unlike <B>^</B>, this command will work with arbitrarily large exponents.
|
|
<DT id="21"><B>v</B>
|
|
|
|
<DD>
|
|
Pops one value,
|
|
computes its square root,
|
|
and pushes that.
|
|
The maximum of the precision value and the precision of the argument
|
|
is used to determine the number of fraction digits in the result.
|
|
</DL>
|
|
<P>
|
|
|
|
Most arithmetic operations are affected by the ``precision value'',
|
|
which you can set with the
|
|
<B>k</B>
|
|
|
|
command.
|
|
The default precision value is zero,
|
|
which means that all arithmetic except for
|
|
addition and subtraction produces integer results.
|
|
<A NAME="lbAH"> </A>
|
|
<H2>Stack Control</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="22"><B>c</B>
|
|
|
|
<DD>
|
|
Clears the stack, rendering it empty.
|
|
<DT id="23"><B>d</B>
|
|
|
|
<DD>
|
|
Duplicates the value on the top of the stack,
|
|
pushing another copy of it.
|
|
Thus, ``4d*p'' computes 4 squared and prints it.
|
|
<DT id="24"><B>r</B>
|
|
|
|
<DD>
|
|
Reverses the order of (swaps) the top two values on the stack.
|
|
(This can also be accomplished with the sequence <B>SaSbLaLb</B>.)
|
|
<DT id="25"><B>R</B>
|
|
|
|
<DD>
|
|
Pops the top-of-stack as an integer
|
|
<I>n</I>.
|
|
|
|
Cyclically rotates the top
|
|
<I>n</I>
|
|
|
|
items on the updated stack.
|
|
If
|
|
<I>n</I>
|
|
|
|
is positive, then the rotation direction will make the topmost
|
|
element the second-from top;
|
|
if
|
|
<I>n</I>
|
|
|
|
is negative, then the rotation will make the topmost element the
|
|
<I>n</I>-th
|
|
|
|
element from the top.
|
|
If the stack depth is less than
|
|
<I>n</I>,
|
|
|
|
then the entire stack is rotated (in the appropriate direction),
|
|
without any error being reported.
|
|
</DL>
|
|
<A NAME="lbAI"> </A>
|
|
<H2>Registers</H2>
|
|
|
|
<P>
|
|
|
|
<I>dc</I> provides at least 256 memory registers,
|
|
each named by a single character.
|
|
You can store a number or a string in a register and retrieve it later.
|
|
<DL COMPACT>
|
|
<DT id="26"><B>s</B><I>r</I>
|
|
|
|
<DD>
|
|
Pop the value off the top of the stack and store
|
|
it into register
|
|
<I>r</I>.
|
|
|
|
<DT id="27"><B>l</B><I>r</I>
|
|
|
|
<DD>
|
|
Copy the value in register
|
|
<I>r</I>
|
|
|
|
and push it onto the stack.
|
|
The value 0 is retrieved if the register is uninitialized.
|
|
This does not alter the contents of
|
|
<I>r</I>.
|
|
|
|
</DL>
|
|
<P>
|
|
|
|
Each register also contains its own stack.
|
|
The current register value is the top of the register's stack.
|
|
<DL COMPACT>
|
|
<DT id="28"><B>S</B><I>r</I>
|
|
|
|
<DD>
|
|
Pop the value off the top of the (main) stack and
|
|
push it onto the stack of register
|
|
<I>r</I>.
|
|
|
|
The previous value of the register becomes inaccessible.
|
|
<DT id="29"><B>L</B><I>r</I>
|
|
|
|
<DD>
|
|
Pop the value off the top of register
|
|
<I>r</I>'s
|
|
|
|
stack and push it onto the main stack.
|
|
The previous value
|
|
in register
|
|
<I>r</I>'s
|
|
|
|
stack, if any,
|
|
is now accessible via the
|
|
<B>l</B><I>r</I>
|
|
|
|
command.
|
|
|
|
</DL>
|
|
<A NAME="lbAJ"> </A>
|
|
<H2>Parameters</H2>
|
|
|
|
<P>
|
|
|
|
<I>dc</I> has three parameters that control its operation:
|
|
the precision, the input radix, and the output radix.
|
|
The precision specifies the number
|
|
of fraction digits to keep in the result of most arithmetic operations.
|
|
The input radix controls the interpretation of numbers typed in;
|
|
all numbers typed in use this radix.
|
|
The output radix is used for printing numbers.
|
|
<P>
|
|
|
|
The input and output radices are separate parameters;
|
|
you can make them unequal,
|
|
which can be useful or confusing.
|
|
The input radix must be between 2 and 16 inclusive.
|
|
The output radix must be at least 2.
|
|
The precision must be zero or greater.
|
|
The precision is always measured in decimal digits,
|
|
regardless of the current input or output radix.
|
|
<DL COMPACT>
|
|
<DT id="30"><B>i</B>
|
|
|
|
<DD>
|
|
Pops the value off the top of the stack
|
|
and uses it to set the input radix.
|
|
<DT id="31"><B>o</B>
|
|
|
|
<DD>
|
|
Pops the value off the top of the stack
|
|
and uses it to set the output radix.
|
|
<DT id="32"><B>k</B>
|
|
|
|
<DD>
|
|
Pops the value off the top of the stack
|
|
and uses it to set the precision.
|
|
<DT id="33"><B>I</B>
|
|
|
|
<DD>
|
|
Pushes the current input radix on the stack.
|
|
<DT id="34"><B>O</B>
|
|
|
|
<DD>
|
|
Pushes the current output radix on the stack.
|
|
<DT id="35"><B>K</B>
|
|
|
|
<DD>
|
|
Pushes the current precision on the stack.
|
|
</DL>
|
|
<A NAME="lbAK"> </A>
|
|
<H2>Strings</H2>
|
|
|
|
<P>
|
|
|
|
<I>dc</I> has a limited ability to operate on strings
|
|
as well as on numbers;
|
|
the only things you can do with strings are
|
|
print them and execute them as macros
|
|
(which means that the contents of the string are processed as
|
|
<I>dc</I> commands).
|
|
All registers and the stack can hold strings,
|
|
and <I>dc</I> always knows whether any given object is a string or a number.
|
|
Some commands such as arithmetic operations demand numbers
|
|
as arguments and print errors if given strings.
|
|
Other commands can accept either a number or a string;
|
|
for example, the
|
|
<B>p</B>
|
|
|
|
command can accept either and prints the object
|
|
according to its type.
|
|
<DL COMPACT>
|
|
<DT id="36"><B>[</B><I>characters</I><B>]</B>
|
|
|
|
<DD>
|
|
Makes a string containing
|
|
<I>characters</I>
|
|
|
|
(contained between balanced
|
|
<B>[</B>
|
|
|
|
and
|
|
<B>]</B>
|
|
|
|
characters),
|
|
and pushes it on the stack.
|
|
For example,
|
|
<B>[foo]P</B>
|
|
|
|
prints the characters
|
|
<B>foo</B>
|
|
|
|
(with no newline).
|
|
<DT id="37"><B>a</B>
|
|
|
|
<DD>
|
|
The top-of-stack is popped.
|
|
If it was a number, then the low-order byte of this number
|
|
is converted into a string and pushed onto the stack.
|
|
Otherwise the top-of-stack was a string,
|
|
and the first character of that string is pushed back.
|
|
<DT id="38"><B>x</B>
|
|
|
|
<DD>
|
|
Pops a value off the stack and executes it as a macro.
|
|
Normally it should be a string;
|
|
if it is a number,
|
|
it is simply pushed back onto the stack.
|
|
For example,
|
|
<B>[1p]x</B>
|
|
|
|
executes the macro
|
|
<B>1p</B>
|
|
|
|
which pushes
|
|
<B>1</B>
|
|
|
|
on the stack and prints
|
|
<B>1</B>
|
|
|
|
on a separate line.
|
|
</DL>
|
|
<P>
|
|
|
|
Macros are most often stored in registers;
|
|
<B>[1p]sa</B>
|
|
|
|
stores a macro to print
|
|
<B>1</B>
|
|
|
|
into register
|
|
<B>a</B>,
|
|
|
|
and
|
|
<B>lax</B>
|
|
|
|
invokes this macro.
|
|
<DL COMPACT>
|
|
<DT id="39"><B>></B><I>r</I>
|
|
|
|
<DD>
|
|
Pops two values off the stack and compares them
|
|
assuming they are numbers,
|
|
executing the contents of register
|
|
<I>r</I>
|
|
|
|
as a macro if the original top-of-stack
|
|
is greater.
|
|
Thus,
|
|
<B>1 2>a</B>
|
|
|
|
will invoke register
|
|
<B>a</B>'s
|
|
|
|
contents and
|
|
<B>2 1>a</B>
|
|
|
|
will not.
|
|
<DT id="40"><B>!></B><I>r</I>
|
|
|
|
<DD>
|
|
Similar but invokes the macro if the original top-of-stack is
|
|
not greater than (less than or equal to) what was the second-to-top.
|
|
<DT id="41"><B><</B><I>r</I>
|
|
|
|
<DD>
|
|
Similar but invokes the macro if the original top-of-stack is less.
|
|
<DT id="42"><B>!<</B><I>r</I>
|
|
|
|
<DD>
|
|
Similar but invokes the macro if the original top-of-stack is
|
|
not less than (greater than or equal to) what was the second-to-top.
|
|
<DT id="43"><B>=</B><I>r</I>
|
|
|
|
<DD>
|
|
Similar but invokes the macro if the two numbers popped are equal.
|
|
<DT id="44"><B>!=</B><I>r</I>
|
|
|
|
<DD>
|
|
Similar but invokes the macro if the two numbers popped are not equal.
|
|
|
|
<DT id="45"><B>?</B>
|
|
|
|
<DD>
|
|
Reads a line from the terminal and executes it.
|
|
This command allows a macro to request input from the user.
|
|
<DT id="46"><B>q</B>
|
|
|
|
<DD>
|
|
exits from a macro and also from the macro which invoked it.
|
|
If called from the top level,
|
|
or from a macro which was called directly from the top level,
|
|
the
|
|
<B>q</B>
|
|
|
|
command will cause <I>dc</I> to exit.
|
|
<DT id="47"><B>Q</B>
|
|
|
|
<DD>
|
|
Pops a value off the stack and uses it as a count
|
|
of levels of macro execution to be exited.
|
|
Thus,
|
|
<B>3Q</B>
|
|
|
|
exits three levels.
|
|
The
|
|
<B>Q</B>
|
|
|
|
command will never cause <I>dc</I> to exit.
|
|
</DL>
|
|
<A NAME="lbAL"> </A>
|
|
<H2>Status Inquiry</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="48"><B>Z</B>
|
|
|
|
<DD>
|
|
Pops a value off the stack,
|
|
calculates the number of decimal digits it has
|
|
(or number of characters, if it is a string)
|
|
and pushes that number.
|
|
The digit count for a number does
|
|
<I>not</I>
|
|
|
|
include any leading zeros,
|
|
even if those appear to the right of the radix point.
|
|
<DT id="49"><B>X</B>
|
|
|
|
<DD>
|
|
Pops a value off the stack,
|
|
calculates the number of fraction digits it has,
|
|
and pushes that number.
|
|
For a string,
|
|
the value pushed is
|
|
|
|
0.
|
|
<DT id="50"><B>z</B>
|
|
|
|
<DD>
|
|
Pushes the current stack depth:
|
|
the number of objects on the stack before the execution of the
|
|
<B>z</B>
|
|
|
|
command.
|
|
</DL>
|
|
<A NAME="lbAM"> </A>
|
|
<H2>Miscellaneous</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="51"><B>!</B>
|
|
|
|
<DD>
|
|
Will run the rest of the line as a system command.
|
|
Note that parsing of the !<, !=, and !> commands take precedence,
|
|
so if you want to run a command starting with <, =, or > you will
|
|
need to add a space after the !.
|
|
<DT id="52"><B>#</B>
|
|
|
|
<DD>
|
|
Will interpret the rest of the line as a comment.
|
|
<DT id="53"><B>:</B><I>r</I>
|
|
|
|
<DD>
|
|
Will pop the top two values off of the stack.
|
|
The old second-to-top value will be stored in the array
|
|
<I>r</I>,
|
|
|
|
indexed by the old top-of-stack value.
|
|
<DT id="54"><B>;</B><I>r</I>
|
|
|
|
<DD>
|
|
Pops the top-of-stack and uses it as an index into
|
|
the array
|
|
<I>r</I>.
|
|
|
|
The selected value is then pushed onto the stack.
|
|
</DL>
|
|
<P>
|
|
|
|
Note that each stacked instance of a register has its own
|
|
array associated with it.
|
|
Thus <B>1 0:a 0Sa 2 0:a La 0;ap</B> will print 1,
|
|
because the 2 was stored in an instance of 0:a that
|
|
was later popped.
|
|
<A NAME="lbAN"> </A>
|
|
<H2>FILES</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="55">~/.dcrc<DD>
|
|
The commands in this file will be executed when
|
|
<I>dc</I>
|
|
|
|
is first run.
|
|
</DL>
|
|
<P>
|
|
|
|
<A NAME="lbAO"> </A>
|
|
<H2>BUGS</H2>
|
|
|
|
<P>
|
|
|
|
Email bug reports to
|
|
<B><A HREF="mailto:bug-dc@gnu.org">bug-dc@gnu.org</A></B>.
|
|
|
|
<P>
|
|
|
|
<HR>
|
|
<A NAME="index"> </A><H2>Index</H2>
|
|
<DL>
|
|
<DT id="56"><A HREF="#lbAB">NAME</A><DD>
|
|
<DT id="57"><A HREF="#lbAC">SYNOPSIS</A><DD>
|
|
<DT id="58"><A HREF="#lbAD">DESCRIPTION</A><DD>
|
|
<DT id="59"><A HREF="#lbAE">OPTIONS</A><DD>
|
|
<DT id="60"><A HREF="#lbAF">Printing Commands</A><DD>
|
|
<DT id="61"><A HREF="#lbAG">Arithmetic</A><DD>
|
|
<DT id="62"><A HREF="#lbAH">Stack Control</A><DD>
|
|
<DT id="63"><A HREF="#lbAI">Registers</A><DD>
|
|
<DT id="64"><A HREF="#lbAJ">Parameters</A><DD>
|
|
<DT id="65"><A HREF="#lbAK">Strings</A><DD>
|
|
<DT id="66"><A HREF="#lbAL">Status Inquiry</A><DD>
|
|
<DT id="67"><A HREF="#lbAM">Miscellaneous</A><DD>
|
|
<DT id="68"><A HREF="#lbAN">FILES</A><DD>
|
|
<DT id="69"><A HREF="#lbAO">BUGS</A><DD>
|
|
</DL>
|
|
<HR>
|
|
This document was created by
|
|
<A HREF="/cgi-bin/man/man2html">man2html</A>,
|
|
using the manual pages.<BR>
|
|
Time: 00:05:09 GMT, March 31, 2021
|
|
</BODY>
|
|
</HTML>
|