
Packit 
70b277 
\input texinfo @c *texinfo*


Packit 
70b277 
@c %**start of header


Packit 
70b277 
@setfilename dc.info


Packit 
70b277 
@settitle dc, an arbitrary precision calculator


Packit 
70b277 
@c %**end of header


Packit 
70b277 


Packit 
70b277 
@include texiver.incl


Packit 
70b277 


Packit 
70b277 
@c smallbook


Packit 
70b277 
@c tex


Packit 
70b277 
@c \overfullrule=0pt


Packit 
70b277 
@c end tex


Packit 
70b277 


Packit 
70b277 
@c Combine indices.


Packit 
70b277 
@synindex cp fn


Packit 
70b277 
@syncodeindex vr fn


Packit 
70b277 
@syncodeindex ky fn


Packit 
70b277 
@syncodeindex pg fn


Packit 
70b277 
@syncodeindex tp fn


Packit 
70b277 


Packit 
70b277 
@direntry


Packit 
70b277 
* dc: (dc). Arbitrary precision RPN ``Desktop Calculator''.


Packit 
70b277 
@end direntry


Packit 
70b277 


Packit 
70b277 
@copying


Packit 
70b277 
This manual documents version @value{DC_VERSION} of


Packit 
70b277 
@sc{gnu} @command{dc}, an arbitrary precision calculator.


Packit 
70b277 


Packit 
70b277 
Copyright (C) 1984, 1994, 1997, 1998, 2000, 2005, 2006, 2008, 2013, 2016


Packit 
70b277 
Free Software Foundation, Inc.


Packit 
70b277 


Packit 
70b277 
@quotation


Packit 
70b277 
Permission is granted to copy, distribute and/or modify this document


Packit 
70b277 
under the terms of the @sc{gnu} Free Documentation License,


Packit 
70b277 
Version 1.2 or any later version published by the Free Software Foundation;


Packit 
70b277 
with no Invariant Sections, with no FrontCover Texts,


Packit 
70b277 
and with no BackCover Texts.


Packit 
70b277 
A copy of the license can be found at


Packit 
70b277 
@url{http://www.gnu.org/licenses/fdl.html} .


Packit 
70b277 
@end quotation


Packit 
70b277 
@end copying


Packit 
70b277 


Packit 
70b277 
@setchapternewpage off


Packit 
70b277 


Packit 
70b277 
@titlepage


Packit 
70b277 
@title @sc{gnu} @code{dc}


Packit 
70b277 
@subtitle an arbitrary precision calculator


Packit 
70b277 
@subtitle version @value{DC_VERSION}


Packit 
70b277 
@author by Ken Pizzini


Packit 
70b277 
@author original manual by Richard Stallman


Packit 
70b277 
@page


Packit 
70b277 
@vskip 0pt plus 1filll


Packit 
70b277 
@insertcopying


Packit 
70b277 
@end titlepage


Packit 
70b277 


Packit 
70b277 
@ifnottex


Packit 
70b277 
@node Top


Packit 
70b277 
@top GNU dc


Packit 
70b277 
@insertcopying


Packit 
70b277 
@end ifnottex


Packit 
70b277 


Packit 
70b277 
@menu


Packit 
70b277 
* Introduction:: Introduction


Packit 
70b277 
* Invocation:: Invocation


Packit 
70b277 
* Printing Commands:: Printing Commands


Packit 
70b277 
* Arithmetic:: Arithmetic


Packit 
70b277 
* Stack Control:: Stack Control


Packit 
70b277 
* Registers:: Registers


Packit 
70b277 
* Parameters:: Parameters


Packit 
70b277 
* Strings:: Strings


Packit 
70b277 
* Status Inquiry:: Status Inquiry


Packit 
70b277 
* Miscellaneous:: Other commands


Packit 
70b277 
* Reporting bugs:: Reporting bugs


Packit 
70b277 
@end menu


Packit 
70b277 


Packit 
70b277 
@node Introduction, Invocation, Top, Top


Packit 
70b277 
@comment nodename, next, previous, up


Packit 
70b277 
@chapter Introduction


Packit 
70b277 


Packit 
70b277 
@command{dc} is a reversepolish desk calculator


Packit 
70b277 
which supports unlimited precision arithmetic.


Packit 
70b277 
It also allows you to define and call macros.


Packit 
70b277 
Normally @command{dc} reads from the standard input;


Packit 
70b277 
if any command arguments are given to it, they are filenames,


Packit 
70b277 
and @command{dc} reads and executes the contents of the files


Packit 
70b277 
instead of reading from standard input.


Packit 
70b277 
All normal output is to standard output;


Packit 
70b277 
all error messages are written to standard error.


Packit 
70b277 


Packit 
70b277 
To exit, use @samp{q}.


Packit 
70b277 
@kbd{Cc}


Packit 
70b277 
(or whatever other keystroke your system uses to generate a @code{SIGINT})


Packit 
70b277 
does not exit;


Packit 
70b277 
it is used to abort macros that are looping, etc.


Packit 
70b277 


Packit 
70b277 
A reversepolish calculator stores numbers on a stack.


Packit 
70b277 
Entering a number pushes it on the stack.


Packit 
70b277 
Arithmetic operations pop arguments off the stack and push the results.


Packit 
70b277 


Packit 
70b277 
To enter a number in @command{dc}, type the digits (using upper


Packit 
70b277 
case letters @code{A} through @code{F} as "digits" when working


Packit 
70b277 
with input bases greater than ten),


Packit 
70b277 
with an optional decimal point.


Packit 
70b277 
Exponential notation is not supported.


Packit 
70b277 
To enter a negative number, begin the number with @samp{_}.


Packit 
70b277 
@samp{} cannot be used for this, as it is a binary operator


Packit 
70b277 
for subtraction instead.


Packit 
70b277 
To enter two numbers in succession,


Packit 
70b277 
separate them with spaces or newlines;


Packit 
70b277 
these have no meaning as commands.


Packit 
70b277 


Packit 
70b277 
@node Invocation, Printing Commands, Introduction, Top


Packit 
70b277 
@chapter Invocation


Packit 
70b277 


Packit 
70b277 
@command{dc} may be invoked with the following commandline options:


Packit 
70b277 
@table @samp


Packit 
70b277 


Packit 
70b277 
@item e @var{expr}


Packit 
70b277 
@item expression=@var{expr}


Packit 
70b277 
Evaluate @var{expr} as @command{dc} commands.


Packit 
70b277 


Packit 
70b277 
@item f @var{file}


Packit 
70b277 
@item file=@var{file}


Packit 
70b277 
Read and evaluate @command{dc} commands from @var{file}.


Packit 
70b277 


Packit 
70b277 
@item h


Packit 
70b277 
@item help


Packit 
70b277 
Print a usage message summarizing the commandline options, then exit.


Packit 
70b277 


Packit 
70b277 
@item V


Packit 
70b277 
@item version


Packit 
70b277 
Print the version information for this program, then exit.


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
If any commandline parameters remain after processing the options,


Packit 
70b277 
these parameters are interpreted as additional @var{file}s whose


Packit 
70b277 
contents are read and evaluated.


Packit 
70b277 
A file name of @code{} refers to the standard input stream.


Packit 
70b277 
If no @code{e} option was specified, and no files were specified,


Packit 
70b277 
then the standard input will be read for commands to evaluate.


Packit 
70b277 


Packit 
70b277 
@node Printing Commands, Arithmetic, Invocation, Top


Packit 
70b277 
@chapter Printing Commands


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item p


Packit 
70b277 
Prints the value on the top of the stack,


Packit 
70b277 
without altering the stack.


Packit 
70b277 
A newline is printed after the value.


Packit 
70b277 


Packit 
70b277 
@item n


Packit 
70b277 
Prints the value on the top of the stack, popping it off,


Packit 
70b277 
and does not print a newline after.


Packit 
70b277 
(This command is a @sc{gnu} extension.)


Packit 
70b277 


Packit 
70b277 
@item P


Packit 
70b277 
Pops off the value on top of the stack.


Packit 
70b277 
If it it a string, it is simply printed without a trailing newline.


Packit 
70b277 
Otherwise it is a number, and the integer portion of its absolute


Packit 
70b277 
value is printed out as a "base (UCHAR_MAX+1)" byte stream.


Packit 
70b277 
Assuming that (UCHAR_MAX+1) is 256


Packit 
70b277 
(as it is on most machines with 8bit bytes),


Packit 
70b277 
the sequence


Packit 
70b277 
@code{KSK0k1/ _1Ss[ls*]Sxd0>x


Packit 
70b277 
[256~Ssd0


Packit 
70b277 
sx[q]Sq[Lsd0>qaPlxx]dsxx


Packit 
70b277 
sx0sqLqsxLxLK+k}


Packit 
70b277 
could also accomplish this function.


Packit 
70b277 
(Much of the complexity of the above nativedc code is due


Packit 
70b277 
to the ~ computing the characters backwards,


Packit 
70b277 
and the desire to ensure that all registers wind up back


Packit 
70b277 
in their original states.)


Packit 
70b277 
(Details of the behavior with a number are a @sc{gnu} extension.


Packit 
70b277 
Traditional @command{dc} happened to "support" similar functionality


Packit 
70b277 
for a limited range of inputs as an accidental sideeffect of its


Packit 
70b277 
internal representation of numbers.)


Packit 
70b277 


Packit 
70b277 
@item f


Packit 
70b277 
Prints the entire contents of the stack


Packit 
70b277 
@c and the contents of all of the registers,


Packit 
70b277 
without altering anything.


Packit 
70b277 
This is a good command to use if you are lost or want


Packit 
70b277 
to figure out what the effect of some command has been.


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
All numeric output is split to fit within 70 columns, by default.


Packit 
70b277 
When a number is broken up in this way, the split is indicated


Packit 
70b277 
by a "\" at the end of the tobecontinued output lines.


Packit 
70b277 
The column width at which output is split can be overridden


Packit 
70b277 
by setting the @var{DC_LINE_LENGTH} environment variable to


Packit 
70b277 
the desired width.


Packit 
70b277 
A @var{DC_LINE_LENGTH} of 0 (zero) disables the linesplit


Packit 
70b277 
feature altogether.


Packit 
70b277 
Invalid values of @var{DC_LINE_LENGTH} are silently ignored.


Packit 
70b277 
(The @var{DC_LINE_LENGTH} variable is a @sc{gnu} extension.)


Packit 
70b277 


Packit 
70b277 
@node Arithmetic, Stack Control, Printing Commands, Top


Packit 
70b277 
@chapter Arithmetic


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item +


Packit 
70b277 
Pops two values off the stack, adds them, and pushes the result.


Packit 
70b277 
The precision of the result is determined only


Packit 
70b277 
by the values of the arguments, and is enough to be exact.


Packit 
70b277 


Packit 
70b277 
@item 


Packit 
70b277 
Pops two values, subtracts the first one popped


Packit 
70b277 
from the second one popped, and pushes the result.


Packit 
70b277 


Packit 
70b277 
@item *


Packit 
70b277 
Pops two values, multiplies them, and pushes the result.


Packit 
70b277 
The number of fraction digits in the result is the largest of


Packit 
70b277 
the precision value,


Packit 
70b277 
the number of fraction digits in the multiplier,


Packit 
70b277 
or the number of fraction digits in the multiplicand;


Packit 
70b277 
but in no event exceeding the number of digits required for


Packit 
70b277 
an exact result.


Packit 
70b277 


Packit 
70b277 
@item /


Packit 
70b277 
Pops two values, divides the second one popped


Packit 
70b277 
from the first one popped, and pushes the result.


Packit 
70b277 
The number of fraction digits is specified by the precision value.


Packit 
70b277 


Packit 
70b277 
@item %


Packit 
70b277 
Pops two values,


Packit 
70b277 
computes the remainder of the division that


Packit 
70b277 
the @samp{/} command would do,


Packit 
70b277 
and pushes that.


Packit 
70b277 
The value computed is the same as that computed by


Packit 
70b277 
the sequence @code{Sd dld/ Ld*} .


Packit 
70b277 


Packit 
70b277 
@item ~


Packit 
70b277 
Pops two values,


Packit 
70b277 
divides the second one popped from the first one popped.


Packit 
70b277 
The quotient is pushed first, and the remainder is pushed next.


Packit 
70b277 
The number of fraction digits used in the division


Packit 
70b277 
is specified by the precision value.


Packit 
70b277 
(The sequence @code{SdSn lnld/ LnLd%} could also accomplish


Packit 
70b277 
this function, with slightly different error checking.)


Packit 
70b277 
(This command is a @sc{gnu} extension.)


Packit 
70b277 


Packit 
70b277 
@item ^


Packit 
70b277 
Pops two values and exponentiates,


Packit 
70b277 
using the first value popped as the exponent


Packit 
70b277 
and the second popped as the base.


Packit 
70b277 
The fraction part of the exponent is ignored.


Packit 
70b277 
The precision value specifies the number of fraction


Packit 
70b277 
digits in the result.


Packit 
70b277 


Packit 
70b277 
@item 


Packit 
70b277 
Pops three values and computes a modular exponentiation.


Packit 
70b277 
The first value popped is used as the reduction modulus;


Packit 
70b277 
this value must be a nonzero number,


Packit 
70b277 
and the result may not be accurate if the modulus


Packit 
70b277 
is not an integer.


Packit 
70b277 
The second popped is used as the exponent;


Packit 
70b277 
this value must be a nonnegative number,


Packit 
70b277 
and any fractional part of this exponent will be ignored.


Packit 
70b277 
The third value popped is the base which gets exponentiated,


Packit 
70b277 
which should be an integer.


Packit 
70b277 
For small integers this is like the sequence @code{Sm^Lm%},


Packit 
70b277 
but, unlike @code{^},


Packit 
70b277 
this command will work with arbitrarily large exponents.


Packit 
70b277 
(This command is a @sc{gnu} extension.)


Packit 
70b277 


Packit 
70b277 
@item v


Packit 
70b277 
Pops one value, computes its square root, and pushes that.


Packit 
70b277 
The maximum of the precision value and the precision of the argument


Packit 
70b277 
is used to determine the number of fraction digits in the result.


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
Most arithmetic operations are affected by the @emph{precision value},


Packit 
70b277 
which you can set with the @samp{k} command.


Packit 
70b277 
The default precision value is zero,


Packit 
70b277 
which means that all arithmetic except for


Packit 
70b277 
addition and subtraction produces integer results.


Packit 
70b277 


Packit 
70b277 
@node Stack Control, Registers, Arithmetic, Top


Packit 
70b277 
@chapter Stack Control


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item c


Packit 
70b277 
Clears the stack, rendering it empty.


Packit 
70b277 


Packit 
70b277 
@item d


Packit 
70b277 
Duplicates the value on the top of the stack,


Packit 
70b277 
pushing another copy of it.


Packit 
70b277 
Thus, @samp{4d*p} computes 4 squared and prints it.


Packit 
70b277 


Packit 
70b277 
@item r


Packit 
70b277 
Reverses the order of (swaps) the top two values on the stack.


Packit 
70b277 
(This can also be accomplished with the sequence @code{SaSbLaLb}.)


Packit 
70b277 
(This command is a @sc{gnu} extension.)


Packit 
70b277 


Packit 
70b277 
@item R


Packit 
70b277 
Pops the topofstack as an integer @var{n}.


Packit 
70b277 
Cyclically rotates the top @var{n} items on the updated stack.


Packit 
70b277 
If @var{n} is positive,


Packit 
70b277 
then the rotation direction will make the topmost


Packit 
70b277 
element the secondfrom top;


Packit 
70b277 
if @var{n} is negative,


Packit 
70b277 
then the rotation will make the topmost element the


Packit 
70b277 
@var{n}th element from the top.


Packit 
70b277 
If the stack depth is less than @var{n}


Packit 
70b277 
then the entire stack is rotated (in the appropriate direction),


Packit 
70b277 
without any error being reported.


Packit 
70b277 
(This command is a @sc{gnu} extension.)


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
@node Registers, Parameters, Stack Control, Top


Packit 
70b277 
@chapter Registers


Packit 
70b277 


Packit 
70b277 
@command{dc} provides at least 256 memory registers@footnote{The


Packit 
70b277 
exact number of registers provided by @command{dc} depends


Packit 
70b277 
on the range of an @code{unsigned char} in the C compiler


Packit 
70b277 
used to create the @command{dc} executable.},


Packit 
70b277 
each named by a single character.


Packit 
70b277 
You can store a number in a register and retrieve it later.


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item s@var{r}


Packit 
70b277 
Pop the value off the top of the stack and


Packit 
70b277 
store it into register @var{r}.


Packit 
70b277 


Packit 
70b277 
@item l@var{r}


Packit 
70b277 
Copy the value in register @var{r},


Packit 
70b277 
and push it onto the stack.


Packit 
70b277 
The value @code{0} is retrieved if the


Packit 
70b277 
register is uninitialized or its stack has become empty.


Packit 
70b277 
This does not alter the contents of @var{r}.


Packit 
70b277 


Packit 
70b277 
Each register also contains its own stack.


Packit 
70b277 
The current register value is the top of the register's stack.


Packit 
70b277 


Packit 
70b277 
@item S@var{r}


Packit 
70b277 
Pop the value off the top of the (main) stack and


Packit 
70b277 
push it onto the stack of register @var{r}.


Packit 
70b277 
The previous value of the register becomes inaccessible.


Packit 
70b277 


Packit 
70b277 
@item L@var{r}


Packit 
70b277 
Pop the value off the top of register @var{r}'s stack


Packit 
70b277 
and push it onto the main stack.


Packit 
70b277 
The previous value in register @var{r}'s stack, if any,


Packit 
70b277 
is now accessible via the @samp{l@var{r}} command.


Packit 
70b277 
@end table


Packit 
70b277 
@c


Packit 
70b277 
@c The @samp{f} command prints a list of all registers that have contents


Packit 
70b277 
@c stored in them, together with their contents.


Packit 
70b277 
@c Only the current contents of each register (the top of its stack)


Packit 
70b277 
@c is printed.


Packit 
70b277 


Packit 
70b277 
@node Parameters, Strings, Registers, Top


Packit 
70b277 
@chapter Parameters


Packit 
70b277 


Packit 
70b277 
@command{dc} has three parameters that control its operation:


Packit 
70b277 
the precision, the input radix, and the output radix.


Packit 
70b277 
The precision specifies the number of fraction digits


Packit 
70b277 
to keep in the result of most arithmetic operations.


Packit 
70b277 
The input radix controls the interpretation of numbers typed in;


Packit 
70b277 
@emph{all} numbers typed in use this radix.


Packit 
70b277 
The output radix is used for printing numbers.


Packit 
70b277 


Packit 
70b277 
The input and output radices are separate parameters;


Packit 
70b277 
you can make them unequal, which can be useful or confusing.


Packit 
70b277 
The input radix must be between 2 and 16 inclusive.


Packit 
70b277 
The output radix must be at least 2.


Packit 
70b277 
The precision must be zero or greater.


Packit 
70b277 
The precision is always measured in decimal digits,


Packit 
70b277 
regardless of the current input or output radix.


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item i


Packit 
70b277 
Pops the value off the top of the stack


Packit 
70b277 
and uses it to set the input radix.


Packit 
70b277 


Packit 
70b277 
@item o


Packit 
70b277 
Pops the value off the top of the stack


Packit 
70b277 
and uses it to set the output radix.


Packit 
70b277 


Packit 
70b277 
@item k


Packit 
70b277 
Pops the value off the top of the stack


Packit 
70b277 
and uses it to set the precision.


Packit 
70b277 


Packit 
70b277 
@item I


Packit 
70b277 
Pushes the current input radix on the stack.


Packit 
70b277 


Packit 
70b277 
@item O


Packit 
70b277 
Pushes the current output radix on the stack.


Packit 
70b277 


Packit 
70b277 
@item K


Packit 
70b277 
Pushes the current precision on the stack.


Packit 
70b277 


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
@node Strings, Status Inquiry, Parameters, Top


Packit 
70b277 
@chapter Strings


Packit 
70b277 


Packit 
70b277 
@command{dc} has a limited ability


Packit 
70b277 
to operate on strings as well as on numbers;


Packit 
70b277 
the only things you can do with strings are print them


Packit 
70b277 
and execute them as macros


Packit 
70b277 
(which means that the contents of the string are processed


Packit 
70b277 
as @command{dc} commands).


Packit 
70b277 
Both registers and the stack can hold strings,


Packit 
70b277 
and @command{dc} always knows whether any given object is


Packit 
70b277 
a string or a number.


Packit 
70b277 
Some commands such as arithmetic operations demand numbers


Packit 
70b277 
as arguments and print errors if given strings.


Packit 
70b277 
Other commands can accept either a number or a string;


Packit 
70b277 
for example, the @samp{p} command can accept either and prints the object


Packit 
70b277 
according to its type.


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item [@var{characters}]


Packit 
70b277 
Makes a string containing @var{characters} and pushes it on the stack.


Packit 
70b277 
For example, @samp{[foo]P} prints the characters @samp{foo}


Packit 
70b277 
(with no newline).


Packit 
70b277 
Note that all square brackets (@samp{[}s and @samp{]}s) must be balanced;


Packit 
70b277 
there is no mechanism provided for handling unbalanced square brackets.


Packit 
70b277 


Packit 
70b277 
@item a


Packit 
70b277 
The mnemonic for this is somewhat erroneous: asciify.


Packit 
70b277 
The topofstack is popped.


Packit 
70b277 
If it was a number, then the loworder byte of this number


Packit 
70b277 
is converted into a 1character string


Packit 
70b277 
and pushed onto the stack.


Packit 
70b277 
Otherwise the topofstack was a string,


Packit 
70b277 
and the first character of that string is pushed back.


Packit 
70b277 
(This command is a @sc{gnu} extension.)


Packit 
70b277 


Packit 
70b277 
@item x


Packit 
70b277 
Pops a value off the stack and executes it as a macro.


Packit 
70b277 
Normally it should be a string;


Packit 
70b277 
if it is a number, it is simply pushed back onto the stack.


Packit 
70b277 
For example, @samp{[1p]x} executes the macro @samp{1p},


Packit 
70b277 
which pushes 1 on the stack and prints @samp{1} on a separate line.


Packit 
70b277 


Packit 
70b277 
Macros are most often stored in registers;


Packit 
70b277 
@samp{[1p]sa} stores a macro to print @samp{1} into register @samp{a},


Packit 
70b277 
and @samp{lax} invokes the macro.


Packit 
70b277 


Packit 
70b277 
@item >@var{r}


Packit 
70b277 
Pops two values off the stack and compares them


Packit 
70b277 
assuming they are numbers,


Packit 
70b277 
executing the contents of register @var{r} as a macro


Packit 
70b277 
if the original topofstack is greater.


Packit 
70b277 
Thus, @samp{1 2>a} will invoke register @samp{a}'s contents


Packit 
70b277 
and @samp{2 1>a} will not.


Packit 
70b277 


Packit 
70b277 
@item !>@var{r}


Packit 
70b277 
Similar but invokes the macro if the original topofstack is not greater


Packit 
70b277 
(is less than or equal to) what was the secondtotop.


Packit 
70b277 


Packit 
70b277 
@item <@var{r}


Packit 
70b277 
Similar but invokes the macro if the original topofstack is less.


Packit 
70b277 


Packit 
70b277 
@item !<@var{r}


Packit 
70b277 
Similar but invokes the macro if the original topofstack is not less


Packit 
70b277 
(is greater than or equal to) what was the secondtotop.


Packit 
70b277 


Packit 
70b277 
@item =@var{r}


Packit 
70b277 
Similar but invokes the macro if the two numbers popped are equal.


Packit 
70b277 
@c This can also be validly used to compare two strings for equality.


Packit 
70b277 


Packit 
70b277 
@item !=@var{r}


Packit 
70b277 
Similar but invokes the macro if the two numbers popped are not equal.


Packit 
70b277 
@c This can also be validly used to compare two strings for equality.


Packit 
70b277 


Packit 
70b277 
@item ?


Packit 
70b277 
Reads a line from the terminal and executes it.


Packit 
70b277 
This command allows a macro to request input from the user.


Packit 
70b277 


Packit 
70b277 
@item q


Packit 
70b277 
During the execution of a macro,


Packit 
70b277 
this command exits from the macro and also from the macro which invoked it.


Packit 
70b277 
If called from the top level,


Packit 
70b277 
or from a macro which was called directly from the top level,


Packit 
70b277 
the @samp{q} command will cause @command{dc} to exit.


Packit 
70b277 


Packit 
70b277 
@item Q


Packit 
70b277 
Pops a value off the stack and uses it as a count


Packit 
70b277 
of levels of macro execution to be exited.


Packit 
70b277 
Thus, @samp{3Q} exits three levels.


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
@node Status Inquiry, Miscellaneous, Strings, Top


Packit 
70b277 
@chapter Status Inquiry


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item Z


Packit 
70b277 
Pops a value off the stack,


Packit 
70b277 
calculates the number of decimal digits it has


Packit 
70b277 
(or number of characters, if it is a string)


Packit 
70b277 
and pushes that number.


Packit 
70b277 


Packit 
70b277 
Note that the digit count for a number does


Packit 
70b277 
@emph{not} include any leading zeros,


Packit 
70b277 
even if those appear to the right of the radix point.


Packit 
70b277 
This may seem a bit strange at first,


Packit 
70b277 
but it is compatible with historical implementations of @command{dc},


Packit 
70b277 
and can be argued to be useful for computing the magnitude of a value:


Packit 
70b277 
@code{dSaXLaZ} will compute the poweroften multiplier


Packit 
70b277 
which would be needed to shift the decimal point


Packit 
70b277 
to be immediately before the leftmost nonzero digit.


Packit 
70b277 


Packit 
70b277 
@item X


Packit 
70b277 
Pops a value off the stack,


Packit 
70b277 
calculates the number of fraction digits it has,


Packit 
70b277 
and pushes that number.


Packit 
70b277 
For a string, the value pushed is


Packit 
70b277 
@c 1.


Packit 
70b277 
0.


Packit 
70b277 


Packit 
70b277 
@item z


Packit 
70b277 
Pushes the current stack depth:


Packit 
70b277 
the number of objects on the stack


Packit 
70b277 
before the execution of the @samp{z} command.


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
@node Miscellaneous, Reporting bugs, Status Inquiry, Top


Packit 
70b277 
@chapter Miscellaneous


Packit 
70b277 


Packit 
70b277 
@table @samp


Packit 
70b277 
@item !


Packit 
70b277 
Will run the rest of the line as a system command.


Packit 
70b277 
Note that parsing of the !<, !=, and !> commands take precedence,


Packit 
70b277 
so if you want to run a command starting with <, =, or > you will


Packit 
70b277 
need to add a space after the !.


Packit 
70b277 


Packit 
70b277 
@item #


Packit 
70b277 
Will interpret the rest of the line as a comment.


Packit 
70b277 
(This command is a @sc{gnu} extension.)


Packit 
70b277 


Packit 
70b277 
@item :@var{r}


Packit 
70b277 
Will pop the top two values off of the stack.


Packit 
70b277 
The old secondtotop value will be stored in the array @var{r},


Packit 
70b277 
indexed by the old topofstack value.


Packit 
70b277 


Packit 
70b277 
@item ;@var{r}


Packit 
70b277 
Pops the topofstack and uses it as an index into


Packit 
70b277 
the array @var{r}.


Packit 
70b277 
The selected value is then pushed onto the stack.


Packit 
70b277 
@end table


Packit 
70b277 


Packit 
70b277 
Note that each stacked instance of a register has its own


Packit 
70b277 
array associated with it.


Packit 
70b277 
Thus @samp{1 @var{0:a} 0S@var{a} 2 @var{0:a} L@var{a} @var{0;a}p}


Packit 
70b277 
will print 1, because the 2 was stored in an instance of @var{0:a}


Packit 
70b277 
that was later popped.


Packit 
70b277 


Packit 
70b277 
@node Reporting bugs, , Miscellaneous, Top


Packit 
70b277 
@chapter Reporting bugs


Packit 
70b277 


Packit 
70b277 
Email bug reports to @email{bugdc@@gnu.org}.


Packit 
70b277 
@contents


Packit 
70b277 
@bye
