This is mpc.info, produced by makeinfo version 5.1 from mpc.texi.

This manual is for GNU MPC, a library for multiple precision complex
arithmetic, version 1.0.2 of January 2014.

   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012 INRIA

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU Free Documentation License,
     Version 1.3 or any later version published by the Free Software
     Foundation; with no Invariant Sections.  A copy of the license is
     included in the section entitled "GNU Free Documentation License."
INFO-DIR-SECTION GNU Packages
START-INFO-DIR-ENTRY
* mpc: (mpc)Multiple Precision Complex Library.
END-INFO-DIR-ENTRY


File: mpc.info,  Node: Top,  Next: Copying,  Up: (dir)

GNU MPC
*******

This manual documents how to install and use the GNU Multiple Precision
Complex Library, version 1.0.2

* Menu:

* Copying::                     GNU MPC Copying Conditions (LGPL).
* Introduction to GNU MPC::         Brief introduction to GNU MPC.
* Installing GNU MPC::              How to configure and compile the GNU MPC library.
* Reporting Bugs::              How to usefully report bugs.
* GNU MPC Basics::                  What every GNU MPC user should know.
* Complex Functions::           Functions for arithmetic on complex numbers.
* References::
* Concept Index::
* Function Index::
* GNU Free Documentation License::


File: mpc.info,  Node: Copying,  Next: Introduction to GNU MPC,  Prev: Top,  Up: Top

GNU MPC Copying Conditions
**************************

GNU MPC is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

   GNU MPC is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
License along with this program.  If not, see
<http://www.gnu.org/licenses/>.


File: mpc.info,  Node: Introduction to GNU MPC,  Next: Installing GNU MPC,  Prev: Copying,  Up: Top

1 Introduction to GNU MPC
*************************

GNU MPC is a portable library written in C for arbitrary precision
arithmetic on complex numbers providing correct rounding.  It implements
a multiprecision equivalent of the C99 standard.  It builds upon the GNU
MP and the GNU MPFR libraries.

1.1 How to use this Manual
==========================

Everyone should read *note GNU MPC Basics::.  If you need to install the
library yourself, you need to read *note Installing GNU MPC::, too.

   The remainder of the manual can be used for later reference, although
it is probably a good idea to skim through it.


File: mpc.info,  Node: Installing GNU MPC,  Next: Reporting Bugs,  Prev: Introduction to GNU MPC,  Up: Top

2 Installing GNU MPC
********************

To build GNU MPC, you first have to install GNU MP (version 4.3.2 or
higher) and GNU MPFR (version 2.4.2 or higher) on your computer.  You
need a C compiler; GCC version 4.4 or higher is recommended, since GNU
MPC may trigger a bug in previous versions, see the thread at
<http://lists.gforge.inria.fr/pipermail/mpc-discuss/2011-February/000823.html>.
And you need a standard Unix 'make' program, plus some other standard
Unix utility programs.

   Here are the steps needed to install the library on Unix systems:

  1. 'tar xzf mpc-1.0.2.tar.gz'

  2. 'cd mpc-1.0.2'

  3. './configure'

     if GMP and GNU MPFR are installed into standard directories, that
     is, directories that are searched by default by the compiler and
     the linking tools.

     './configure --with-gmp=<gmp_install_dir>'

     is used to indicate a different location where GMP is installed.
     Alternatively, you can specify directly GMP include and GMP lib
     directories with './configure --with-gmp-lib=<gmp_lib_dir>
     --with-gmp-include=<gmp_include_dir>'.

     './configure --with-mpfr=<mpfr_install_dir>'

     is used to indicate a different location where GNU MPFR is
     installed.  Alternatively, you can specify directly GNU MPFR
     include and GNU MPFR lib directories with './configure
     --with-mpf-lib=<mpfr_lib_dir>
     --with-mpfr-include=<mpfr_include_dir>'.

     Another useful parameter is '--prefix', which can be used to
     specify an alternative installation location instead of
     '/usr/local'; see 'make install' below.

     To enable checking for memory leaks using 'valgrind' during 'make
     check', add the parameter '--enable-valgrind-tests'.

     If for debugging purposes you wish to log calls to GNU MPC
     functions from within your code, add the parameter
     '--enable-logging'.  In your code, replace the inclusion of 'mpc.h'
     by 'mpc-log.h' and link the executable dynamically.  Then all calls
     to functions with only complex arguments are printed to 'stderr' in
     the following form: First, the function name is given, followed by
     its type such as 'c_cc', meaning that the function has one complex
     result (one 'c' in front of the '_'), computed from two complex
     arguments (two 'c' after the '_').  Then, the precisions of the
     real and the imaginary part of the first result is given, followed
     by the second one and so on.  Finally, for each argument, the
     precisions of its real and imaginary part are specified and the
     argument itself is printed in hexadecimal via the function
     'mpc_out_str' (*note String and Stream Input and Output::).  The
     option requires a dynamic library, so it may not be combined with
     '--disable-shared'.

     Use './configure --help' for an exhaustive list of parameters.

  4. 'make'

     This compiles GNU MPC in the working directory.

  5. 'make check'

     This will make sure GNU MPC was built correctly.

     If you get error messages, please report them to
     'mpc-discuss@lists.gforge.inria.fr' (*Note Reporting Bugs::, for
     information on what to include in useful bug reports).

  6. 'make install'

     This will copy the file 'mpc.h' to the directory
     '/usr/local/include', the file 'libmpc.a' to the directory
     '/usr/local/lib', and the file 'mpc.info' to the directory
     '/usr/local/share/info' (or if you passed the '--prefix' option to
     'configure', using the prefix directory given as argument to
     '--prefix' instead of '/usr/local').  Note: you need write
     permissions on these directories.

2.1 Other 'make' Targets
========================

There are some other useful make targets:

   * 'info'

     Create an info version of the manual, in 'mpc.info'.

   * 'pdf'

     Create a PDF version of the manual, in 'doc/mpc.pdf'.

   * 'dvi'

     Create a DVI version of the manual, in 'doc/mpc.dvi'.

   * 'ps'

     Create a Postscript version of the manual, in 'doc/mpc.ps'.

   * 'html'

     Create an HTML version of the manual, in several pages in the
     directory 'doc/mpc.html'; if you want only one output HTML file,
     then type 'makeinfo --html --no-split mpc.texi' instead.

   * 'clean'

     Delete all object files and archive files, but not the
     configuration files.

   * 'distclean'

     Delete all files not included in the distribution.

   * 'uninstall'

     Delete all files copied by 'make install'.

2.2 Known Build Problems
========================

On AIX, if GMP was built with the 64-bit ABI, before building and
testing GNU MPC, it might be necessary to set the 'OBJECT_MODE'
environment variable to 64 by, e.g.,

   'export OBJECT_MODE=64'

   This has been tested with the C compiler IBM XL C/C++ Enterprise
Edition V8.0 for AIX, version: 08.00.0000.0021, GMP 4.2.4 and GNU MPFR
2.4.1.

   Please report any other problems you encounter to
'mpc-discuss@lists.gforge.inria.fr'.  *Note Reporting Bugs::.


File: mpc.info,  Node: Reporting Bugs,  Next: GNU MPC Basics,  Prev: Installing GNU MPC,  Up: Top

3 Reporting Bugs
****************

If you think you have found a bug in the GNU MPC library, please
investigate and report it.  We have made this library available to you,
and it is not to ask too much from you, to ask you to report the bugs
that you find.

   There are a few things you should think about when you put your bug
report together.

   You have to send us a test case that makes it possible for us to
reproduce the bug.  Include instructions on how to run the test case.

   You also have to explain what is wrong; if you get a crash, or if the
results printed are incorrect and in that case, in what way.

   Please include compiler version information in your bug report.  This
can be extracted using 'gcc -v', or 'cc -V' on some machines.  Also,
include the output from 'uname -a'.

   If your bug report is good, we will do our best to help you to get a
corrected version of the library; if the bug report is poor, we will not
do anything about it (aside of chiding you to send better bug reports).

   Send your bug report to: 'mpc-discuss@lists.gforge.inria.fr'.

   If you think something in this manual is unclear, or downright
incorrect, or if the language needs to be improved, please send a note
to the same address.


File: mpc.info,  Node: GNU MPC Basics,  Next: Complex Functions,  Prev: Reporting Bugs,  Up: Top

4 GNU MPC Basics
****************

All declarations needed to use GNU MPC are collected in the include file
'mpc.h'.  It is designed to work with both C and C++ compilers.  You
should include that file in any program using the GNU MPC library by
adding the line
        #include "mpc.h"

4.1 Nomenclature and Types
==========================

"Complex number" or "Complex" for short, is a pair of two arbitrary
precision floating-point numbers (for the real and imaginary parts).
The C data type for such objects is 'mpc_t'.

The "Precision" is the number of bits used to represent the mantissa of
the real and imaginary parts; the corresponding C data type is
'mpfr_prec_t'.  For more details on the allowed precision range, *note
(mpfr.info)Nomenclature and Types::.

The "rounding mode" specifies the way to round the result of a complex
operation, in case the exact result can not be represented exactly in
the destination mantissa; the corresponding C data type is 'mpc_rnd_t'.
A complex rounding mode is a pair of two rounding modes: one for the
real part, one for the imaginary part.

4.2 Function Classes
====================

There is only one class of functions in the GNU MPC library, namely
functions for complex arithmetic.  The function names begin with 'mpc_'.
The associated type is 'mpc_t'.

4.3 GNU MPC Variable Conventions
================================

As a general rule, all GNU MPC functions expect output arguments before
input arguments.  This notation is based on an analogy with the
assignment operator.

   GNU MPC allows you to use the same variable for both input and output
in the same expression.  For example, the main function for
floating-point multiplication, 'mpc_mul', can be used like this:
'mpc_mul (x, x, x, rnd_mode)'.  This computes the square of X with
rounding mode 'rnd_mode' and puts the result back in X.

   Before you can assign to an GNU MPC variable, you need to initialize
it by calling one of the special initialization functions.  When you are
done with a variable, you need to clear it out, using one of the
functions for that purpose.

   A variable should only be initialized once, or at least cleared out
between each initialization.  After a variable has been initialized, it
may be assigned to any number of times.

   For efficiency reasons, avoid to initialize and clear out a variable
in loops.  Instead, initialize it before entering the loop, and clear it
out after the loop has exited.

   You do not need to be concerned about allocating additional space for
GNU MPC variables, since each of its real and imaginary part has a
mantissa of fixed size.  Hence unless you change its precision, or clear
and reinitialize it, a complex variable will have the same allocated
space during all its life.

4.4 Rounding Modes
==================

A complex rounding mode is of the form 'MPC_RNDxy' where 'x' and 'y' are
one of 'N' (to nearest), 'Z' (towards zero), 'U' (towards plus
infinity), 'D' (towards minus infinity).  The first letter refers to the
rounding mode for the real part, and the second one for the imaginary
part.  For example 'MPC_RNDZU' indicates to round the real part towards
zero, and the imaginary part towards plus infinity.

   The 'round to nearest' mode works as in the IEEE P754 standard: in
case the number to be rounded lies exactly in the middle of two
representable numbers, it is rounded to the one with the least
significant bit set to zero.  For example, the number 5, which is
represented by (101) in binary, is rounded to (100)=4 with a precision
of two bits, and not to (110)=6.

4.5 Return Value
================

Most GNU MPC functions have a return value of type 'int', which is used
to indicate the position of the rounded real and imaginary parts with
respect to the exact (infinite precision) values.  If this integer is
'i', the macros 'MPC_INEX_RE(i)' and 'MPC_INEX_IM(i)' give 0 if the
corresponding rounded value is exact, a negative value if the rounded
value is less than the exact one, and a positive value if it is greater
than the exact one.  Similarly, functions computing a result of type
'mpfr_t' return an integer that is 0, positive or negative depending on
whether the rounded value is the same, larger or smaller then the exact
result.

   Some functions, such as 'mpc_sin_cos', compute two complex results;
the macros 'MPC_INEX1(i)' and 'MPC_INEX2(i)', applied to the return
value 'i' of such a function, yield the exactness value corresponding to
the first or the second computed value, respectively.

4.6 Branch Cuts And Special Values
==================================

Some complex functions have branch cuts, across which the function is
discontinous.  In GNU MPC, the branch cuts chosen are the same as those
specified for the corresponding functions in the ISO C99 standard.

   Likewise, when evaluated at a point whose real or imaginary part is
either infinite or a NaN or a signed zero, a function returns the same
value as those specified for the corresponding function in the ISO C99
standard.


File: mpc.info,  Node: Complex Functions,  Next: References,  Prev: GNU MPC Basics,  Up: Top

5 Complex Functions
*******************

The complex functions expect arguments of type 'mpc_t'.

   The GNU MPC floating-point functions have an interface that is
similar to the GNU MP integer functions.  The function prefix for
operations on complex numbers is 'mpc_'.

   The precision of a computation is defined as follows: Compute the
requested operation exactly (with "infinite precision"), and round the
result to the destination variable precision with the given rounding
mode.

   The GNU MPC complex functions are intended to be a smooth extension
of the IEEE P754 arithmetic.  The results obtained on one computer
should not differ from the results obtained on a computer with a
different word size.

* Menu:

* Initializing Complex Numbers::
* Assigning Complex Numbers::
* Converting Complex Numbers::
* String and Stream Input and Output::
* Complex Comparison::
* Projection & Decomposing::
* Basic Arithmetic::
* Power Functions and Logarithm::
* Trigonometric Functions::
* Miscellaneous Complex Functions::
* Advanced Functions::
* Internals::


File: mpc.info,  Node: Initializing Complex Numbers,  Next: Assigning Complex Numbers,  Up: Complex Functions

5.1 Initialization Functions
============================

An 'mpc_t' object must be initialized before storing the first value in
it.  The functions 'mpc_init2' and 'mpc_init3' are used for that
purpose.

 -- Function: void mpc_init2 (mpc_t Z, mpfr_prec_t PREC)
     Initialize Z to precision PREC bits and set its real and imaginary
     parts to NaN. Normally, a variable should be initialized once only
     or at least be cleared, using 'mpc_clear', between initializations.

 -- Function: void mpc_init3 (mpc_t Z, mpfr_prec_t PREC_R, mpfr_prec_t
          PREC_I)
     Initialize Z with the precision of its real part being PREC_R bits
     and the precision of its imaginary part being PREC_I bits, and set
     the real and imaginary parts to NaN.

 -- Function: void mpc_clear (mpc_t Z)
     Free the space occupied by Z.  Make sure to call this function for
     all 'mpc_t' variables when you are done with them.

   Here is an example on how to initialize complex variables:
     {
       mpc_t x, y;
       mpc_init2 (x, 256);		/* precision _exactly_ 256 bits */
       mpc_init3 (y, 100, 50);	/* 100/50 bits for the real/imaginary part */
       ...
       mpc_clear (x);
       mpc_clear (y);
     }

   The following function is useful for changing the precision during a
calculation.  A typical use would be for adjusting the precision
gradually in iterative algorithms like Newton-Raphson, making the
computation precision closely match the actual accurate part of the
numbers.

 -- Function: void mpc_set_prec (mpc_t X, mpfr_prec_t PREC)
     Reset the precision of X to be *exactly* PREC bits, and set its
     real/imaginary parts to NaN. The previous value stored in X is
     lost.  It is equivalent to a call to 'mpc_clear(x)' followed by a
     call to 'mpc_init2(x, prec)', but more efficient as no allocation
     is done in case the current allocated space for the mantissa of X
     is sufficient.

 -- Function: mpfr_prec_t mpc_get_prec (mpc_t X)
     If the real and imaginary part of X have the same precision, it is
     returned, otherwise, 0 is returned.

 -- Function: void mpc_get_prec2 (mpfr_prec_t* PR, mpfr_prec_t* PI,
          mpc_t X)
     Returns the precision of the real part of X via PR and of its
     imaginary part via PI.


File: mpc.info,  Node: Assigning Complex Numbers,  Next: Converting Complex Numbers,  Prev: Initializing Complex Numbers,  Up: Complex Functions

5.2 Assignment Functions
========================

These functions assign new values to already initialized complex numbers
(*note Initializing Complex Numbers::).  When using any functions with
'intmax_t' or 'uintmax_t' parameters, you must include '<stdint.h>' or
'<inttypes.h>' _before_ 'mpc.h', to allow 'mpc.h' to define prototypes
for these functions.  Similarly, functions with parameters of type
'complex' or 'long complex' are defined only if '<complex.h>' is
included _before_ 'mpc.h'.  If you need assignment functions that are
not in the current API, you can define them using the 'MPC_SET_X_Y'
macro (*note Advanced Functions::).

 -- Function: int mpc_set (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set the value of ROP from OP, rounded to the precision of ROP with
     the given rounding mode RND.

 -- Function: int mpc_set_ui (mpc_t ROP, unsigned long int OP, mpc_rnd_t
          RND)
 -- Function: int mpc_set_si (mpc_t ROP, long int OP, mpc_rnd_t RND)
 -- Function: int mpc_set_uj (mpc_t ROP, uintmax_t OP, mpc_rnd_t RND)
 -- Function: int mpc_set_sj (mpc_t ROP, intmax_t OP, mpc_rnd_t RND)
 -- Function: int mpc_set_d (mpc_t ROP, double OP, mpc_rnd_t RND)
 -- Function: int mpc_set_ld (mpc_t ROP, long double OP, mpc_rnd_t RND)
 -- Function: int mpc_set_dc (mpc_t ROP, double _Complex OP, mpc_rnd_t
          RND)
 -- Function: int mpc_set_ldc (mpc_t ROP, long double _Complex OP,
          mpc_rnd_t RND)
 -- Function: int mpc_set_z (mpc_t ROP, mpz_t OP mpc_rnd_t RND)
 -- Function: int mpc_set_q (mpc_t ROP, mpq_t OP mpc_rnd_t RND)
 -- Function: int mpc_set_f (mpc_t ROP, mpf_t OP mpc_rnd_t RND)
 -- Function: int mpc_set_fr (mpc_t ROP, mpfr_t OP, mpc_rnd_t RND)
     Set the value of ROP from OP, rounded to the precision of ROP with
     the given rounding mode RND.  The argument OP is interpreted as
     real, so the imaginary part of ROP is set to zero with a positive
     sign.  Please note that even a 'long int' may have to be rounded,
     if the destination precision is less than the machine word width.
     For 'mpc_set_d', be careful that the input number OP may not be
     exactly representable as a double-precision number (this happens
     for 0.1 for instance), in which case it is first rounded by the C
     compiler to a double-precision number, and then only to a complex
     number.

 -- Function: int mpc_set_ui_ui (mpc_t ROP, unsigned long int OP1,
          unsigned long int OP2, mpc_rnd_t RND)
 -- Function: int mpc_set_si_si (mpc_t ROP, long int OP1, long int OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_set_uj_uj (mpc_t ROP, uintmax_t OP1, uintmax_t
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_set_sj_sj (mpc_t ROP, intmax_t OP1, intmax_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_set_d_d (mpc_t ROP, double OP1, double OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_set_ld_ld (mpc_t ROP, long double OP1, long double
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_set_z_z (mpc_t ROP, mpz_t OP1, mpz_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_set_q_q (mpc_t ROP, mpq_t OP1, mpq_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_set_f_f (mpc_t ROP, mpf_t OP1, mpf_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_set_fr_fr (mpc_t ROP, mpfr_t OP1, mpfr_t OP2,
          mpc_rnd_t RND)
     Set the real part of ROP from OP1, and its imaginary part from OP2,
     according to the rounding mode RND.

     Beware that the behaviour of 'mpc_set_fr_fr' is undefined if OP1 or
     OP2 is a pointer to the real or imaginary part of ROP.  To exchange
     the real and the imaginary part of a complex number, either use
     'mpfr_swap (mpc_realref (rop), mpc_imagref (rop))', which also
     exchanges the precisions of the two parts; or use a temporary
     variable.

   For functions assigning complex variables from strings or input
streams, *note String and Stream Input and Output::.

 -- Function: void mpc_set_nan (mpc_t ROP)
     Set ROP to Nan+i*NaN.

 -- Function: void mpc_swap (mpc_t OP1, mpc_t OP2)
     Swap the values of OP1 and OP2 efficiently.  Warning: The
     precisions are exchanged, too; in case these are different,
     'mpc_swap' is thus not equivalent to three 'mpc_set' calls using a
     third auxiliary variable.


File: mpc.info,  Node: Converting Complex Numbers,  Next: String and Stream Input and Output,  Prev: Assigning Complex Numbers,  Up: Complex Functions

5.3 Conversion Functions
========================

The following functions are available only if '<complex.h>' is included
_before_ 'mpc.h'.

 -- Function: double _Complex mpc_get_dc (mpc_t OP, mpc_rnd_t RND)
 -- Function: long double _Complex mpc_get_ldc (mpc_t OP, mpc_rnd_t RND)
     Convert OP to a C complex number, using the rounding mode RND.

   For functions converting complex variables to strings or stream
output, *note String and Stream Input and Output::.


File: mpc.info,  Node: String and Stream Input and Output,  Next: Complex Comparison,  Prev: Converting Complex Numbers,  Up: Complex Functions

5.4 String and Stream Input and Output
======================================

 -- Function: int mpc_strtoc (mpc_t ROP, const char *NPTR, char
          **ENDPTR, int BASE, mpc_rnd_t RND)
     Read a complex number from a string NPTR in base BASE, rounded to
     the precision of ROP with the given rounding mode RND.  The BASE
     must be either 0 or a number from 2 to 36 (otherwise the behaviour
     is undefined).  If NPTR starts with valid data, the result is
     stored in ROP, the usual inexact value is returned (*note Return
     Value: return-value.) and, if ENDPTR is not the null pointer,
     *ENDPTR points to the character just after the valid data.
     Otherwise, ROP is set to 'NaN + i * NaN', -1 is returned and, if
     ENDPTR is not the null pointer, the value of NPTR is stored in the
     location referenced by ENDPTR.

     The expected form of a complex number string is either a real
     number (an optional leading whitespace, an optional sign followed
     by a floating-point number), or a pair of real numbers in
     parentheses separated by whitespace.  If a real number is read, the
     missing imaginary part is set to +0.  The form of a floating-point
     number depends on the base and is described in the documentation of
     'mpfr_strtofr' (*note (mpfr.info)Assignment Functions::).  For
     instance, '"3.1415926"', '"(1.25e+7 +.17)"', '"(@nan@ 2)"' and
     '"(-0 -7)"' are valid strings for BASE = 10.  If BASE = 0, then a
     prefix may be used to indicate the base in which the floating-point
     number is written.  Use prefix '0b' for binary numbers, prefix '0x'
     for hexadecimal numbers, and no prefix for decimal numbers.  The
     real and imaginary part may then be written in different bases.
     For instance, '"(1.024e+3 +2.05e+3)"' and '"(0b1p+10 +0x802)"' are
     valid strings for 'base'=0 and represent the same value.

 -- Function: int mpc_set_str (mpc_t ROP, const char *S, int BASE,
          mpc_rnd_t rnd)
     Set ROP to the value of the string S in base BASE, rounded to the
     precision of ROP with the given rounding mode RND.  See the
     documentation of 'mpc_strtoc' for a detailed description of the
     valid string formats.  Contrarily to 'mpc_strtoc', 'mpc_set_str'
     requires the _whole_ string to represent a valid complex number
     (potentially followed by additional white space).  This function
     returns the usual inexact value (*note Return Value: return-value.)
     if the entire string up to the final null character is a valid
     number in base BASE; otherwise it returns -1, and ROP is set to
     NaN+i*NaN.

 -- Function: char * mpc_get_str (int B, size_t N, mpc_t OP, mpc_rnd_t
          RND)
     Convert OP to a string containing its real and imaginary parts,
     separated by a space and enclosed in a pair of parentheses.  The
     numbers are written in base B (which may vary from 2 to 36) and
     rounded according to RND.  The number of significant digits, at
     least 2, is given by N.  It is also possible to let N be zero, in
     which case the number of digits is chosen large enough so that
     re-reading the printed value with the same precision, assuming both
     output and input use rounding to nearest, will recover the original
     value of OP.  Note that 'mpc_get_str' uses the decimal point of the
     current locale if available, and '.' otherwise.

     The string is generated using the current memory allocation
     function ('malloc' by default, unless it has been modified using
     the custom memory allocation interface of 'gmp'); once it is not
     needed any more, it should be freed by calling 'mpc_free_str'.

 -- Function: void mpc_free_str (char *STR)
     Free the string STR, which needs to have been allocated by a call
     to 'mpc_get_str'.

   The following two functions read numbers from input streams and write
them to output streams.  When using any of these functions, you need to
include 'stdio.h' _before_ 'mpc.h'.

 -- Function: int mpc_inp_str (mpc_t ROP, FILE *STREAM, size_t *READ,
          int BASE, mpc_rnd_t RND)
     Input a string in base BASE in the same format as for 'mpc_strtoc'
     from stdio stream STREAM, rounded according to RND, and put the
     read complex number into ROP.  If STREAM is the null pointer, ROP
     is read from 'stdin'.  Return the usual inexact value; if an error
     occurs, set ROP to 'NaN + i * NaN' and return -1.  If READ is not
     the null pointer, it is set to the number of read characters.

     Unlike 'mpc_strtoc', the function 'mpc_inp_str' does not possess
     perfect knowledge of the string to transform and has to read it
     character by character, so it behaves slightly differently: It
     tries to read a string describing a complex number and processes
     this string through a call to 'mpc_set_str'.  Precisely, after
     skipping optional whitespace, a minimal string is read according to
     the regular expression 'mpfr | '(' \s* mpfr \s+ mpfr \s* ')'',
     where '\s' denotes a whitespace, and 'mpfr' is either a string
     containing neither whitespaces nor parentheses, or
     'nan(n-char-sequence)' or '@nan@(n-char-sequence)' (regardless of
     capitalisation) with 'n-char-sequence' a string of ascii letters,
     digits or ''_''.

     For instance, upon input of '"nan(13 1)"', the function
     'mpc_inp_str' starts to recognise a value of NaN followed by an
     n-char-sequence indicated by the opening parenthesis; as soon as
     the space is reached, it becocmes clear that the expression in
     parentheses is not an n-char-sequence, and the error flag -1 is
     returned after 6 characters have been consumed from the stream (the
     whitespace itself remaining in the stream).  The function
     'mpc_strtoc', on the other hand, may track back when reaching the
     whitespace; it treats the string as the two successive complex
     numbers 'NaN + i * 0' and '13 + i'.  It is thus recommended to have
     a whitespace follow each floating point number to avoid this
     problem.

 -- Function: size_t mpc_out_str (FILE *STREAM, int BASE, size_t
          N_DIGITS, mpc_t OP, mpc_rnd_t RND)
     Output OP on stdio stream STREAM in base BASE, rounded according to
     RND, in the same format as for 'mpc_strtoc' If STREAM is the null
     pointer, ROP is written to 'stdout'.

     Return the number of characters written.


File: mpc.info,  Node: Complex Comparison,  Next: Projection & Decomposing,  Prev: String and Stream Input and Output,  Up: Complex Functions

5.5 Comparison Functions
========================

 -- Function: int mpc_cmp (mpc_t OP1, mpc_t OP2)
 -- Function: int mpc_cmp_si_si (mpc_t OP1, long int OP2R, long int
          OP2I)
 -- Macro: int mpc_cmp_si (mpc_t OP1, long int OP2)

     Compare OP1 and OP2, where in the case of 'mpc_cmp_si_si', OP2 is
     taken to be OP2R + i OP2I.  The return value C can be decomposed
     into 'x = MPC_INEX_RE(c)' and 'y = MPC_INEX_IM(c)', such that X is
     positive if the real part of OP1 is greater than that of OP2, zero
     if both real parts are equal, and negative if the real part of OP1
     is less than that of OP2, and likewise for Y.  Both OP1 and OP2 are
     considered to their full own precision, which may differ.  It is
     not allowed that one of the operands has a NaN (Not-a-Number) part.

     The storage of the return value is such that equality can be simply
     checked with 'mpc_cmp (op1, op2) == 0'.


File: mpc.info,  Node: Projection & Decomposing,  Next: Basic Arithmetic,  Prev: Complex Comparison,  Up: Complex Functions

5.6 Projection and Decomposing Functions
========================================

 -- Function: int mpc_real (mpfr_t ROP, mpc_t OP, mpfr_rnd_t RND)
     Set ROP to the value of the real part of OP rounded in the
     direction RND.

 -- Function: int mpc_imag (mpfr_t ROP, mpc_t OP, mpfr_rnd_t RND)
     Set ROP to the value of the imaginary part of OP rounded in the
     direction RND.

 -- Macro: mpfr_t mpc_realref (mpc_t OP)
 -- Macro: mpfr_t mpc_imagref (mpc_t OP)
     Return a reference to the real part and imaginary part of OP,
     respectively.  The 'mpfr' functions can be used on the result of
     these macros (note that the 'mpfr_t' type is itself a pointer).

 -- Function: int mpc_arg (mpfr_t ROP, mpc_t OP, mpfr_rnd_t RND)
     Set ROP to the argument of OP, with a branch cut along the negative
     real axis.

 -- Function: int mpc_proj (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Compute a projection of OP onto the Riemann sphere.  Set ROP to OP
     rounded in the direction RND, except when at least one part of OP
     is infinite (even if the other part is a NaN) in which case the
     real part of ROP is set to plus infinity and its imaginary part to
     a signed zero with the same sign as the imaginary part of OP.


File: mpc.info,  Node: Basic Arithmetic,  Next: Power Functions and Logarithm,  Prev: Projection & Decomposing,  Up: Complex Functions

5.7 Basic Arithmetic Functions
==============================

All the following functions are designed in such a way that, when
working with real numbers instead of complex numbers, their complexity
should essentially be the same as with the GNU MPFR library, with only a
marginal overhead due to the GNU MPC layer.

 -- Function: int mpc_add (mpc_t ROP, mpc_t OP1, mpc_t OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_add_ui (mpc_t ROP, mpc_t OP1, unsigned long int
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_add_fr (mpc_t ROP, mpc_t OP1, mpfr_t OP2,
          mpc_rnd_t RND)
     Set ROP to OP1 + OP2 rounded according to RND.

 -- Function: int mpc_sub (mpc_t ROP, mpc_t OP1, mpc_t OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_sub_fr (mpc_t ROP, mpc_t OP1, mpfr_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_fr_sub (mpc_t ROP, mpfr_t OP1, mpc_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_sub_ui (mpc_t ROP, mpc_t OP1, unsigned long int
          OP2, mpc_rnd_t RND)
 -- Macro: int mpc_ui_sub (mpc_t ROP, unsigned long int OP1, mpc_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_ui_ui_sub (mpc_t ROP, unsigned long int RE1,
          unsigned long int IM1, mpc_t OP2, mpc_rnd_t RND)
     Set ROP to OP1 - OP2 rounded according to RND.  For
     'mpc_ui_ui_sub', OP1 is RE1 + IM1.

 -- Function: int mpc_neg (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to -OP rounded according to RND.  Just changes the sign if
     ROP and OP are the same variable.

 -- Function: int mpc_mul (mpc_t ROP, mpc_t OP1, mpc_t OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_mul_ui (mpc_t ROP, mpc_t OP1, unsigned long int
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_mul_si (mpc_t ROP, mpc_t OP1, long int OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_mul_fr (mpc_t ROP, mpc_t OP1, mpfr_t OP2,
          mpc_rnd_t RND)
     Set ROP to OP1 times OP2 rounded according to RND.  Note: for
     'mpc_mul', in case OP1 and OP2 have the same value, use 'mpc_sqr'
     for better efficiency.

 -- Function: int mpc_mul_i (mpc_t ROP, mpc_t OP, int SGN, mpc_rnd_t
          RND)
     Set ROP to OP times the imaginary unit i if SGN is non-negative,
     set ROP to OP times -i otherwise, in both cases rounded according
     to RND.

 -- Function: int mpc_sqr (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the square of OP rounded according to RND.

 -- Function: int mpc_fma (mpc_t ROP, mpc_t OP1, mpc_t OP2, mpc_t OP3,
          mpc_rnd_t RND)
     Set ROP to OP1*OP2+OP3, rounded according to RND, with only one
     final rounding.

 -- Function: int mpc_div (mpc_t ROP, mpc_t OP1, mpc_t OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_div_ui (mpc_t ROP, mpc_t OP1, unsigned long int
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_div_fr (mpc_t ROP, mpc_t OP1, mpfr_t OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_ui_div (mpc_t ROP, unsigned long int OP1, mpc_t
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_fr_div (mpc_t ROP, mpfr_t OP1, mpc_t OP2,
          mpc_rnd_t RND)
     Set ROP to OP1/OP2 rounded according to RND.

 -- Function: int mpc_conj (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the conjugate of OP rounded according to RND.  Just
     changes the sign of the imaginary part if ROP and OP are the same
     variable.

 -- Function: int mpc_abs (mpfr_t ROP, mpc_t OP, mpfr_rnd_t RND)
     Set the floating-point number ROP to the absolute value of OP,
     rounded in the direction RND.

 -- Function: int mpc_norm (mpfr_t ROP, mpc_t OP, mpfr_rnd_t RND)
     Set the floating-point number ROP to the norm of OP (i.e., the
     square of its absolute value), rounded in the direction RND.

 -- Function: int mpc_mul_2ui (mpc_t ROP, mpc_t OP1, unsigned long int
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_mul_2si (mpc_t ROP, mpc_t OP1, long int OP2,
          mpc_rnd_t RND)
     Set ROP to OP1 times 2 raised to OP2 rounded according to RND.
     Just modifies the exponents of the real and imaginary parts by OP2
     when ROP and OP1 are identical.

 -- Function: int mpc_div_2ui (mpc_t ROP, mpc_t OP1, unsigned long int
          OP2, mpc_rnd_t RND)
 -- Function: int mpc_div_2si (mpc_t ROP, mpc_t OP1, long int OP2,
          mpc_rnd_t RND)
     Set ROP to OP1 divided by 2 raised to OP2 rounded according to RND.
     Just modifies the exponents of the real and imaginary parts by OP2
     when ROP and OP1 are identical.


File: mpc.info,  Node: Power Functions and Logarithm,  Next: Trigonometric Functions,  Prev: Basic Arithmetic,  Up: Complex Functions

5.8 Power Functions and Logarithm
=================================

 -- Function: int mpc_sqrt (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the square root of OP rounded according to RND.  The
     returned value ROP has a non-negative real part, and if its real
     part is zero, a non-negative imaginary part.

 -- Function: int mpc_pow (mpc_t ROP, mpc_t OP1, mpc_t OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_pow_d (mpc_t ROP, mpc_t OP1, double OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_pow_ld (mpc_t ROP, mpc_t OP1, long double OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_pow_si (mpc_t ROP, mpc_t OP1, long OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_pow_ui (mpc_t ROP, mpc_t OP1, unsigned long OP2,
          mpc_rnd_t RND)
 -- Function: int mpc_pow_z (mpc_t ROP, mpc_t OP1, mpz_t OP2, mpc_rnd_t
          RND)
 -- Function: int mpc_pow_fr (mpc_t ROP, mpc_t OP1, mpfr_t OP2,
          mpc_rnd_t RND)
     Set ROP to OP1 raised to the power OP2, rounded according to RND.
     For 'mpc_pow_d', 'mpc_pow_ld', 'mpc_pow_si', 'mpc_pow_ui',
     'mpc_pow_z' and 'mpc_pow_fr', the imaginary part of OP2 is
     considered as +0.  When both OP1 and OP2 are zero, the result has
     real part 1, and imaginary part 0, with sign being the opposite of
     that of OP2.

 -- Function: int mpc_exp (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the exponential of OP, rounded according to RND with the
     precision of ROP.

 -- Function: int mpc_log (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
 -- Function: int mpc_log10 (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the natural and base-10 logarithm of OP respectively,
     rounded according to RND with the precision of ROP.  The principal
     branch is chosen, with the branch cut on the negative real axis, so
     that the imaginary part of the result lies in ]-\pi , \pi] and
     ]-\pi/log(10) , \pi/log(10)] respectively.


File: mpc.info,  Node: Trigonometric Functions,  Next: Miscellaneous Complex Functions,  Prev: Power Functions and Logarithm,  Up: Complex Functions

5.9 Trigonometric Functions
===========================

 -- Function: int mpc_sin (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the sine of OP, rounded according to RND with the
     precision of ROP.

 -- Function: int mpc_cos (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the cosine of OP, rounded according to RND with the
     precision of ROP.

 -- Function: int mpc_sin_cos (mpc_t ROP_SIN, mpc_t ROP_COS, mpc_t OP,
          mpc_rnd_t RND_SIN, mpc_rnd_t RND_COS)
     Set ROP_SIN to the sine of OP, rounded according to RND_SIN with
     the precision of ROP_SIN, and ROP_COS to the cosine of OP, rounded
     according to RND_COS with the precision of ROP_COS.

 -- Function: int mpc_tan (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the tangent of OP, rounded according to RND with the
     precision of ROP.

 -- Function: int mpc_sinh (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the hyperbolic sine of OP, rounded according to RND with
     the precision of ROP.

 -- Function: int mpc_cosh (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the hyperbolic cosine of OP, rounded according to RND
     with the precision of ROP.

 -- Function: int mpc_tanh (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the hyperbolic tangent of OP, rounded according to RND
     with the precision of ROP.

 -- Function: int mpc_asin (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
 -- Function: int mpc_acos (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
 -- Function: int mpc_atan (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the inverse sine, inverse cosine, inverse tangent of OP,
     rounded according to RND with the precision of ROP.

 -- Function: int mpc_asinh (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
 -- Function: int mpc_acosh (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
 -- Function: int mpc_atanh (mpc_t ROP, mpc_t OP, mpc_rnd_t RND)
     Set ROP to the inverse hyperbolic sine, inverse hyperbolic cosine,
     inverse hyperbolic tangent of OP, rounded according to RND with the
     precision of ROP.  The branch cut of MPC_ACOSH is (-\infty, 1).


File: mpc.info,  Node: Miscellaneous Complex Functions,  Next: Advanced Functions,  Prev: Trigonometric Functions,  Up: Complex Functions

5.10 Miscellaneous Functions
============================

 -- Function: int mpc_urandom (mpc_t ROP, gmp_randstate_t STATE)
     Generate a uniformly distributed random complex in the unit square
     [0, 1] x [0, 1].  Return 0, unless an exponent in the real or
     imaginary part is not in the current exponent range, in which case
     that part is set to NaN and a zero value is returned.  The second
     argument is a 'gmp_randstate_t' structure which should be created
     using the GMP 'rand_init' function, see the GMP manual.

 -- Function: const char * mpc_get_version (void)
     Return the GNU MPC version, as a null-terminated string.

 -- Macro: MPC_VERSION
 -- Macro: MPC_VERSION_MAJOR
 -- Macro: MPC_VERSION_MINOR
 -- Macro: MPC_VERSION_PATCHLEVEL
 -- Macro: MPC_VERSION_STRING
     'MPC_VERSION' is the version of GNU MPC as a preprocessing
     constant.  'MPC_VERSION_MAJOR', 'MPC_VERSION_MINOR' and
     'MPC_VERSION_PATCHLEVEL' are respectively the major, minor and
     patch level of GNU MPC version, as preprocessing constants.
     'MPC_VERSION_STRING' is the version as a string constant, which can
     be compared to the result of 'mpc_get_version' to check at run time
     the header file and library used match:
          if (strcmp (mpc_get_version (), MPC_VERSION_STRING))
            fprintf (stderr, "Warning: header and library do not match\n");
     Note: Obtaining different strings is not necessarily an error, as
     in general, a program compiled with some old GNU MPC version can be
     dynamically linked with a newer GNU MPC library version (if allowed
     by the library versioning system).

 -- Macro: long MPC_VERSION_NUM (MAJOR, MINOR, PATCHLEVEL)
     Create an integer in the same format as used by 'MPC_VERSION' from
     the given MAJOR, MINOR and PATCHLEVEL.  Here is an example of how
     to check the GNU MPC version at compile time:
          #if (!defined(MPC_VERSION) || (MPC_VERSION<MPC_VERSION_NUM(2,1,0)))
          # error "Wrong GNU MPC version."
          #endif


File: mpc.info,  Node: Advanced Functions,  Next: Internals,  Prev: Miscellaneous Complex Functions,  Up: Complex Functions

5.11 Advanced Functions
=======================

 -- Macro: MPC_SET_X_Y (REAL_SUFFIX, IMAG_SUFFIX, ROP, REAL, IMAG, RND)
     The macro MPC_SET_X_Y is designed to serve as the body of an
     assignment function and cannot be used by itself.  The REAL_SUFFIX
     and IMAG_SUFFIX parameters are the types of the real and imaginary
     part, that is, the 'x' in the 'mpfr_set_x' function one would use
     to set the part; for the mpfr type, use 'fr'.  REAL (respectively
     IMAG) is the value you want to assign to the real (resp.
     imaginary) part, its type must conform to REAL_SUFFIX (resp.
     IMAG_SUFFIX).  RND is the 'mpc_rnd_t' rounding mode.  The return
     value is the usual inexact value (*note Return Value:
     return-value.).

     For instance, you can define mpc_set_ui_fr as follows:
          int mpc_set_ui_fr (mpc_t rop, long int re, double im, mpc_rnd_t rnd)
              MPC_SET_X_Y (ui, fr, rop, re, im, rnd);


File: mpc.info,  Node: Internals,  Prev: Advanced Functions,  Up: Complex Functions

5.12 Internals
==============

These macros and functions are mainly designed for the implementation of
GNU MPC, but may be useful for users too.  However, no upward
compatibility is guaranteed.  You need to include 'mpc-impl.h' to use
them.

   The macro 'MPC_MAX_PREC(z)' gives the maximum of the precisions of
the real and imaginary parts of a complex number.


File: mpc.info,  Node: References,  Next: Concept Index,  Prev: Complex Functions,  Up: Top

References
**********

   * Torbjo"rn Granlund et al.  'gmp' - GNU multiprecision library.
     Version 4.2.4, <http://gmplib.org/>.

   * Guillaume Hanrot, Vincent Lefe`vre, Patrick Pe'lissier, Paul
     Zimmermann et al.  'mpfr' - A library for multiple-precision
     floating-point computations with exact rounding.  Version 2.4.1,
     <http://www.mpfr.org>.

   * IEEE standard for binary floating-point arithmetic, Technical
     Report ANSI-IEEE Standard 754-1985, New York, 1985.  Approved March
     21, 1985: IEEE Standards Board; approved July 26, 1985: American
     National Standards Institute, 18 pages.

   * Donald E. Knuth, "The Art of Computer Programming", vol 2,
     "Seminumerical Algorithms", 2nd edition, Addison-Wesley, 1981.

   * ISO/IEC 9899:1999, Programming languages — C.


File: mpc.info,  Node: Concept Index,  Next: Function Index,  Prev: References,  Up: Top

Concept Index
*************

 [index ]
* Menu:

* Arithmetic functions:                  Basic Arithmetic.     (line  6)
* Comparison functions:                  Complex Comparison.   (line  6)
* Complex arithmetic functions:          Basic Arithmetic.     (line  6)
* Complex assignment functions:          Assigning Complex Numbers.
                                                               (line  6)
* Complex comparisons functions:         Complex Comparison.   (line  6)
* Complex functions:                     Complex Functions.    (line  6)
* Complex number:                        GNU MPC Basics.       (line 15)
* Conditions for copying GNU MPC:        Copying.              (line  6)
* Conversion functions:                  Converting Complex Numbers.
                                                               (line  6)
* Copying conditions:                    Copying.              (line  6)
* Installation:                          Installing GNU MPC.   (line  6)
* Logarithm:                             Power Functions and Logarithm.
                                                               (line  6)
* Miscellaneous complex functions:       Miscellaneous Complex Functions.
                                                               (line  6)
* 'mpc.h':                               GNU MPC Basics.       (line  6)
* Power functions:                       Power Functions and Logarithm.
                                                               (line  6)
* Precision:                             GNU MPC Basics.       (line 19)
* Projection and Decomposing Functions:  Projection & Decomposing.
                                                               (line  6)
* Reporting bugs:                        Reporting Bugs.       (line  6)
* Rounding Mode:                         GNU MPC Basics.       (line 24)
* String and stream input and output:    String and Stream Input and Output.
                                                               (line  6)
* Trigonometric functions:               Trigonometric Functions.
                                                               (line  6)
* User-defined precision:                Complex Functions.    (line 12)


File: mpc.info,  Node: Function Index,  Next: GNU Free Documentation License,  Prev: Concept Index,  Up: Top

Function Index
**************

 [index ]
* Menu:

* _Complex:                              Converting Complex Numbers.
                                                              (line   9)
* mpc_abs:                               Basic Arithmetic.    (line  81)
* mpc_acos:                              Trigonometric Functions.
                                                              (line  37)
* mpc_acosh:                             Trigonometric Functions.
                                                              (line  43)
* mpc_add:                               Basic Arithmetic.    (line  11)
* mpc_add_fr:                            Basic Arithmetic.    (line  15)
* mpc_add_ui:                            Basic Arithmetic.    (line  13)
* mpc_arg:                               Projection & Decomposing.
                                                              (line  20)
* mpc_asin:                              Trigonometric Functions.
                                                              (line  36)
* mpc_asinh:                             Trigonometric Functions.
                                                              (line  42)
* mpc_atan:                              Trigonometric Functions.
                                                              (line  38)
* mpc_atanh:                             Trigonometric Functions.
                                                              (line  44)
* mpc_clear:                             Initializing Complex Numbers.
                                                              (line  21)
* mpc_cmp:                               Complex Comparison.  (line   6)
* mpc_cmp_si:                            Complex Comparison.  (line   9)
* mpc_cmp_si_si:                         Complex Comparison.  (line   7)
* mpc_conj:                              Basic Arithmetic.    (line  76)
* mpc_cos:                               Trigonometric Functions.
                                                              (line  10)
* mpc_cosh:                              Trigonometric Functions.
                                                              (line  28)
* mpc_div:                               Basic Arithmetic.    (line  64)
* mpc_div_2si:                           Basic Arithmetic.    (line  99)
* mpc_div_2ui:                           Basic Arithmetic.    (line  97)
* mpc_div_fr:                            Basic Arithmetic.    (line  68)
* mpc_div_ui:                            Basic Arithmetic.    (line  66)
* mpc_exp:                               Power Functions and Logarithm.
                                                              (line  32)
* mpc_fma:                               Basic Arithmetic.    (line  59)
* mpc_free_str:                          String and Stream Input and Output.
                                                              (line  66)
* mpc_fr_div:                            Basic Arithmetic.    (line  72)
* mpc_fr_sub:                            Basic Arithmetic.    (line  23)
* mpc_get_ldc:                           Converting Complex Numbers.
                                                              (line  10)
* mpc_get_prec:                          Initializing Complex Numbers.
                                                              (line  49)
* mpc_get_prec2:                         Initializing Complex Numbers.
                                                              (line  53)
* mpc_get_str:                           String and Stream Input and Output.
                                                              (line  48)
* mpc_get_version:                       Miscellaneous Complex Functions.
                                                              (line  14)
* mpc_imag:                              Projection & Decomposing.
                                                              (line  10)
* mpc_imagref:                           Projection & Decomposing.
                                                              (line  15)
* mpc_init2:                             Initializing Complex Numbers.
                                                              (line  10)
* mpc_init3:                             Initializing Complex Numbers.
                                                              (line  15)
* mpc_inp_str:                           String and Stream Input and Output.
                                                              (line  74)
* mpc_log:                               Power Functions and Logarithm.
                                                              (line  36)
* mpc_log10:                             Power Functions and Logarithm.
                                                              (line  37)
* mpc_mul:                               Basic Arithmetic.    (line  38)
* mpc_mul_2si:                           Basic Arithmetic.    (line  91)
* mpc_mul_2ui:                           Basic Arithmetic.    (line  89)
* mpc_mul_fr:                            Basic Arithmetic.    (line  44)
* mpc_mul_i:                             Basic Arithmetic.    (line  50)
* mpc_mul_si:                            Basic Arithmetic.    (line  42)
* mpc_mul_ui:                            Basic Arithmetic.    (line  40)
* mpc_neg:                               Basic Arithmetic.    (line  34)
* mpc_norm:                              Basic Arithmetic.    (line  85)
* mpc_out_str:                           String and Stream Input and Output.
                                                              (line 109)
* mpc_pow:                               Power Functions and Logarithm.
                                                              (line  11)
* mpc_pow_d:                             Power Functions and Logarithm.
                                                              (line  13)
* mpc_pow_fr:                            Power Functions and Logarithm.
                                                              (line  23)
* mpc_pow_ld:                            Power Functions and Logarithm.
                                                              (line  15)
* mpc_pow_si:                            Power Functions and Logarithm.
                                                              (line  17)
* mpc_pow_ui:                            Power Functions and Logarithm.
                                                              (line  19)
* mpc_pow_z:                             Power Functions and Logarithm.
                                                              (line  21)
* mpc_proj:                              Projection & Decomposing.
                                                              (line  24)
* mpc_real:                              Projection & Decomposing.
                                                              (line   6)
* mpc_realref:                           Projection & Decomposing.
                                                              (line  14)
* 'mpc_rnd_t':                           GNU MPC Basics.      (line  24)
* mpc_set:                               Assigning Complex Numbers.
                                                              (line  16)
* mpc_set_d:                             Assigning Complex Numbers.
                                                              (line  25)
* mpc_set_dc:                            Assigning Complex Numbers.
                                                              (line  27)
* mpc_set_d_d:                           Assigning Complex Numbers.
                                                              (line  54)
* mpc_set_f:                             Assigning Complex Numbers.
                                                              (line  33)
* mpc_set_fr:                            Assigning Complex Numbers.
                                                              (line  34)
* mpc_set_fr_fr:                         Assigning Complex Numbers.
                                                              (line  64)
* mpc_set_f_f:                           Assigning Complex Numbers.
                                                              (line  62)
* mpc_set_ld:                            Assigning Complex Numbers.
                                                              (line  26)
* mpc_set_ldc:                           Assigning Complex Numbers.
                                                              (line  29)
* mpc_set_ld_ld:                         Assigning Complex Numbers.
                                                              (line  56)
* mpc_set_nan:                           Assigning Complex Numbers.
                                                              (line  79)
* mpc_set_prec:                          Initializing Complex Numbers.
                                                              (line  41)
* mpc_set_q:                             Assigning Complex Numbers.
                                                              (line  32)
* mpc_set_q_q:                           Assigning Complex Numbers.
                                                              (line  60)
* mpc_set_si:                            Assigning Complex Numbers.
                                                              (line  22)
* mpc_set_si_si:                         Assigning Complex Numbers.
                                                              (line  48)
* mpc_set_sj:                            Assigning Complex Numbers.
                                                              (line  24)
* mpc_set_sj_sj:                         Assigning Complex Numbers.
                                                              (line  52)
* mpc_set_str:                           String and Stream Input and Output.
                                                              (line  35)
* mpc_set_ui:                            Assigning Complex Numbers.
                                                              (line  20)
* mpc_set_ui_ui:                         Assigning Complex Numbers.
                                                              (line  46)
* mpc_set_uj:                            Assigning Complex Numbers.
                                                              (line  23)
* mpc_set_uj_uj:                         Assigning Complex Numbers.
                                                              (line  50)
* MPC_SET_X_Y:                           Advanced Functions.  (line   6)
* mpc_set_z:                             Assigning Complex Numbers.
                                                              (line  31)
* mpc_set_z_z:                           Assigning Complex Numbers.
                                                              (line  58)
* mpc_sin:                               Trigonometric Functions.
                                                              (line   6)
* mpc_sinh:                              Trigonometric Functions.
                                                              (line  24)
* mpc_sin_cos:                           Trigonometric Functions.
                                                              (line  14)
* mpc_sqr:                               Basic Arithmetic.    (line  56)
* mpc_sqrt:                              Power Functions and Logarithm.
                                                              (line   6)
* mpc_strtoc:                            String and Stream Input and Output.
                                                              (line   6)
* mpc_sub:                               Basic Arithmetic.    (line  19)
* mpc_sub_fr:                            Basic Arithmetic.    (line  21)
* mpc_sub_ui:                            Basic Arithmetic.    (line  25)
* mpc_swap:                              Assigning Complex Numbers.
                                                              (line  82)
* 'mpc_t':                               GNU MPC Basics.      (line  15)
* mpc_tan:                               Trigonometric Functions.
                                                              (line  20)
* mpc_tanh:                              Trigonometric Functions.
                                                              (line  32)
* mpc_ui_div:                            Basic Arithmetic.    (line  70)
* mpc_ui_sub:                            Basic Arithmetic.    (line  27)
* mpc_ui_ui_sub:                         Basic Arithmetic.    (line  29)
* mpc_urandom:                           Miscellaneous Complex Functions.
                                                              (line   6)
* MPC_VERSION:                           Miscellaneous Complex Functions.
                                                              (line  17)
* MPC_VERSION_MAJOR:                     Miscellaneous Complex Functions.
                                                              (line  18)
* MPC_VERSION_MINOR:                     Miscellaneous Complex Functions.
                                                              (line  19)
* MPC_VERSION_NUM:                       Miscellaneous Complex Functions.
                                                              (line  36)
* MPC_VERSION_PATCHLEVEL:                Miscellaneous Complex Functions.
                                                              (line  20)
* MPC_VERSION_STRING:                    Miscellaneous Complex Functions.
                                                              (line  21)
* 'mpfr_prec_t':                         GNU MPC Basics.      (line  19)


File: mpc.info,  Node: GNU Free Documentation License,  Prev: Function Index,  Up: Top

Appendix A GNU Free Documentation License
*****************************************

                     Version 1.3, 3 November 2008

     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     <http://fsf.org/>

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     functional and useful document "free" in the sense of freedom: to
     assure everyone the effective freedom to copy and redistribute it,
     with or without modifying it, either commercially or
     noncommercially.  Secondarily, this License preserves for the
     author and publisher a way to get credit for their work, while not
     being considered responsible for modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.  We
     recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work, in any medium,
     that contains a notice placed by the copyright holder saying it can
     be distributed under the terms of this License.  Such a notice
     grants a world-wide, royalty-free license, unlimited in duration,
     to use that work under the conditions stated herein.  The
     "Document", below, refers to any such manual or work.  Any member
     of the public is a licensee, and is addressed as "you".  You accept
     the license if you copy, modify or distribute the work in a way
     requiring permission under copyright law.

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter section
     of the Document that deals exclusively with the relationship of the
     publishers or authors of the Document to the Document's overall
     subject (or to related matters) and contains nothing that could
     fall directly within that overall subject.  (Thus, if the Document
     is in part a textbook of mathematics, a Secondary Section may not
     explain any mathematics.)  The relationship could be a matter of
     historical connection with the subject or with related matters, or
     of legal, commercial, philosophical, ethical or political position
     regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in the
     notice that says that the Document is released under this License.
     If a section does not fit the above definition of Secondary then it
     is not allowed to be designated as Invariant.  The Document may
     contain zero Invariant Sections.  If the Document does not identify
     any Invariant Sections then there are none.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.  A
     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
     be at most 25 words.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, that is suitable for revising the document
     straightforwardly with generic text editors or (for images composed
     of pixels) generic paint programs or (for drawings) some widely
     available drawing editor, and that is suitable for input to text
     formatters or for automatic translation to a variety of formats
     suitable for input to text formatters.  A copy made in an otherwise
     Transparent file format whose markup, or absence of markup, has
     been arranged to thwart or discourage subsequent modification by
     readers is not Transparent.  An image format is not Transparent if
     used for any substantial amount of text.  A copy that is not
     "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and standard-conforming
     simple HTML, PostScript or PDF designed for human modification.
     Examples of transparent image formats include PNG, XCF and JPG.
     Opaque formats include proprietary formats that can be read and
     edited only by proprietary word processors, SGML or XML for which
     the DTD and/or processing tools are not generally available, and
     the machine-generated HTML, PostScript or PDF produced by some word
     processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

     The "publisher" means any person or entity that distributes copies
     of the Document to the public.

     A section "Entitled XYZ" means a named subunit of the Document
     whose title either is precisely XYZ or contains XYZ in parentheses
     following text that translates XYZ in another language.  (Here XYZ
     stands for a specific section name mentioned below, such as
     "Acknowledgements", "Dedications", "Endorsements", or "History".)
     To "Preserve the Title" of such a section when you modify the
     Document means that it remains a section "Entitled XYZ" according
     to this definition.

     The Document may include Warranty Disclaimers next to the notice
     which states that this License applies to the Document.  These
     Warranty Disclaimers are considered to be included by reference in
     this License, but only as regards disclaiming warranties: any other
     implication that these Warranty Disclaimers may have is void and
     has no effect on the meaning of this License.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow the
     conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies (or copies in media that commonly
     have printed covers) of the Document, numbering more than 100, and
     the Document's license notice requires Cover Texts, you must
     enclose the copies in covers that carry, clearly and legibly, all
     these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the title
     equally prominent and visible.  You may add other material on the
     covers in addition.  Copying with changes limited to the covers, as
     long as they preserve the title of the Document and satisfy these
     conditions, can be treated as verbatim copying in other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a machine-readable
     Transparent copy along with each Opaque copy, or state in or with
     each Opaque copy a computer-network location from which the general
     network-using public has access to download using public-standard
     network protocols a complete Transparent copy of the Document, free
     of added material.  If you use the latter option, you must take
     reasonably prudent steps, when you begin distribution of Opaque
     copies in quantity, to ensure that this Transparent copy will
     remain thus accessible at the stated location until at least one
     year after the last time you distribute an Opaque copy (directly or
     through your agents or retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of copies,
     to give them a chance to provide you with an updated version of the
     Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with the
     Modified Version filling the role of the Document, thus licensing
     distribution and modification of the Modified Version to whoever
     possesses a copy of it.  In addition, you must do these things in
     the Modified Version:

       A. Use in the Title Page (and on the covers, if any) a title
          distinct from that of the Document, and from those of previous
          versions (which should, if there were any, be listed in the
          History section of the Document).  You may use the same title
          as a previous version if the original publisher of that
          version gives permission.

       B. List on the Title Page, as authors, one or more persons or
          entities responsible for authorship of the modifications in
          the Modified Version, together with at least five of the
          principal authors of the Document (all of its principal
          authors, if it has fewer than five), unless they release you
          from this requirement.

       C. State on the Title page the name of the publisher of the
          Modified Version, as the publisher.

       D. Preserve all the copyright notices of the Document.

       E. Add an appropriate copyright notice for your modifications
          adjacent to the other copyright notices.

       F. Include, immediately after the copyright notices, a license
          notice giving the public permission to use the Modified
          Version under the terms of this License, in the form shown in
          the Addendum below.

       G. Preserve in that license notice the full lists of Invariant
          Sections and required Cover Texts given in the Document's
          license notice.

       H. Include an unaltered copy of this License.

       I. Preserve the section Entitled "History", Preserve its Title,
          and add to it an item stating at least the title, year, new
          authors, and publisher of the Modified Version as given on the
          Title Page.  If there is no section Entitled "History" in the
          Document, create one stating the title, year, authors, and
          publisher of the Document as given on its Title Page, then add
          an item describing the Modified Version as stated in the
          previous sentence.

       J. Preserve the network location, if any, given in the Document
          for public access to a Transparent copy of the Document, and
          likewise the network locations given in the Document for
          previous versions it was based on.  These may be placed in the
          "History" section.  You may omit a network location for a work
          that was published at least four years before the Document
          itself, or if the original publisher of the version it refers
          to gives permission.

       K. For any section Entitled "Acknowledgements" or "Dedications",
          Preserve the Title of the section, and preserve in the section
          all the substance and tone of each of the contributor
          acknowledgements and/or dedications given therein.

       L. Preserve all the Invariant Sections of the Document, unaltered
          in their text and in their titles.  Section numbers or the
          equivalent are not considered part of the section titles.

       M. Delete any section Entitled "Endorsements".  Such a section
          may not be included in the Modified Version.

       N. Do not retitle any existing section to be Entitled
          "Endorsements" or to conflict in title with any Invariant
          Section.

       O. Preserve any Warranty Disclaimers.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option designate
     some or all of these sections as invariant.  To do this, add their
     titles to the list of Invariant Sections in the Modified Version's
     license notice.  These titles must be distinct from any other
     section titles.

     You may add a section Entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties--for example, statements of peer review or that the text
     has been approved by an organization as the authoritative
     definition of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end of
     the list of Cover Texts in the Modified Version.  Only one passage
     of Front-Cover Text and one of Back-Cover Text may be added by (or
     through arrangements made by) any one entity.  If the Document
     already includes a cover text for the same cover, previously added
     by you or by arrangement made by the same entity you are acting on
     behalf of, you may not add another; but you may replace the old
     one, on explicit permission from the previous publisher that added
     the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination all
     of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice, and that you preserve all
     their Warranty Disclaimers.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections Entitled
     "History" in the various original documents, forming one section
     Entitled "History"; likewise combine any sections Entitled
     "Acknowledgements", and any sections Entitled "Dedications".  You
     must delete all sections Entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the documents
     in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow this
     License in all other respects regarding verbatim copying of that
     document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of a
     storage or distribution medium, is called an "aggregate" if the
     copyright resulting from the compilation is not used to limit the
     legal rights of the compilation's users beyond what the individual
     works permit.  When the Document is included in an aggregate, this
     License does not apply to the other works in the aggregate which
     are not themselves derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one half
     of the entire aggregate, the Document's Cover Texts may be placed
     on covers that bracket the Document within the aggregate, or the
     electronic equivalent of covers if the Document is in electronic
     form.  Otherwise they must appear on printed covers that bracket
     the whole aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License, and all the license notices in the
     Document, and any Warranty Disclaimers, provided that you also
     include the original English version of this License and the
     original versions of those notices and disclaimers.  In case of a
     disagreement between the translation and the original version of
     this License or a notice or disclaimer, the original version will
     prevail.

     If a section in the Document is Entitled "Acknowledgements",
     "Dedications", or "History", the requirement (section 4) to
     Preserve its Title (section 1) will typically require changing the
     actual title.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided under this License.  Any attempt
     otherwise to copy, modify, sublicense, or distribute it is void,
     and will automatically terminate your rights under this License.

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly and
     finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from you
     under this License.  If your rights have been terminated and not
     permanently reinstated, receipt of a copy of some or all of the
     same material does not give you any rights to use it.

  10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     <http://www.gnu.org/copyleft/>.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If the
     Document does not specify a version number of this License, you may
     choose any version ever published (not as a draft) by the Free
     Software Foundation.  If the Document specifies that a proxy can
     decide which future versions of this License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Document.

  11. RELICENSING

     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
     World Wide Web server that publishes copyrightable works and also
     provides prominent facilities for anybody to edit those works.  A
     public wiki that anybody can edit is an example of such a server.
     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
     site means any set of copyrightable works thus published on the MMC
     site.

     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
     license published by Creative Commons Corporation, a not-for-profit
     corporation with a principal place of business in San Francisco,
     California, as well as future copyleft versions of that license
     published by that same organization.

     "Incorporate" means to publish or republish a Document, in whole or
     in part, as part of another Document.

     An MMC is "eligible for relicensing" if it is licensed under this
     License, and if all works that were first published under this
     License somewhere other than this MMC, and subsequently
     incorporated in whole or in part into the MMC, (1) had no cover
     texts or invariant sections, and (2) were thus incorporated prior
     to November 1, 2008.

     The operator of an MMC Site may republish an MMC contained in the
     site under CC-BY-SA on the same site at any time before August 1,
     2009, provided the MMC is eligible for relicensing.

ADDENDUM: How to use this License for your documents
====================================================

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.3
       or any later version published by the Free Software Foundation;
       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
       Texts.  A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.

   If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts."  line with this:

         with the Invariant Sections being LIST THEIR TITLES, with
         the Front-Cover Texts being LIST, and with the Back-Cover Texts
         being LIST.

   If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of free
software license, such as the GNU General Public License, to permit
their use in free software.



Tag Table:
Node: Top735
Node: Copying1442
Node: Introduction to GNU MPC2214
Node: Installing GNU MPC2933
Node: Reporting Bugs8018
Node: GNU MPC Basics9362
Ref: return-value13039
Node: Complex Functions14490
Node: Initializing Complex Numbers15650
Node: Assigning Complex Numbers18037
Node: Converting Complex Numbers22437
Node: String and Stream Input and Output23062
Node: Complex Comparison29619
Node: Projection & Decomposing30694
Node: Basic Arithmetic32071
Node: Power Functions and Logarithm36644
Node: Trigonometric Functions38711
Node: Miscellaneous Complex Functions40936
Node: Advanced Functions43112
Node: Internals44185
Node: References44636
Node: Concept Index45539
Node: Function Index47853
Node: GNU Free Documentation License61637

End Tag Table
