1800 lines
86 KiB
Plaintext
1800 lines
86 KiB
Plaintext
|
This is mpc.info, produced by makeinfo version 5.2 from mpc.texi.
|
|||
|
|
|||
|
This manual is for GNU MPC, a library for multiple precision complex
|
|||
|
arithmetic, version 1.0.3 of February 2015.
|
|||
|
|
|||
|
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.3
|
|||
|
|
|||
|
* 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.3.tar.gz'
|
|||
|
|
|||
|
2. 'cd mpc-1.0.3'
|
|||
|
|
|||
|
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
|
|||
|
*************
|
|||
|
|
|||
|
|