diff options
Diffstat (limited to 'mpc/doc/mpc.texi')
-rw-r--r-- | mpc/doc/mpc.texi | 1165 |
1 files changed, 1165 insertions, 0 deletions
diff --git a/mpc/doc/mpc.texi b/mpc/doc/mpc.texi new file mode 100644 index 0000000000..8b37ba2e1a --- /dev/null +++ b/mpc/doc/mpc.texi @@ -0,0 +1,1165 @@ +\input texinfo +@setfilename mpc.info +@include version.texi +@settitle GNU MPC @value{VERSION} +@synindex tp fn + +@set MINGMP 4.3.2 +@set MINMPFR 2.4.2 + +@set AUTHORS Andreas Enge, Philippe Th@'eveny, Paul Zimmermann + +@copying +This manual is for GNU MPC, a library for multiple precision complex arithmetic, +version @value{VERSION} of @value{UPDATED-MONTH}. + +Copyright @copyright{} 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 INRIA + +@quotation +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.'' +@end quotation +@end copying + +@iftex +@afourpaper +@end iftex +@tex +\global\parindent=0pt +\global\parskip=8pt +\global\baselineskip=13pt +@end tex + +@dircategory GNU Packages +@direntry +* mpc: (mpc)Multiple Precision Complex Library. +@end direntry + + +@titlepage +@title GNU MPC +@subtitle The GNU Multiple Precision Complex Library +@subtitle Edition @value{VERSION} +@subtitle @value{UPDATED-MONTH} +@author @value{AUTHORS} +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + + +@ifnottex +@node Top +@top GNU MPC + +This manual documents how to install and use the GNU Multiple Precision +Complex Library, version @value{VERSION} +@end ifnottex + +@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:: +@end menu + +@c @times{} made available as a "x" in info and html (already works in tex). +@ifnottex +@macro times +x +@end macro +@end ifnottex + + +@node Copying +@unnumbered GNU MPC Copying Conditions +@cindex Copying conditions +@cindex Conditions for copying GNU MPC + +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 @uref{http://www.gnu.org/licenses/}. + + +@node Introduction to GNU MPC +@chapter 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. + +@section How to use this Manual + +Everyone should read @ref{GNU MPC Basics}. If you need to install the library +yourself, you need to read @ref{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. + +@node Installing GNU MPC +@chapter Installing GNU MPC +@cindex Installation + +To build GNU MPC, you first have to install GNU MP (version @value{MINGMP} or higher) and +GNU MPFR (version @value{MINMPFR} 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 +@uref{http://lists.gforge.inria.fr/pipermail/mpc-discuss/2011-February/000823.html}. +And you need a +standard Unix @samp{make} program, plus some other standard Unix utility +programs. + +Here are the steps needed to install the library on Unix systems: + +@enumerate +@item +@samp{tar xzf mpc-@value{VERSION}.tar.gz} + +@item +@samp{cd mpc-@value{VERSION}} + +@item +@samp{./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. + +@samp{./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 @samp{./configure --with-gmp-lib=<gmp_lib_dir> +--with-gmp-include=<gmp_include_dir>}. + +@samp{./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 @samp{./configure --with-mpf-lib=<mpfr_lib_dir> +--with-mpfr-include=<mpfr_include_dir>}. + +Another useful parameter is @samp{--prefix}, which can be used to +specify an alternative installation location instead of +@file{/usr/local}; see @samp{make install} below. + +To enable checking for memory leaks using @command{valgrind} during +@code{make check}, add the parameter @code{--enable-valgrind-tests}. + +If for debugging purposes you wish to log calls to GNU MPC functions from +within your code, add the parameter @samp{--enable-logging}. +In your code, replace the inclusion of @file{mpc.h} by @file{mpc-log.h} +and link the executable dynamically. +Then all calls to functions with only complex arguments are printed to +@file{stderr} in the following form: First, the function name is given, +followed by its type such as @samp{c_cc}, meaning that the function has +one complex result (one @samp{c} in front of the @samp{_}), computed from +two complex arguments (two @samp{c} after the @samp{_}). 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 +@code{mpc_out_str} +(@pxref{String and Stream Input and Output}). +The option requires a dynamic library, so it may not be combined with +@code{--disable-shared}. + +Use @samp{./configure --help} for an exhaustive list of parameters. + +@item +@samp{make} + +This compiles GNU MPC in the working directory. + +@item +@samp{make check} + +This will make sure GNU MPC was built correctly. + +If you get error messages, please report them to +@samp{mpc-discuss@@lists.gforge.inria.fr} (@xref{Reporting Bugs}, for +information on what to include in useful bug reports). + +@item +@samp{make install} + +This will copy the file @file{mpc.h} to the directory +@file{/usr/local/include}, the file @file{libmpc.a} to the directory +@file{/usr/local/lib}, and the file @file{mpc.info} to the directory +@file{/usr/local/share/info} (or if you passed the @samp{--prefix} option to +@file{configure}, using the prefix directory given as argument to +@samp{--prefix} instead of @file{/usr/local}). Note: you need write permissions +on these directories. + +@end enumerate + + +@section Other `make' Targets + +There are some other useful make targets: + +@itemize @bullet +@item +@samp{info} + +Create an info version of the manual, in @file{mpc.info}. + +@item +@samp{pdf} + +Create a PDF version of the manual, in @file{doc/mpc.pdf}. + +@item +@samp{dvi} + +Create a DVI version of the manual, in @file{doc/mpc.dvi}. + +@item +@samp{ps} + +Create a Postscript version of the manual, in @file{doc/mpc.ps}. + +@item +@samp{html} + +Create an HTML version of the manual, in several pages in the +directory @file{doc/mpc.html}; if you want only one output HTML file, +then type @samp{makeinfo --html --no-split mpc.texi} instead. + +@item +@samp{clean} + +Delete all object files and archive files, but not the configuration files. + +@item +@samp{distclean} + +Delete all files not included in the distribution. + +@item +@samp{uninstall} + +Delete all files copied by @samp{make install}. +@end itemize + + + +@section 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 @samp{OBJECT_MODE} environment variable to 64 +by, e.g., + +@samp{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 +@samp{mpc-discuss@@lists.gforge.inria.fr}. +@xref{Reporting Bugs}. + +@node Reporting Bugs +@chapter Reporting Bugs +@cindex 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 @samp{gcc -v}, +or @samp{cc -V} on some machines. +Also, include the output from @samp{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: @samp{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. + +@node GNU MPC Basics +@chapter GNU MPC Basics + + +@cindex @file{mpc.h} +All declarations needed to use GNU MPC are collected in the include file +@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 +@example + #include "mpc.h" +@end example + +@section Nomenclature and Types + +@cindex Complex number +@tindex @code{mpc_t} +@noindent +@dfn{Complex number} or @dfn{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 @code{mpc_t}. + +@cindex Precision +@tindex @code{mpfr_prec_t} +@noindent +The @dfn{Precision} is the number of bits used to represent the mantissa +of the real and imaginary parts; +the corresponding C data type is @code{mpfr_prec_t}. +For more details on the allowed precision range, +@ifinfo +@pxref{Nomenclature and Types,,, mpfr.info,GNU MPFR}. +@end ifinfo +@ifnotinfo +see Section ``Nomenclature and Types'' in @cite{GNU MPFR}. +@end ifnotinfo + +@cindex Rounding Mode +@tindex @code{mpc_rnd_t} +@noindent +The @dfn{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 @code{mpc_rnd_t}. +A complex rounding mode is a pair of two rounding modes: one for the real +part, one for the imaginary part. + +@section Function Classes + +There is only one class of functions in the GNU MPC library, namely functions for +complex arithmetic. The function names begin with @code{mpc_}. The +associated type is @code{mpc_t}. + + +@section 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, +@code{mpc_mul}, can be used like this: @code{mpc_mul (x, x, x, rnd_mode)}. +This +computes the square of @var{x} with rounding mode @code{rnd_mode} +and puts the result back in @var{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. + + +@section Rounding Modes + +A complex rounding mode is of the form @code{MPC_RNDxy} where +@code{x} and @code{y} are one of @code{N} (to nearest), @code{Z} (towards +zero), @code{U} (towards plus infinity), @code{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 @code{MPC_RNDZU} indicates to round the real part towards zero, +and the imaginary part towards plus infinity. + +The @samp{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. + + +@anchor{return-value} +@section Return Value + +Most GNU MPC functions have a return value of type @code{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 @code{i}, the macros @code{MPC_INEX_RE(i)} and +@code{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 @code{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 @code{mpc_sin_cos}, compute two complex results; +the macros @code{MPC_INEX1(i)} and @code{MPC_INEX2(i)}, applied to +the return value @code{i} of such a function, yield the exactness value +corresponding to the first or the second computed value, respectively. + + +@section 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. + + +@node Complex Functions +@chapter Complex Functions +@cindex Complex functions + +The complex functions expect arguments of type @code{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 +@code{mpc_}. + +@cindex User-defined precision +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:: +@end menu + +@node Initializing Complex Numbers +@section Initialization Functions + +An @code{mpc_t} object must be initialized before storing the first value in +it. The functions @code{mpc_init2} and @code{mpc_init3} +are used for that purpose. + +@deftypefun void mpc_init2 (mpc_t @var{z}, mpfr_prec_t @var{prec}) +Initialize @var{z} to precision @var{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 @code{mpc_clear}, between initializations. +@end deftypefun + +@deftypefun void mpc_init3 (mpc_t @var{z}, mpfr_prec_t @var{prec_r}, mpfr_prec_t @var{prec_i}) +Initialize @var{z} with the precision of its real part being +@var{prec_r} bits and the precision of its imaginary part being +@var{prec_i} bits, and set the real and imaginary parts to NaN. +@end deftypefun + +@deftypefun void mpc_clear (mpc_t @var{z}) +Free the space occupied by @var{z}. Make sure to call this function for all +@code{mpc_t} variables when you are done with them. +@end deftypefun + +@need 2000 +Here is an example on how to initialize complex variables: +@example +@{ + mpc_t x, y; + mpc_init2 (x, 256); /* precision @emph{exactly} 256 bits */ + mpc_init3 (y, 100, 50); /* 100/50 bits for the real/imaginary part */ + @dots{} + mpc_clear (x); + mpc_clear (y); +@} +@end example + +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. + +@deftypefun void mpc_set_prec (mpc_t @var{x}, mpfr_prec_t @var{prec}) +Reset the precision of @var{x} to be @strong{exactly} @var{prec} bits, +and set its real/imaginary parts to NaN. +The previous value stored in @var{x} is lost. It is equivalent to +a call to @code{mpc_clear(x)} followed by a call to +@code{mpc_init2(x, prec)}, but more efficient as no allocation is done in +case the current allocated space for the mantissa of @var{x} is sufficient. +@end deftypefun + +@deftypefun mpfr_prec_t mpc_get_prec (mpc_t @var{x}) +If the real and imaginary part of @var{x} have the same precision, it is returned, +otherwise, 0 is returned. +@end deftypefun + +@deftypefun void mpc_get_prec2 (mpfr_prec_t* @var{pr}, mpfr_prec_t* @var{pi}, mpc_t @var{x}) +Returns the precision of the real part of @var{x} via @var{pr} and of its imaginary part +via @var{pi}. +@end deftypefun + + +@node Assigning Complex Numbers +@section Assignment Functions +@cindex Complex assignment functions + +These functions assign new values to already initialized complex numbers +(@pxref{Initializing Complex Numbers}). +When using any functions with @code{intmax_t} or @code{uintmax_t} +parameters, you must include +@code{<stdint.h>} or @code{<inttypes.h>} @emph{before} @file{mpc.h}, to allow +@file{mpc.h} to define prototypes for these functions. +Similarly, functions with parameters of type @code{complex} or +@code{long complex} are defined only if @code{<complex.h>} is included +@emph{before} @file{mpc.h}. +If you need assignment functions that are not in the current API, you can +define them using the @code{MPC_SET_X_Y} macro (@pxref{Advanced Functions}). + +@deftypefun int mpc_set (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set the value of @var{rop} from @var{op}, rounded to the precision of @var{rop} +with the given rounding mode @var{rnd}. +@end deftypefun + +@deftypefun int mpc_set_ui (mpc_t @var{rop}, unsigned long int @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_si (mpc_t @var{rop}, long int @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_uj (mpc_t @var{rop}, uintmax_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_sj (mpc_t @var{rop}, intmax_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_d (mpc_t @var{rop}, double @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_ld (mpc_t @var{rop}, long double @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_dc (mpc_t @var{rop}, double _Complex @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_ldc (mpc_t @var{rop}, long double _Complex @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_z (mpc_t @var{rop}, mpz_t @var{op} mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_q (mpc_t @var{rop}, mpq_t @var{op} mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_f (mpc_t @var{rop}, mpf_t @var{op} mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_fr (mpc_t @var{rop}, mpfr_t @var{op}, mpc_rnd_t @var{rnd}) +Set the value of @var{rop} from @var{op}, rounded to the precision of +@var{rop} with the given rounding mode @var{rnd}. +The argument @var{op} is interpreted as real, so the imaginary part of +@var{rop} is set to zero with a positive sign. +Please note that even a @code{long int} may have to be rounded, if the +destination precision is less than the machine word width. +For @code{mpc_set_d}, be careful that the input number @var{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. +@end deftypefun + +@deftypefun int mpc_set_ui_ui (mpc_t @var{rop}, unsigned long int @var{op1}, unsigned long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_si_si (mpc_t @var{rop}, long int @var{op1}, long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_uj_uj (mpc_t @var{rop}, uintmax_t @var{op1}, uintmax_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_sj_sj (mpc_t @var{rop}, intmax_t @var{op1}, intmax_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_d_d (mpc_t @var{rop}, double @var{op1}, double @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_ld_ld (mpc_t @var{rop}, long double @var{op1}, long double @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_z_z (mpc_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_q_q (mpc_t @var{rop}, mpq_t @var{op1}, mpq_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_f_f (mpc_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_set_fr_fr (mpc_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpc_rnd_t @var{rnd}) +Set the real part of @var{rop} from @var{op1}, and its imaginary part from +@var{op2}, according to the rounding mode @var{rnd}. + +Beware that the behaviour of @code{mpc_set_fr_fr} is undefined if @var{op1} +or @var{op2} is a pointer to the real or imaginary part of @var{rop}. +To exchange the real and the imaginary part of a complex number, either use +@code{mpfr_swap (mpc_realref (rop), mpc_imagref (rop))}, which also exchanges +the precisions of the two parts; or use a temporary variable. +@end deftypefun + +For functions assigning complex variables from strings or input streams, +@pxref{String and Stream Input and Output}. + +@deftypefun void mpc_set_nan (mpc_t @var{rop}) +Set @var{rop} to Nan+i*NaN. +@end deftypefun + +@deftypefun void mpc_swap (mpc_t @var{op1}, mpc_t @var{op2}) +Swap the values of @var{op1} and @var{op2} efficiently. Warning: The +precisions are exchanged, too; in case these are different, +@code{mpc_swap} is thus not equivalent to three @code{mpc_set} calls using a +third auxiliary variable. +@end deftypefun + + +@node Converting Complex Numbers +@section Conversion Functions +@cindex Conversion functions + +The following functions are available only if @code{<complex.h>} +is included @emph{before} @file{mpc.h}. + +@deftypefun double _Complex mpc_get_dc (mpc_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx {long double _Complex} mpc_get_ldc (mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Convert @var{op} to a C complex number, using the rounding mode @var{rnd}. +@end deftypefun + + +For functions converting complex variables to strings or stream output, +@pxref{String and Stream Input and Output}. + + +@node String and Stream Input and Output +@section String and Stream Input and Output +@cindex String and stream input and output + +@deftypefun int mpc_strtoc (mpc_t @var{rop}, const char *@var{nptr}, char **@var{endptr}, int @var{base}, mpc_rnd_t @var{rnd}) +Read a complex number from a string @var{nptr} in base @var{base}, rounded to +the precision of @var{rop} with the given rounding mode @var{rnd}. +The @var{base} must be either 0 or a number from 2 to 36 (otherwise the +behaviour is undefined). +If @var{nptr} starts with valid data, the result is stored in @var{rop}, +the usual inexact value is returned (@pxref{return-value,, Return +Value}) and, if @var{endptr} is not the null pointer, +@var{*endptr} points to the character just after the valid data. +Otherwise, @var{rop} is set to @code{NaN + i * NaN}, -1 is returned and, +if @var{endptr} is not the null pointer, +the value of @var{nptr} is stored in the location referenced by +@var{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 @code{mpfr_strtofr} +@ifinfo +(@pxref{Assignment Functions,,, mpfr.info,GNU MPFR}). +@end ifinfo +@ifnotinfo +in the GNU MPFR manual. +@end ifnotinfo +For instance, @code{"3.1415926"}, @code{"(1.25e+7 +.17)"}, @code{"(@@nan@@ +2)"} and @code{"(-0 -7)"} are valid strings for @var{base} = 10. +If @var{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, @code{"(1.024e+3 +2.05e+3)"} and @code{"(0b1p+10 +0x802)"} are +valid strings for @code{base}=0 and represent the same value. +@end deftypefun + +@deftypefun int mpc_set_str (mpc_t @var{rop}, const char *@var{s}, int @var{base}, mpc_rnd_t rnd) +Set @var{rop} to the value of the string @var{s} in base @var{base}, rounded +to the precision of @var{rop} with the given rounding mode @var{rnd}. +See the documentation of @code{mpc_strtoc} for a detailed description of the +valid string formats. +Contrarily to @code{mpc_strtoc}, @code{mpc_set_str} requires the @emph{whole} +string to represent a valid complex number (potentially followed by +additional white space). +This function returns the usual inexact value (@pxref{return-value,, Return +Value}) if the entire string up to the final null character is a valid number +in base @var{base}; otherwise it returns @minus{}1, and @var{rop} is set to +NaN+i*NaN. +@end deftypefun + +@deftypefun {char *} mpc_get_str (int @var{b}, size_t @var{n}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Convert @var{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 @var{b} (which may vary from 2 to 36) and +rounded according to @var{rnd}. The number of significant digits, at least 2, +is given by @var{n}. It is also possible to let +@var{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 @var{op}. +Note that @code{mpc_get_str} uses the decimal point of the current locale +if available, and @samp{.} otherwise. + +The string is generated using the current memory allocation function +(@code{malloc} by default, unless it has been modified using the custom +memory allocation interface of @code{gmp}); once it is not needed any more, +it should be freed by calling @code{mpc_free_str}. +@end deftypefun + +@deftypefun {void} mpc_free_str (char *@var{str}) +Free the string @var{str}, which needs to have been allocated by +a call to @code{mpc_get_str}. +@end deftypefun + +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 @file{stdio.h} +@emph{before} @file{mpc.h}. + +@deftypefun int mpc_inp_str (mpc_t @var{rop}, FILE *@var{stream}, size_t *@var{read}, int @var{base}, mpc_rnd_t @var{rnd}) +Input a string in base @var{base} in the same format as for @code{mpc_strtoc} +from stdio stream @var{stream}, rounded according to @var{rnd}, and put the +read complex number into @var{rop}. +If @var{stream} is the null pointer, @var{rop} is read from @code{stdin}. +Return the usual inexact value; if an error occurs, set @var{rop} to @code{NaN ++ i * NaN} and return -1. +If @var{read} is not the null pointer, it is set to the number of read +characters. + +Unlike @code{mpc_strtoc}, the function @code{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 @code{mpc_set_str}. Precisely, after skipping optional +whitespace, a minimal string is read according to the regular expression +@code{mpfr | '(' \s* mpfr \s+ mpfr \s* ')'}, where @code{\s} denotes a whitespace, +and @code{mpfr} is either a string containing neither whitespaces nor +parentheses, or @code{nan(n-char-sequence)} or @code{@@nan@@(n-char-sequence)} +(regardless of capitalisation) with @code{n-char-sequence} a string +of ascii letters, digits or @code{'_'}. + +For instance, upon input of @code{"nan(13 1)"}, the function +@code{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 @code{mpc_strtoc}, on the other hand, may track back +when reaching the whitespace; it treats the string as the two successive +complex numbers @code{NaN + i * 0} and @code{13 + i}. +It is thus recommended to have a whitespace follow each floating point number +to avoid this problem. +@end deftypefun + +@deftypefun size_t mpc_out_str (FILE *@var{stream}, int @var{base}, size_t @var{n_digits}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Output @var{op} on stdio stream @var{stream} in +base @var{base}, rounded according to @var{rnd}, in the same format +as for @code{mpc_strtoc} +If @var{stream} is the null pointer, @var{rop} is written to @code{stdout}. + +Return the number of characters written. +@end deftypefun + + +@node Complex Comparison +@section Comparison Functions +@cindex Complex comparisons functions +@cindex Comparison functions + +@deftypefn Function int mpc_cmp (mpc_t @var{op1}, mpc_t @var{op2}) +@deftypefnx Function int mpc_cmp_si_si (mpc_t @var{op1}, long int @var{op2r}, long int @var{op2i}) +@deftypefnx Macro int mpc_cmp_si (mpc_t @var{op1}, long int @var{op2}) + +Compare @var{op1} and @var{op2}, where in the case of @code{mpc_cmp_si_si}, +@var{op2} is taken to be @var{op2r} + i @var{op2i}. +The return value @var{c} can be decomposed into @code{x = MPC_INEX_RE(c)} +and @code{y = MPC_INEX_IM(c)}, such that @var{x} is +positive if the real part of @var{op1} is greater than that of @var{op2}, +zero if both real parts are equal, and negative if the real part of @var{op1} +is less than that of @var{op2}, and likewise for @var{y}. +Both @var{op1} and @var{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 @code{mpc_cmp (op1, op2) == 0}. +@end deftypefn + + +@node Projection & Decomposing +@section Projection and Decomposing Functions +@cindex Projection and Decomposing Functions + +@deftypefn Function int mpc_real (mpfr_t @var{rop}, mpc_t @var{op}, mpfr_rnd_t @var{rnd}) +Set @var{rop} to the value of the real part of @var{op} rounded +in the direction @var{rnd}. +@end deftypefn + +@deftypefn Function int mpc_imag (mpfr_t @var{rop}, mpc_t @var{op}, mpfr_rnd_t @var{rnd}) +Set @var{rop} to the value of the imaginary part of @var{op} rounded in the +direction @var{rnd}. +@end deftypefn + +@deftypefn Macro mpfr_t mpc_realref (mpc_t @var{op}) +@deftypefnx Macro mpfr_t mpc_imagref (mpc_t @var{op}) +Return a reference to the real part and imaginary part of @var{op}, +respectively. The @code{mpfr} functions can be used on the result of these +macros (note that the @code{mpfr_t} type is itself a pointer). +@end deftypefn + +@deftypefn Function int mpc_arg (mpfr_t @var{rop}, mpc_t @var{op}, mpfr_rnd_t @var{rnd}) +Set @var{rop} to the argument of @var{op}, with a branch cut along the +negative real axis. +@end deftypefn + +@deftypefn Function int mpc_proj (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Compute a projection of @var{op} onto the Riemann sphere. Set @var{rop} to +@var{op} rounded in the direction @var{rnd}, except when at least one part of +@var{op} is infinite (even if the other part is a NaN) in which case the real +part of @var{rop} is set to plus infinity and its imaginary part to a signed +zero with the same sign as the imaginary part of @var{op}. +@end deftypefn + + +@node Basic Arithmetic +@section Basic Arithmetic Functions +@cindex Complex arithmetic functions +@cindex 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. + +@deftypefun int mpc_add (mpc_t @var{rop}, mpc_t @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_add_ui (mpc_t @var{rop}, mpc_t @var{op1}, unsigned long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_add_fr (mpc_t @var{rop}, mpc_t @var{op1}, mpfr_t @var{op2}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1} @math{+} @var{op2} rounded according to @var{rnd}. +@end deftypefun + +@deftypefn Function int mpc_sub (mpc_t @var{rop}, mpc_t @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefnx Function int mpc_sub_fr (mpc_t @var{rop}, mpc_t @var{op1}, mpfr_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefnx Function int mpc_fr_sub (mpc_t @var{rop}, mpfr_t @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefnx Function int mpc_sub_ui (mpc_t @var{rop}, mpc_t @var{op1}, unsigned long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefnx Macro int mpc_ui_sub (mpc_t @var{rop}, unsigned long int @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefnx Function int mpc_ui_ui_sub (mpc_t @var{rop}, unsigned long int @var{re1}, unsigned long int @var{im1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1} @minus{} @var{op2} rounded according to @var{rnd}. +For @code{mpc_ui_ui_sub}, @var{op1} is @var{re1} + @var{im1}. +@end deftypefn + +@deftypefun int mpc_neg (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @minus{}@var{op} rounded according to @var{rnd}. +Just changes the sign if @var{rop} and @var{op} are the same variable. +@end deftypefun + +@deftypefun int mpc_mul (mpc_t @var{rop}, mpc_t @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_mul_ui (mpc_t @var{rop}, mpc_t @var{op1}, unsigned long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_mul_si (mpc_t @var{rop}, mpc_t @var{op1}, long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_mul_fr (mpc_t @var{rop}, mpc_t @var{op1}, mpfr_t @var{op2}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1} times @var{op2} rounded according to @var{rnd}. +Note: for @code{mpc_mul}, in case @var{op1} and @var{op2} have the same value, +use @code{mpc_sqr} for better efficiency. +@end deftypefun + +@deftypefun int mpc_mul_i (mpc_t @var{rop}, mpc_t @var{op}, int @var{sgn}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op} times the imaginary unit i if @var{sgn} is +non-negative, set @var{rop} to @var{op} times -i otherwise, +in both cases rounded according to @var{rnd}. +@end deftypefun + +@deftypefun int mpc_sqr (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the square of @var{op} rounded according to @var{rnd}. +@end deftypefun + +@deftypefun int mpc_fma (mpc_t @var{rop}, mpc_t @var{op1}, mpc_t @var{op2}, mpc_t @var{op3}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1}*@var{op2}+@var{op3}, +rounded according to @var{rnd}, with only one final rounding. +@end deftypefun + +@deftypefun int mpc_div (mpc_t @var{rop}, mpc_t @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_div_ui (mpc_t @var{rop}, mpc_t @var{op1}, unsigned long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_div_fr (mpc_t @var{rop}, mpc_t @var{op1}, mpfr_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_ui_div (mpc_t @var{rop}, unsigned long int @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_fr_div (mpc_t @var{rop}, mpfr_t @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1}/@var{op2} rounded according to @var{rnd}. +@end deftypefun + +@deftypefun int mpc_conj (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the conjugate of @var{op} rounded according to @var{rnd}. +Just changes the sign of the imaginary part +if @var{rop} and @var{op} are the same variable. +@end deftypefun + +@deftypefun int mpc_abs (mpfr_t @var{rop}, mpc_t @var{op}, mpfr_rnd_t @var{rnd}) +Set the floating-point number @var{rop} to the absolute value of @var{op}, +rounded in the direction @var{rnd}. +@end deftypefun + +@deftypefun int mpc_norm (mpfr_t @var{rop}, mpc_t @var{op}, mpfr_rnd_t @var{rnd}) +Set the floating-point number @var{rop} to the norm of @var{op} +(i.e., the square of its absolute value), +rounded in the direction @var{rnd}. +@end deftypefun + +@deftypefun int mpc_mul_2ui (mpc_t @var{rop}, mpc_t @var{op1}, unsigned long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_mul_2si (mpc_t @var{rop}, mpc_t @var{op1}, long int @var{op2}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1} times 2 raised to @var{op2} +rounded according to @var{rnd}. Just modifies the exponents +of the real and imaginary parts by @var{op2} +when @var{rop} and @var{op1} are identical. +@end deftypefun + +@deftypefun int mpc_div_2ui (mpc_t @var{rop}, mpc_t @var{op1}, unsigned long int @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_div_2si (mpc_t @var{rop}, mpc_t @var{op1}, long int @var{op2}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1} divided by 2 raised to @var{op2} +rounded according to @var{rnd}. Just modifies the exponents +of the real and imaginary parts by @var{op2} +when @var{rop} and @var{op1} are identical. +@end deftypefun + + +@node Power Functions and Logarithm +@section Power Functions and Logarithm +@cindex Power functions +@cindex Logarithm + +@deftypefun int mpc_sqrt (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the square root of @var{op} rounded according to @var{rnd}. +The returned value @var{rop} has a non-negative real part, and if its real +part is zero, a non-negative imaginary part. +@end deftypefun + +@deftypefun int mpc_pow (mpc_t @var{rop}, mpc_t @var{op1}, mpc_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_pow_d (mpc_t @var{rop}, mpc_t @var{op1}, double @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_pow_ld (mpc_t @var{rop}, mpc_t @var{op1}, long double @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_pow_si (mpc_t @var{rop}, mpc_t @var{op1}, long @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_pow_ui (mpc_t @var{rop}, mpc_t @var{op1}, unsigned long @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_pow_z (mpc_t @var{rop}, mpc_t @var{op1}, mpz_t @var{op2}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_pow_fr (mpc_t @var{rop}, mpc_t @var{op1}, mpfr_t @var{op2}, mpc_rnd_t @var{rnd}) +Set @var{rop} to @var{op1} raised to the power @var{op2}, rounded according +to @var{rnd}. +For @code{mpc_pow_d}, @code{mpc_pow_ld}, @code{mpc_pow_si}, @code{mpc_pow_ui}, +@code{mpc_pow_z} and @code{mpc_pow_fr}, +the imaginary part of @var{op2} is considered as +0. +When both @var{op1} and @var{op2} are zero, the result has real part 1, +and imaginary part 0, with sign being the opposite of that of @var{op2}. +@end deftypefun + +@deftypefun int mpc_exp (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the exponential of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_log (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_log10 (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the natural and base-10 logarithm of @var{op} respectively, +rounded according to @var{rnd} with the precision of @var{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 +@math{]-\pi , \pi]} and @math{]-\pi/log(10) , \pi/log(10)]} respectively. +@end deftypefun + + +@node Trigonometric Functions +@section Trigonometric Functions +@cindex Trigonometric functions + +@deftypefun int mpc_sin (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the sine of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_cos (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the cosine of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_sin_cos (mpc_t @var{rop_sin}, mpc_t @var{rop_cos}, mpc_t @var{op}, mpc_rnd_t @var{rnd_sin}, mpc_rnd_t @var{rnd_cos}) +Set @var{rop_sin} to the sine of @var{op}, +rounded according to @var{rnd_sin} with the precision of @var{rop_sin}, +and @var{rop_cos} to the cosine of @var{op}, +rounded according to @var{rnd_cos} with the precision of @var{rop_cos}. +@end deftypefun + +@deftypefun int mpc_tan (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the tangent of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_sinh (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the hyperbolic sine of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_cosh (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the hyperbolic cosine of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_tanh (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the hyperbolic tangent of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_asin (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_acos (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_atan (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the inverse sine, inverse cosine, inverse tangent of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +@end deftypefun + +@deftypefun int mpc_asinh (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_acosh (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +@deftypefunx int mpc_atanh (mpc_t @var{rop}, mpc_t @var{op}, mpc_rnd_t @var{rnd}) +Set @var{rop} to the inverse hyperbolic sine, inverse hyperbolic cosine, +inverse hyperbolic tangent of @var{op}, +rounded according to @var{rnd} with the precision of @var{rop}. +The branch cut of @var{mpc_acosh} is @math{(-\infty, 1)}. +@end deftypefun + +@node Miscellaneous Complex Functions +@section Miscellaneous Functions +@cindex Miscellaneous complex functions + +@deftypefun int mpc_urandom (mpc_t @var{rop}, gmp_randstate_t @var{state}) +Generate a uniformly distributed random complex in the unit square @math{[0, +1] @times [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 @code{gmp_randstate_t} +structure which should be created using the GMP @code{rand_init} function, see +the GMP manual. +@end deftypefun + +@deftypefun {const char *} mpc_get_version (void) +Return the GNU MPC version, as a null-terminated string. +@end deftypefun + +@defmac MPC_VERSION +@defmacx MPC_VERSION_MAJOR +@defmacx MPC_VERSION_MINOR +@defmacx MPC_VERSION_PATCHLEVEL +@defmacx MPC_VERSION_STRING +@code{MPC_VERSION} is the version of GNU MPC as a preprocessing constant. +@code{MPC_VERSION_MAJOR}, @code{MPC_VERSION_MINOR} and +@code{MPC_VERSION_PATCHLEVEL} are respectively the major, minor and +patch level of GNU MPC version, as preprocessing constants. +@code{MPC_VERSION_STRING} is the version as a string constant, which +can be compared to the result of @code{mpc_get_version} to check at +run time the header file and library used match: +@example +if (strcmp (mpc_get_version (), MPC_VERSION_STRING)) + fprintf (stderr, "Warning: header and library do not match\n"); +@end example +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). +@end defmac + +@deftypefn Macro long MPC_VERSION_NUM (@var{major}, @var{minor}, @var{patchlevel}) +Create an integer in the same format as used by @code{MPC_VERSION} from the +given @var{major}, @var{minor} and @var{patchlevel}. +Here is an example of how to check the GNU MPC version at compile time: +@example +#if (!defined(MPC_VERSION) || (MPC_VERSION<MPC_VERSION_NUM(2,1,0))) +# error "Wrong GNU MPC version." +#endif +@end example +@end deftypefn + +@node Advanced Functions +@section Advanced Functions + +@defmac MPC_SET_X_Y (@var{real_suffix}, @var{imag_suffix}, @var{rop}, @var{real}, @var{imag}, @var{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 @var{real_suffix} and @var{imag_suffix} parameters are the +types of the real and imaginary part, that is, the @code{x} in the +@code{mpfr_set_x} function one would use to set the part; +for the mpfr type, use @code{fr}. +@var{real} (respectively @var{imag}) is the value you want to assign to the +real (resp. imaginary) part, its type must conform to @var{real_suffix} +(resp. @var{imag_suffix}). +@var{rnd} is the @code{mpc_rnd_t} rounding mode. +The return value is the usual inexact value (@pxref{return-value,, Return +Value}). + +For instance, you can define mpc_set_ui_fr as follows: +@example +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); +@end example +@end defmac + + +@node Internals +@section 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 @code{mpc-impl.h} to use them. + +The macro @code{MPC_MAX_PREC(z)} gives the maximum of the precisions +of the real and imaginary parts of a complex number. + + +@node References +@unnumbered References + +@itemize @bullet + +@item +Torbj@"orn Granlund et al. +@code{gmp} -- GNU multiprecision library. +Version 4.2.4, @url{http://gmplib.org/}. + +@item +Guillaume Hanrot, Vincent Lef@`evre, Patrick P@'elissier, Paul Zimmermann et al. +@code{mpfr} -- A library for multiple-precision floating-point computations with exact rounding. +Version 2.4.1, @url{http://www.mpfr.org}. + +@item +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. + +@item +Donald E. Knuth, "The Art of Computer Programming", vol 2, +"Seminumerical Algorithms", 2nd edition, Addison-Wesley, 1981. + +@item +ISO/IEC 9899:1999, Programming languages — C. + +@end itemize + +@node Concept Index +@unnumbered Concept Index +@printindex cp + +@node Function Index +@unnumbered Function Index +@printindex fn + +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include fdl-1.3.texi + +@ifnothtml +@contents +@end ifnothtml + +@bye |