| This is mpc.info, produced by makeinfo version 7.0 from mpc.texi. |
|
|
| This manual is for GNU MPC, a library for multiple precision complex |
| arithmetic, version 1.3.1 of December 2022. |
|
|
| Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, |
| 2011, 2012, 2013, 2016, 2018, 2020, 2022 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.3.1 |
|
|
| * 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. |
| * Ball Arithmetic:: Types and functions for complex balls. |
| * References:: |
| * Concept Index:: |
| * Function Index:: |
| * Type 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 5.0.0 or |
| higher) and GNU MPFR (version 4.1.0 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 |
| <https://sympa.inria.fr/sympa/arc/mpc-discuss/2011-02/msg00024.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.3.1.tar.gz’ |
|
|
| 2. ‘cd mpc-1.3.1’ |
|
|
| 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@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@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@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 |
| |
|
|
| 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 initialise |
| 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 initialised once, or at least cleared out |
| between each initialization. After a variable has been initialised, it |
| may be assigned to any number of times. |
|
|
| For efficiency reasons, avoid to initialise and clear out a variable |
| in loops. Instead, initialise 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 reinitialise 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), ‘A’ (away from zero, that is, |
| towards plus or minus infinity depending on the sign of the number to be |
| rounded). 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: Ball Arithmetic, 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:: |
| * Modular 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 initialised 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) |
| Initialise Z to precision PREC bits and set its real and imaginary |
| parts to NaN. Normally, a variable should be initialised 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) |
| Initialise 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 initialise 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 (const 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, |
| const 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 initialised 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, const 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, const mpz_t OP mpc_rnd_t RND) |
| -- Function: int mpc_set_q (mpc_t ROP, const mpq_t OP mpc_rnd_t RND) |
| -- Function: int mpc_set_f (mpc_t ROP, const mpf_t OP mpc_rnd_t RND) |
| -- Function: int mpc_set_fr (mpc_t ROP, const 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, const mpz_t OP1, const mpz_t |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_set_q_q (mpc_t ROP, const mpq_t OP1, const mpq_t |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_set_f_f (mpc_t ROP, const mpf_t OP1, const mpf_t |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_set_fr_fr (mpc_t ROP, const mpfr_t OP1, const |
| 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 (const 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, const 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 becomes 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, const 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 (const mpc_t OP1, const mpc_t OP2) |
| -- Function: int mpc_cmp_si_si (const 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’. |
|
|
| -- Function: int mpc_cmp_abs (const mpc_t OP1, const mpc_t OP2) |
|
|
| Compare the absolute values of OP1 and OP2. The return value is 0 |
| if both are the same (including infinity), positive if the absolute |
| value of OP1 is greater than that of OP2, and negative if it is |
| smaller. If OP1 or OP2 has a real or imaginary part which is NaN, |
| the function behaves like ‘mpfr_cmp’ on two real numbers of which |
| at least one is NaN. |
|
|
| |
| 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, const 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, const 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, const 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, const 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. |
|
|
| For functions taking as input an integer argument (for example |
| ‘mpc_add_ui’), when this argument is zero, it is considered as an |
| unsigned (that is, exact in this context) zero, and we follow the MPFR |
| conventions: (0) + (+0) = +0, (0) - (+0) = -0, (0) - (+0) = -0, (0) - |
| (-0) = +0. The same applies for functions taking an argument of type |
| ‘mpfr_t’, such as ‘mpc_add_fr’, of which the imaginary part is |
| considered to be an exact, unsigned zero. |
|
|
| -- Function: int mpc_add (mpc_t ROP, const mpc_t OP1, const mpc_t OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_add_ui (mpc_t ROP, const mpc_t OP1, unsigned long |
| int OP2, mpc_rnd_t RND) |
| -- Function: int mpc_add_fr (mpc_t ROP, const mpc_t OP1, const mpfr_t |
| OP2, mpc_rnd_t RND) |
| Set ROP to OP1 + OP2 rounded according to RND. |
|
|
| -- Function: int mpc_sub (mpc_t ROP, const mpc_t OP1, const mpc_t OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_sub_fr (mpc_t ROP, const mpc_t OP1, const mpfr_t |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_fr_sub (mpc_t ROP, const mpfr_t OP1, const mpc_t |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_sub_ui (mpc_t ROP, const mpc_t OP1, unsigned long |
| int OP2, mpc_rnd_t RND) |
| -- Macro: int mpc_ui_sub (mpc_t ROP, unsigned long int OP1, const 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, const 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_sum (mpc_t ROP, const mpc_ptr* OP, unsigned long |
| N, mpc_rnd_t RND) |
| Set ROP to the sum of the elements in the array OP of length N, |
| rounded according to RND. |
|
|
| -- Function: int mpc_mul (mpc_t ROP, const mpc_t OP1, const mpc_t OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_mul_ui (mpc_t ROP, const mpc_t OP1, unsigned long |
| int OP2, mpc_rnd_t RND) |
| -- Function: int mpc_mul_si (mpc_t ROP, const mpc_t OP1, long int OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_mul_fr (mpc_t ROP, const mpc_t OP1, const 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, const 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, const 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, const mpc_t OP1, const mpc_t OP2, |
| const 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_dot (mpc_t ROP, const mpc_ptr* OP1, mpc_ptr* OP2, |
| unsigned long N, mpc_rnd_t RND) |
| Set ROP to the dot product of the elements in the arrays OP1 and |
| OP2, both of length N, rounded according to RND. |
|
|
| -- Function: int mpc_div (mpc_t ROP, const mpc_t OP1, const mpc_t OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_div_ui (mpc_t ROP, const mpc_t OP1, unsigned long |
| int OP2, mpc_rnd_t RND) |
| -- Function: int mpc_div_fr (mpc_t ROP, const mpc_t OP1, const mpfr_t |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_ui_div (mpc_t ROP, unsigned long int OP1, const |
| mpc_t OP2, mpc_rnd_t RND) |
| -- Function: int mpc_fr_div (mpc_t ROP, const mpfr_t OP1, const mpc_t |
| OP2, mpc_rnd_t RND) |
| Set ROP to OP1/OP2 rounded according to RND. |
|
|
| -- Function: int mpc_conj (mpc_t ROP, const 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, const 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, const 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, const mpc_t OP1, unsigned long |
| int OP2, mpc_rnd_t RND) |
| -- Function: int mpc_mul_2si (mpc_t ROP, const 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, const mpc_t OP1, unsigned long |
| int OP2, mpc_rnd_t RND) |
| -- Function: int mpc_div_2si (mpc_t ROP, const 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, const 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, const mpc_t OP1, const mpc_t OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_pow_d (mpc_t ROP, const mpc_t OP1, double OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_pow_ld (mpc_t ROP, const mpc_t OP1, long double |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_pow_si (mpc_t ROP, const mpc_t OP1, long OP2, |
| mpc_rnd_t RND) |
| -- Function: int mpc_pow_ui (mpc_t ROP, const mpc_t OP1, unsigned long |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_pow_z (mpc_t ROP, const mpc_t OP1, const mpz_t |
| OP2, mpc_rnd_t RND) |
| -- Function: int mpc_pow_fr (mpc_t ROP, const mpc_t OP1, const 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, const 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, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_log10 (mpc_t ROP, const 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. |
|
|
| -- Function: int mpc_rootofunity (mpc_t ROP, unsigned long int N, |
| unsigned long int K, mpc_rnd_t RND) |
| Set ROP to the standard primitive N-th root of unity raised to the |
| power K, that is, exp (2 Pi i k / n), rounded according to RND with |
| the precision of ROP. |
|
|
| -- Function: int mpc_agm (mpc_t ROP, const mpc_t A, const mpc_t B, |
| mpc_rnd_t RND) |
| Set ROP to the arithmetic-geometric mean (AGM) of A and B, rounded |
| according to RND with the precision of ROP. Concerning the branch |
| cut, the function is computed by homogeneity either as A AGM(1,b0) |
| with b0=B/A if |A|>=|B|, or as B AGM(1,b0) with b0=A/B otherwise; |
| then when b0 is real and negative, AGM(1,b0) is chosen to have |
| positive imaginary part. |
|
|
| |
| File: mpc.info, Node: Trigonometric Functions, Next: Modular Functions, Prev: Power Functions and Logarithm, Up: Complex Functions |
|
|
| 5.9 Trigonometric Functions |
| =========================== |
|
|
| -- Function: int mpc_sin (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_cos (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_tan (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| Set ROP to the sine, cosine, tangent of OP, rounded according to |
| RND with the precision of ROP. |
|
|
| -- Function: int mpc_sin_cos (mpc_t ROP_SIN, mpc_t ROP_COS, const 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_sinh (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_cosh (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_tanh (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| Set ROP to the hyperbolic sine, hyperbolic cosine, hyperbolic |
| tangent of OP, rounded according to RND with the precision of ROP. |
|
|
| -- Function: int mpc_asin (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_acos (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_atan (mpc_t ROP, const 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, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_acosh (mpc_t ROP, const mpc_t OP, mpc_rnd_t RND) |
| -- Function: int mpc_atanh (mpc_t ROP, const 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 (-Inf, 1) |
|
|
| |
| File: mpc.info, Node: Modular Functions, Next: Miscellaneous Complex Functions, Prev: Trigonometric Functions, Up: Complex Functions |
|
|
| 5.10 Modular Functions |
| ====================== |
|
|
| The following function is experimental, not least because it depends on |
| the equally experimental ball arithmetic, see *note Ball Arithmetic::. |
| So its prototype may change in future releases, and it may be removed |
| altogether. |
|
|
| -- Function: int mpc_eta_fund (mpc_t ROP, const mpc_t OP, mpc_rnd_t |
| RND) |
| Assuming that the argument OP lies in the fundamental domain for |
| Sl_2(Z), that is, it has real part not below -1/2 and not above |
| +1/2 and absolute value at least 1, return the value of the |
| Dedekind eta-function in ROP. For arguments outside the |
| fundamental domain the function is expected to loop indefinitely. |
|
|
| |
| File: mpc.info, Node: Miscellaneous Complex Functions, Next: Advanced Functions, Prev: Modular Functions, Up: Complex Functions |
|
|
| 5.11 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: |
| |
| |
| |
|
|
| |
| File: mpc.info, Node: Advanced Functions, Next: Internals, Prev: Miscellaneous Complex Functions, Up: Complex Functions |
|
|
| 5.12 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, unsigned long int re, mpfr_t 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.13 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: Ball Arithmetic, Next: References, Prev: Complex Functions, Up: Top |
|
|
| 6 Ball Arithmetic |
| ***************** |
|
|
| Since release 1.3.0, GNU MPC contains a simple and very limited |
| implementation of complex balls (or rather, circles). This part is |
| experimental, its interface may vary and it may be removed completely in |
| future releases. |
|
|
| A complex ball of the new type ‘mpcb_t’ is defined by a non-zero |
| centre c of the type ‘mpc_t’ and a relative radius r of the new type |
| ‘mpcr_t’, and it represents all complex numbers z = c (1 + ϑ) with |ϑ| ≤ |
| r, or equivalently the closed circle with centre c and radius r |c|. |
| The approach of using a relative error (or radius) instead of an |
| absolute one simplifies error analyses for multiplicative operations |
| (multiplication, division, square roots, and the AGM), at the expense of |
| making them more complicated for additive operations. It has the major |
| drawback of not being able to represent balls centred at 0; in floating |
| point arithmetic, however, 0 is never reached by rounding, but only |
| through operations with exact result, which could be handled at a |
| higher, application level. For more discussion on these issues, see the |
| file ‘algorithms.tex’. |
|
|
| 6.1 Radius type and functions |
| ============================= |
|
|
| The radius type is defined by |
| struct { |
| int64_t mant; |
| int64_t exp; |
| } |
| with the usual trick in the GNU multiprecision libraries of defining |
| the main type ‘mpcr_t’ as a 1-dimensional array of this struct, and |
| variable and constant pointers ‘mpcr_ptr’ and ‘mpcr_srcptr’. It can |
| contain the special values infinity or zero, or floating point numbers |
| encoded as m⋅2^{e} for a positive mantissa m and an arbitrary (usually |
| negative) exponent e. Normalised finite radii use 31 bits for the |
| mantissa, that is, 2^{30}≤m≤2^{31} - 1. The special values infinity and |
| 0 are encoded through the sign of m, but should be tested for and set |
| using dedicated functions. |
|
|
| Unless indicated otherwise, the following functions assume radius |
| arguments to be normalised, they return normalised results, and they |
| round their results up, not necessarily to the smallest representable |
| number, although reasonable effort is made to get a tight upper bound: |
| They only guarantee that their outputs are an upper bound on the true |
| results. (There may be a trade-off between tightness of the result and |
| speed of computation. For instance, when a 32-bit mantissa is |
| normalised, an even mantissa should be divided by 2, an odd mantissa |
| should be divided by 2 and 1 should be added, and then in both cases the |
| exponent must be increased by 1. It might be more efficient to add 1 |
| all the time instead of testing the last bit of the mantissa.) |
|
|
| -- Function: int mpcr_inf_p (mpcr_srcptr R) |
| -- Function: int mpcr_zero_p (mpcr_srcptr R) |
| Test whether R is infinity or zero, respectively, and return a |
| boolean. |
|
|
| -- Function: int mpcr_lt_half_p (mpcr_srcptr R) |
| Return ‘true’ if R<1/2, and ‘false’ otherwise. (Everywhere in this |
| document, ‘true’ means any non-zero value, and ‘false’ means zero.) |
|
|
| -- Function: int mpcr_cmp (mpcr_srcptr R, mpcr_srcptr S) |
| Return +1, 0 or -1 depending on whether R is larger than, equal to |
| or less than S, with the natural total order on the compactified |
| non-negative real axis letting 0 be smaller and letting infinity be |
| larger than any finite real number. |
|
|
| -- Function: void mpcr_set_inf (mpcr_ptr R) |
| -- Function: void mpcr_set_zero (mpcr_ptr R) |
| -- Function: void mpcr_set_one (mpcr_ptr R) |
| -- Function: void mpcr_set (mpcr_ptr R, mpcr_srcptr S) |
| -- Function: void mpcr_set_ui64_2si64 (mpcr_ptr R, uint64_t MANT, |
| int64_t EXP) |
| Set R to infinity, zero, 1, S or MANT⋅2^{EXP}, respectively. |
|
|
| -- Function: void mpcr_max (mpcr_ptr R, mpcr_srcptr S, mpcr_srcptr T) |
| Set R to the maximum of S and T. |
|
|
| -- Function: int64_t mpcr_get_exp (mpcr_srcptr R) |
| Assuming that R is neither infinity nor 0, return its exponent e |
| when writing r = m⋅2^{e} with 1/2 ≤ m < 1. (Notice that this is |
| _not_ the same as the field ‘exp’ in the struct representing a |
| radius, but that instead it is independent of the implementation.) |
| Otherwise the behaviour is undefined. |
|
|
| -- Function: void mpcr_out_str (FILE *F, mpcr_srcptr R) |
| Output R on F, which may be ‘stdout’. Caveat: This function so far |
| serves mainly for debugging purposes, its behaviour will probably |
| change in the future. |
|
|
| -- Function: void mpcr_add (mpcr_ptr R, mpcr_srcptr S, mpcr_srcptr T) |
| -- Function: void mpcr_sub (mpcr_ptr R, mpcr_srcptr S, mpcr_srcptr T) |
| -- Function: void mpcr_mul (mpcr_ptr R, mpcr_srcptr S, mpcr_srcptr T) |
| -- Function: void mpcr_div (mpcr_ptr R, mpcr_srcptr S, mpcr_srcptr T) |
| -- Function: void mpcr_mul_2ui (mpcr_ptr R, mpcr_srcptr S, unsigned |
| long int T) |
| -- Function: void mpcr_div_2ui (mpcr_ptr R, mpcr_srcptr S, unsigned |
| long int T) |
| -- Function: void mpcr_sqr (mpcr_ptr R, mpcr_srcptr S) |
| -- Function: void mpcr_sqrt (mpcr_ptr R, mpcr_srcptr S) |
| Set R to the sum, difference, product or quotient of S and T, or to |
| the product of S by 2^{T} or to the quotient of S by 2^{T}, or to |
| the square or the square root of S. If any of the arguments is |
| infinity, or if a difference is negative, the result is infinity. |
|
|
| -- Function: void mpcr_sub_rnd (mpcr_ptr R, mpcr_srcptr S, mpcr_srcptr |
| T, mpfr_rnd_t RND) |
| Set R to the difference of S and T, rounded into direction RND, |
| which can be one of ‘MPFR_RNDU’ or ‘MPFR_RNDD’. If one of the |
| arguments is infinity or the difference is negative, the result is |
| infinity. Calling the function with ‘MPFR_RNDU’ is equivalent to |
| calling ‘mpcr_sub’. |
|
|
| This is one out of several functions taking a rounding parameter. |
| Rounding down may be useful to obtain an upper bound when dividing |
| by the result. |
|
|
| -- Function: void mpcr_c_abs_rnd (mpcr_ptr R, mpc_srcptr Z, mpfr_rnd_t |
| RND) |
| Set R to the absolute value of the complex number Z, rounded in |
| direction RND, which may be one of ‘MPFR_RNDU’ or ‘MPFR_RNDD’. |
|
|
| -- Function: void mpcr_add_rounding_error (mpcr_ptr R, mpfr_prec_t P, |
| mpfr_rnd_t RND) |
| Set R to r + (1 + r) 2^{-p} if RND equals ‘MPFR_RNDN’, and to r + |
| (1 + r) 2^{1-p} otherwise. The idea is that if a (potentially not |
| representable) centre of an ideal complex ball of radius R is |
| rounded to a representable complex number at precision P, this |
| shifts the centre by up to 1/2 ulp (for rounding to nearest) or 1 |
| ulp (for directed rounding of at least one of the real or imaginary |
| parts), which increases the radius accordingly. So this function |
| is typically called internally at the end of each operation with |
| complex balls to account for the error made by rounding the centre. |
|
|
| 6.2 Ball type and functions |
| =========================== |
|
|
| The ball type is defined by |
| typedef struct { |
| mpc_t c; |
| mpcr_t r; |
| } |
| or, more precisely, ‘mpcb_t’ is again a 1-dimensional array of such a |
| struct, and variable and constant pointer types are defined as |
| ‘mpcb_ptr’ and ‘mpcb_srcptr’, respectively. As usual, the components |
| should only be accessed through corresponding functions. |
|
|
| To understand functions on balls, one needs to consider the balls |
| passed as arguments as sets of complex values, to which a mathematical |
| function is applied; the C function “rounds up” in the sense that it |
| returns a ball containing all possible values of the function in all the |
| possible input values. Reasonable effort is made to return small balls, |
| but again there is no guarantee that the result is the smallest possible |
| one. In the current implementation, the centre of a ball returned as a |
| value is obtained by applying the function to the centres of the balls |
| passed as arguments, and rounding. While this is a natural approach, it |
| is not the only possible one; however, it also simplifies the error |
| analysis as already carried out for functions with regular complex |
| arguments. Whenever the centre of a complex ball has a non-finite real |
| or imaginary part (positive or negative infinity or NaN) the radius is |
| set to infinity; this can be interpreted as the “useless ball”, |
| representing the whole complex plane, whatever the value of the centre |
| is. |
|
|
| Unlike for variables of ‘mpc_t’ type, where the precision needs to be |
| set explicitly at initialisation, variables of type ‘mpcb_t’ handle |
| their precision dynamically. Ball centres always have the same |
| precision for their real and their imaginary parts (again this is a |
| choice of the implementation; if they are of very different sizes, one |
| could theoretically reduce the precision of the part that is smaller in |
| absolute value, which is more strongly affected by the common error |
| coded in the radius). When setting a complex ball from a value of a |
| different type, an additional precision parameter is passed, which |
| determines the precision of the centre. Functions on complex balls set |
| the precision of their result depending on the input. In the current |
| implementation, this is the minimum of the argument precisions, so if |
| all balls are initially set to the same precision, this is preserved |
| throughout the computations. (Notice that the exponent of the radius |
| encodes roughly the number of correct binary digits of the ball centre; |
| so it would also make sense to reduce the precision if the radius |
| becomes larger.) |
|
|
| The following functions on complex balls are currently available; the |
| eclectic collection is motivated by the desire to provide an |
| implementation of the arithmetic-geometric mean of complex numbers |
| through the use of ball arithmetic. As for functions taking complex |
| arguments, there may be arbitrary overlaps between variables |
| representing arguments and results; for instance ‘mpcb_mul (z, z, z)’ is |
| an allowed way of replacing the ball Z by its square. |
|
|
| -- Function: void mpcb_init (mpcb_ptr Z) |
| -- Function: void mpcb_clear (mpcb_ptr Z) |
| Initialise or free memory for Z; ‘mpcb_init’ must be called once |
| before using a variable, and ‘mpcb_clear’ must be called once |
| before stopping to use a variable. Unlike its ‘mpc_t’ counterpart, |
| ‘mpcb_init’ does not fix the precision of Z, but it sets its radius |
| to infinity, so that Z represents the whole complex plane. |
|
|
| -- Function: mpfr_prec_t mpcb_get_prec (mpcb_srcptr Z) |
| Return the (common) precision of the real and the complex parts of |
| the centre of Z. |
|
|
| -- Function: void mpcb_set (mpcb_ptr Z, mpcb_srcptr Z1) |
| Set Z to Z1, preserving the precision of the centre. |
|
|
| -- Function: void mpcb_set_inf (mpcb_ptr Z) |
| Set Z to the whole complex plane. This is intended to be used much |
| in the spirit of an assertion: When a precondition is not satisfied |
| inside a function, it can set its result to this value, which will |
| propagate through further computations. |
|
|
| -- Function: void mpcb_set_c (mpcb_ptr Z, mpc_srcptr C, mpfr_prec_t |
| PREC, unsigned long int ERR_RE, unsigned long int ERR_IM) |
| Set Z to a ball with centre C at precision PREC. If PREC is at |
| least the maximum of the precisions of the real and the imaginary |
| parts of C and ERR_RE and ERR_IM are 0, then the resulting ball is |
| exact with radius zero. Using a larger value for PREC makes sense |
| if C is considered exact and a larger target precision for the |
| result is desired, or some leeway for the working precision is to |
| be taken into account. If PREC is less than the precision of C, |
| then usually some rounding error occurs when setting the centre, |
| which is taken into account in the radius. |
|
|
| If ERR_RE and ERR_IM are non-zero, the argument C is considered as |
| an inexact complex number, with a bound on the absolute error of |
| its real part given in ERR_RE as a multiple of 1/2 ulp of the real |
| part of C, and a bound on the absolute error of its imaginary part |
| given in ERR_IM as a multiple of 1/2 ulp of the imaginary part of |
| C. (Notice that if the parts of C have different precisions or |
| exponents, the absolute values of their ulp differ.) Then Z is |
| created as a ball with centre C and a radius taking these errors on |
| C as well as the potential additional rounding error for the centre |
| into account. If the real part of C is 0, then ERR_RE must be 0, |
| since ulp of 0 makes no sense; otherwise the radius is set to |
| infinity. The same remark holds for the imaginary part. |
|
|
| Using ERR_RE and ERR_IM different from 0 is particularly useful in |
| two settings: If C is itself the result of a call to an ‘mpc_’ |
| function with exact input and rounding mode ‘MPC_RNDNN’ of both |
| parts to nearest, then its parts are known with errors of at most |
| 1/2 ulp, and setting ERR_RE and ERR_IM to 1 yields a ball which is |
| known to contain the exact result (this motivates the strange unit |
| of 1/2 ulp); if directed rounding was used, ERR_RE and ERR_IM can |
| be set to 2 instead. |
|
|
| And if C is the result of a sequence of calls to ‘mpc_’ functions |
| for which some error analysis has been carried out (as is |
| frequently the case internally when implementing complex |
| functions), again the resulting ball Z is known to contain the |
| exact result when using appropriate values for ERR_RE and ERR_IM. |
|
|
| -- Function: void mpcb_set_ui_ui (mpcb_ptr Z, unsigned long int RE, |
| unsigned long int IM, mpfr_prec_t PREC) |
| Set Z to a ball with centre RE+I*IM at precision PREC or the size |
| of an ‘unsigned long int’, whatever is larger. |
|
|
| -- Function: void mpcb_neg (mpcb_ptr Z, mpcb_srcptr Z1) |
| -- Function: void mpcb_add (mpcb_ptr Z, mpcb_srcptr Z1, mpcb_srcptr Z2) |
| -- Function: void mpcb_mul (mpcb_ptr Z, mpcb_srcptr Z1, mpcb_srcptr Z2) |
| -- Function: void mpcb_sqr (mpcb_ptr Z, mpcb_srcptr Z1) |
| -- Function: void mpcb_pow_ui (mpcb_ptr Z, mpcb_srcptr Z1, unsigned |
| long int E) |
| -- Function: void mpcb_sqrt (mpcb_ptr Z, mpcb_srcptr Z1) |
| -- Function: void mpcb_div (mpcb_ptr Z, mpcb_srcptr Z1, mpcb_srcptr Z2) |
| -- Function: void mpcb_div_2ui (mpcb_ptr Z, mpcb_srcptr Z1, unsigned |
| long int E) |
| These are the exact counterparts of the corresponding functions |
| ‘mpc_neg’, ‘mpc_add’ and so on, but on complex balls instead of |
| complex numbers. |
|
|
| -- Function: int mpcb_can_round (mpcb_srcptr Z, mpfr_prec_t PREC_RE, |
| mpfr_prec_t PREC_IM, mpc_rnd_t RND) |
| If the function returns ‘true’ (a non-zero number), then rounding |
| any of the complex numbers in the ball to a complex number with |
| precision PREC_RE of its real and precision PREC_IM of its |
| imaginary part and rounding mode RND yields the same result and |
| rounding direction value, cf. *note return-value::. If the |
| function returns ‘false’ (that is, 0), then it could not conclude, |
| or there are two numbers in the ball which would be rounded to a |
| different complex number or in a different direction. Notice that |
| the function works in a best effort mode and errs on the side of |
| caution by potentially returning ‘false’ on a roundable ball; this |
| is consistent with computational functions not necessarily |
| returning the smallest enclosing ball. |
|
|
| If Z contains the result of evaluating some mathematical function |
| through a sequence of calls to ‘mpcb’ functions, starting with |
| exact complex numbers, that is, balls of radius 0, then a return |
| value of ‘true’ indicates that rounding any value in the ball (its |
| centre is readily available) in direction RND yields the correct |
| result of the function and the correct rounding direction value |
| with the usual MPC semantics. |
|
|
| Notice that when the precision of Z is larger than PREC_RE or |
| PREC_IM, the centre need not be representable at the desired |
| precision, and in fact the ball need not contain a representable |
| number at all to be “roundable”. Even worse, when RND is a |
| directed rounding mode for the real or the imaginary part and the |
| ball of non-zero radius contains a representable number, the return |
| value is necessarily ‘false’. Even worse, when the rounding mode |
| for one part is to nearest, the corresponding part of the centre of |
| the ball is representable and the ball has a non-zero radius, then |
| the return value is also necessarily ‘false’, since even if |
| rounding may be possible, the rounding direction value cannot be |
| determined. |
|
|
| -- Function: int mpcb_round (mpc_ptr C, mpcb_srcptr Z, mpc_rnd_t RND) |
| Set C to the centre of Z, rounded in direction RND, and return the |
| corresponding rounding direction value. If ‘mpcb_can_round’, |
| called with Z, the precisions of C and the rounding mode RND |
| returns ‘true’, then this function does what is expected, it |
| “correctly rounds the ball” and returns a rounding direction value |
| that is valid for all of the ball. As explained above, the result |
| is then not necessarily (in the presence of directed rounding with |
| radius different from 0, it is rather necessarily not) an element |
| of the ball. |
|
|
| |
| File: mpc.info, Node: References, Next: Concept Index, Prev: Ball Arithmetic, Up: Top |
|
|
| References |
| ********** |
|
|
| • Torbjörn Granlund et al. ‘GMP’ – GNU multiprecision library. |
| Version 6.2.0, <http://gmplib.org>. |
|
|
| • Guillaume Hanrot, Vincent Lefèvre, Patrick Pélissier, Paul |
| Zimmermann et al. ‘MPFR’ – A library for multiple-precision |
| floating-point computations with exact rounding. Version 4.1.0, |
| <http://www.mpfr.org>. |
|
|
| • IEEE Standard for Floating-Point Arithmetic, IEEE Computer Society, |
| IEEE Std 754-2019, Approved 13 June 2019, 84 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 |
| ************* |
|
|
| |