| This is mpfr.info, produced by makeinfo version 7.0.3 from mpfr.texi. |
|
|
| This manual documents how to install and use the Multiple Precision |
| Floating-Point Reliable Library, version 4.2.1. |
|
|
| Copyright 1991, 1993-2023 Free Software Foundation, Inc. |
|
|
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 or |
| any later version published by the Free Software Foundation; with no |
| Invariant Sections, with no Front-Cover Texts, and with no Back-Cover |
| Texts. A copy of the license is included in *note GNU Free |
| Documentation License::. |
| INFO-DIR-SECTION Software libraries |
| START-INFO-DIR-ENTRY |
| |
| END-INFO-DIR-ENTRY |
|
|
| |
| File: mpfr.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) |
|
|
| GNU MPFR |
| |
|
|
| This manual documents how to install and use the Multiple Precision |
| Floating-Point Reliable Library, version 4.2.1. |
|
|
| Copyright 1991, 1993-2023 Free Software Foundation, Inc. |
|
|
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 or |
| any later version published by the Free Software Foundation; with no |
| Invariant Sections, with no Front-Cover Texts, and with no Back-Cover |
| Texts. A copy of the license is included in *note GNU Free |
| Documentation License::. |
|
|
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| File: mpfr.info, Node: Copying, Next: Introduction to MPFR, Prev: Top, Up: Top |
|
|
| MPFR Copying Conditions |
| |
|
|
| The GNU MPFR library (or MPFR for short) is “free”; this means that |
| everyone is free to use it and free to redistribute it on a free basis. |
| The library is not in the public domain; it is copyrighted and there are |
| restrictions on its distribution, but these restrictions are designed to |
| permit everything that a good cooperating citizen would want to do. |
| What is not allowed is to try to prevent others from further sharing any |
| version of this library that they might get from you. |
|
|
| Specifically, we want to make sure that you have the right to give |
| away copies of the library, that you receive source code or else can get |
| it if you want it, that you can change this library or use pieces of it |
| in new free programs, and that you know you can do these things. |
|
|
| To make sure that everyone has such rights, we have to forbid you to |
| deprive anyone else of these rights. For example, if you distribute |
| copies of the GNU MPFR library, you must give the recipients all the |
| rights that you have. You must make sure that they, too, receive or can |
| get the source code. And you must tell them their rights. |
|
|
| Also, for our own protection, we must make certain that everyone |
| finds out that there is no warranty for the GNU MPFR library. If it is |
| modified by someone else and passed on, we want their recipients to know |
| that what they have is not what we distributed, so that any problems |
| introduced by others will not reflect on our reputation. |
|
|
| The precise conditions of the license for the GNU MPFR library are |
| found in the Lesser General Public License that accompanies the source |
| code. See the file COPYING.LESSER.. |
|
|
| |
| File: mpfr.info, Node: Introduction to MPFR, Next: Installing MPFR, Prev: Copying, Up: Top |
|
|
| 1 Introduction to MPFR |
| |
|
|
| MPFR is a portable library written in C for arbitrary precision |
| arithmetic on floating-point numbers. It is based on the GNU MP |
| library. It aims to provide a class of floating-point numbers with |
| precise semantics. The main characteristics of MPFR, which make it |
| differ from most arbitrary precision floating-point software tools, are: |
|
|
| • the MPFR code is portable, i.e., the result of any operation does |
| not depend on the machine word size ‘mp_bits_per_limb’ (64 on most |
| current processors), possibly except in faithful rounding. It does |
| not depend either on the machine rounding mode or rounding |
| precision; |
|
|
| • the precision in bits can be set _exactly_ to any valid value for |
| each variable (including very small precision); |
|
|
| • MPFR provides the four rounding modes from the IEEE 754-1985 |
| standard, plus away-from-zero, as well as for basic operations as |
| for other mathematical functions. Faithful rounding (partially |
| supported) is provided too, but the results may no longer be |
| reproducible. |
|
|
| In particular, MPFR follows the specification of the IEEE 754 |
| standard, currently IEEE 754-2019 (which will be referred to as IEEE 754 |
| in this manual), with some minor differences, such as: there is a single |
| NaN, the default exponent range is much wider, and subnormal numbers are |
| not implemented (but the exponent range can be reduced to any interval, |
| and subnormals can be emulated). For instance, computations in the |
| binary64 format (a.k.a. double precision) can be reproduced by using a |
| precision of 53 bits. |
|
|
| This version of MPFR is released under the GNU Lesser General Public |
| License, version 3 or any later version. It is permitted to link MPFR |
| to most non-free programs, as long as when distributing them the MPFR |
| source code and a means to re-link with a modified MPFR library is |
| provided. |
|
|
| 1.1 How to Use This Manual |
| ========================== |
|
|
| Everyone should read *note MPFR Basics::. If you need to install the |
| library yourself, you need to read *note Installing MPFR::, too. To use |
| the library you will need to refer to *note MPFR Interface::. |
|
|
| The rest of the manual can be used for later reference, although it |
| is probably a good idea to glance through it. |
|
|
| |
| File: mpfr.info, Node: Installing MPFR, Next: Reporting Bugs, Prev: Introduction to MPFR, Up: Top |
|
|
| 2 Installing MPFR |
| |
|
|
| The MPFR library is already installed on some GNU/Linux distributions, |
| but the development files necessary to the compilation such as ‘mpfr.h’ |
| are not always present. To check that MPFR is fully installed on your |
| computer, you can check the presence of the file ‘mpfr.h’ in |
| ‘/usr/include’, or try to compile a small program having ‘#include |
| <mpfr.h>’ (since ‘mpfr.h’ may be installed somewhere else). For |
| instance, you can try to compile: |
|
|
| #include <stdio.h> |
| #include <mpfr.h> |
| int main (void) |
| { |
| printf ("MPFR library: %-12s\nMPFR header: %s (based on %d.%d.%d)\n", |
| mpfr_get_version (), MPFR_VERSION_STRING, MPFR_VERSION_MAJOR, |
| MPFR_VERSION_MINOR, MPFR_VERSION_PATCHLEVEL); |
| return 0; |
| } |
|
|
| with |
|
|
| cc -o version version.c -lmpfr -lgmp |
|
|
| and if you get errors whose first line looks like |
|
|
| version.c:2:19: error: mpfr.h: No such file or directory |
|
|
| then MPFR is probably not installed. Running this program will give you |
| the MPFR version. |
|
|
| If MPFR is not installed on your computer, or if you want to install |
| a different version, please follow the steps below. |
|
|
| 2.1 How to Install |
| ================== |
|
|
| Here are the steps needed to install the library on Unix systems (more |
| details are provided in the ‘INSTALL’ file): |
|
|
| 1. To build MPFR, you first have to install GNU MP (version 5.0.0 or |
| higher) on your computer. You need a C compiler, preferably GCC, |
| but any reasonable compiler should work (C++ compilers should work |
| too, under the condition that they do not break type punning via |
| union). And you need the standard Unix ‘make’ command, plus some |
| other standard Unix utility commands. |
|
|
| Then, in the MPFR build directory, type the following commands. |
|
|
| 2. ‘./configure’ |
|
|
| This will prepare the build and set up the options according to |
| your system. You can give options to specify the install |
| directories (instead of the default ‘/usr/local’), threading |
| support, and so on. See the ‘INSTALL’ file and/or the output of |
| ‘./configure --help’ for more information, in particular if you get |
| error messages. |
|
|
| 3. ‘make’ |
|
|
| This will compile MPFR, and create a library archive file |
| ‘libmpfr.a’. On most platforms, a dynamic library will be produced |
| too. |
|
|
| 4. ‘make check’ |
|
|
| This will make sure that MPFR was built correctly. If any test |
| fails, information about this failure can be found in the |
| ‘tests/test-suite.log’ file. If you want the contents of this file |
| to be automatically output in case of failure, you can set the |
| ‘VERBOSE’ environment variable to 1 before running ‘make check’, |
| for instance by typing: |
|
|
| ‘VERBOSE=1 make check’ |
|
|
| In case of failure, you may want to check whether the problem is |
| already known. If not, please report this failure to the MPFR |
| mailing-list ‘mpfr@inria.fr’. For details, see *note Reporting |
| Bugs::. |
|
|
| 5. ‘make install’ |
|
|
| This will copy the files ‘mpfr.h’ and ‘mpf2mpfr.h’ to the directory |
| ‘/usr/local/include’, the library files (‘libmpfr.a’ and possibly |
| others) to the directory ‘/usr/local/lib’, the file ‘mpfr.info’ to |
| the directory ‘/usr/local/share/info’, and some other documentation |
| files to the directory ‘/usr/local/share/doc/mpfr’ (or if you |
| passed the ‘--prefix’ option to ‘configure’, using the prefix |
| directory given as argument to ‘--prefix’ instead of ‘/usr/local’). |
|
|
| 2.2 Other ‘make’ Targets |
| ======================== |
|
|
| There are some other useful make targets: |
|
|
| • ‘mpfr.info’ or ‘info’ |
|
|
| Create or update an info version of the manual, in ‘mpfr.info’. |
|
|
| This file is already provided in the MPFR archives. |
|
|
| • ‘mpfr.pdf’ or ‘pdf’ |
|
|
| Create a PDF version of the manual, in ‘mpfr.pdf’. |
|
|
| • ‘mpfr.dvi’ or ‘dvi’ |
|
|
| Create a DVI version of the manual, in ‘mpfr.dvi’. |
|
|
| • ‘mpfr.ps’ or ‘ps’ |
|
|
| Create a PostScript version of the manual, in ‘mpfr.ps’. |
|
|
| • ‘mpfr.html’ or ‘html’ |
|
|
| Create a HTML version of the manual, in several pages in the |
| directory ‘doc/mpfr.html’; if you want only one output HTML file, |
| then type ‘makeinfo --html --no-split mpfr.texi’ from the ‘doc’ |
| directory instead. |
|
|
| • ‘clean’ |
|
|
| Delete all object files and archive files, but not the |
| configuration files. |
|
|
| • ‘distclean’ |
|
|
| Delete all generated files not included in the distribution. |
|
|
| • ‘uninstall’ |
|
|
| Delete all files copied by ‘make install’. |
|
|
| 2.3 Build Problems |
| ================== |
|
|
| In case of problem, please read the ‘INSTALL’ file carefully before |
| reporting a bug, in particular section “In case of problem”. Some |
| problems are due to bad configuration on the user side (not specific to |
| MPFR). Problems are also mentioned in the FAQ |
| <https: |
|
|
| Please report problems to the MPFR mailing-list ‘mpfr@inria.fr’. |
| |
| web page <https: |
|
|
| 2.4 Getting the Latest Version of MPFR |
| ====================================== |
|
|
| The latest version of MPFR is available from |
| <https: |
|
|
| |
| File: mpfr.info, Node: Reporting Bugs, Next: MPFR Basics, Prev: Installing MPFR, Up: Top |
|
|
| 3 Reporting Bugs |
| |
|
|
| If you think you have found a bug in the MPFR library, first have a look |
| on the MPFR 4.2.1 web page <https: |
| FAQ <https: |
| in which case you may find there a workaround for it. You might also |
| look in the archives of the MPFR mailing-list: |
| <https: |
| 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, i.e., a small self-content program, using no other |
| library than MPFR. 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 you get are incorrect and in that case, in what way. |
|
|
| Please include compiler version information in your bug report. This |
| can be extracted using ‘cc -V’ on some machines, or, if you are using |
| GCC, ‘gcc -v’. Also, include the output from ‘uname -a’ and the MPFR |
| version (the GMP version may be useful too). If you get a failure while |
| running ‘make’ or ‘make check’, please include the ‘config.log’ file in |
| your bug report, and in case of test failure, the ‘tests/test-suite.log’ |
| file too. |
|
|
| 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 the MPFR mailing-list ‘mpfr@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: mpfr.info, Node: MPFR Basics, Next: MPFR Interface, Prev: Reporting Bugs, Up: Top |
|
|
| 4 MPFR Basics |
| |
|
|
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| File: mpfr.info, Node: Headers and Libraries, Next: Nomenclature and Types, Prev: MPFR Basics, Up: MPFR Basics |
|
|
| 4.1 Headers and Libraries |
| ========================= |
|
|
| All declarations needed to use MPFR are collected in the include file |
| ‘mpfr.h’. It is designed to work with both C and C++ compilers. You |
| should include that file in any program using the MPFR library: |
|
|
| #include <mpfr.h> |
|
|
| Note, however, that prototypes for MPFR functions with ‘FILE *’ |
| parameters are provided only if ‘<stdio.h>’ is included too (before |
| ‘mpfr.h’): |
|
|
| #include <stdio.h> |
| #include <mpfr.h> |
|
|
| Likewise ‘<stdarg.h>’ (or ‘<varargs.h>’) is required for prototypes |
| with ‘va_list’ parameters, such as ‘mpfr_vprintf’. |
|
|
| And for any functions using ‘intmax_t’, you must include ‘<stdint.h>’ |
| or ‘<inttypes.h>’ before ‘mpfr.h’, to allow ‘mpfr.h’ to define |
| prototypes for these functions. Moreover, under some platforms (in |
| particular with C++ compilers), users may need to define |
| ‘MPFR_USE_INTMAX_T’ (and should do it for portability) before ‘mpfr.h’ |
| has been included; of course, it is possible to do that on the command |
| line, e.g., with ‘-DMPFR_USE_INTMAX_T’. |
|
|
| Note: If ‘mpfr.h’ and/or ‘gmp.h’ (used by ‘mpfr.h’) are included |
| several times (possibly from another header file), ‘<stdio.h>’ and/or |
| ‘<stdarg.h>’ (or ‘<varargs.h>’) should be included *before the first |
| inclusion* of ‘mpfr.h’ or ‘gmp.h’. Alternatively, you can define |
| ‘MPFR_USE_FILE’ (for MPFR I/O functions) and/or ‘MPFR_USE_VA_LIST’ (for |
| MPFR functions with ‘va_list’ parameters) anywhere before the last |
| inclusion of ‘mpfr.h’. As a consequence, if your file is a public |
| header that includes ‘mpfr.h’, you need to use the latter method. |
|
|
| When calling a MPFR macro, it is not allowed to have previously |
| defined a macro with the same name as some keywords (currently ‘do’, |
| ‘while’ and ‘sizeof’). |
|
|
| You can avoid the use of MPFR macros encapsulating functions by |
| defining the ‘MPFR_USE_NO_MACRO’ macro before ‘mpfr.h’ is included. In |
| general this should not be necessary, but this can be useful when |
| debugging user code: with some macros, the compiler may emit spurious |
| warnings with some warning options, and macros can prevent some |
| prototype checking. |
|
|
| All programs using MPFR must link against both ‘libmpfr’ and ‘libgmp’ |
| libraries. On a typical Unix-like system this can be done with ‘-lmpfr |
| -lgmp’ (in that order), for example: |
|
|
| gcc myprogram.c -lmpfr -lgmp |
|
|
| MPFR is built using Libtool and an application can use that to link |
| if desired, *note GNU Libtool: (libtool)Top. |
|
|
| If MPFR has been installed to a non-standard location, then it may be |
| necessary to set up environment variables such as ‘C_INCLUDE_PATH’ and |
| ‘LIBRARY_PATH’, or use ‘-I’ and ‘-L’ compiler options, in order to point |
| to the right directories. For a shared library, it may also be |
| necessary to set up some sort of run-time library path (e.g., |
| ‘LD_LIBRARY_PATH’) on some systems. Please read the ‘INSTALL’ file for |
| additional information. |
|
|
| Alternatively, it is possible to use ‘pkg-config’ (a file ‘mpfr.pc’ |
| is provided as of MPFR 4.0): |
|
|
| cc myprogram.c $(pkg-config --cflags --libs mpfr) |
|
|
| Note that the ‘MPFR_’ and ‘mpfr_’ prefixes are reserved for MPFR. As |
| a general rule, in order to avoid clashes, software using MPFR (directly |
| or indirectly) and system headers/libraries should not define macros and |
| symbols using these prefixes. |
|
|
| |
| File: mpfr.info, Node: Nomenclature and Types, Next: MPFR Variable Conventions, Prev: Headers and Libraries, Up: MPFR Basics |
|
|
| 4.2 Nomenclature and Types |
| ========================== |
|
|
| A “floating-point number”, or “float” for short, is an object |
| representing a radix-2 floating-point number consisting of a sign, an |
| arbitrary-precision normalized significand (also called mantissa), and |
| an exponent (an integer in some given range); these are called “regular |
| numbers”. By convention, the radix point of the significand is just |
| before the first digit (which is always 1 due to normalization), like in |
| the C language, but unlike in IEEE 754 (thus, for a given number, the |
| exponent values in MPFR and in IEEE 754 differ by 1). |
|
|
| Like in the IEEE 754 standard, a floating-point number can also have |
| three kinds of special values: a signed zero (+0 or −0), a signed |
| infinity (+Inf or −Inf), and Not-a-Number (NaN). NaN can represent the |
| default value of a floating-point object and the result of some |
| operations for which no other results would make sense, such as 0 |
| divided by 0 or +Inf minus +Inf; unless documented otherwise, the sign |
| bit of a NaN is unspecified. Note that contrary to IEEE 754, MPFR has a |
| single kind of NaN and does not have subnormals. Other than that, the |
| behavior is very similar to IEEE 754, but there are some minor |
| differences. |
|
|
| The C data type for such objects is ‘mpfr_t’, internally defined as a |
| one-element array of a structure (so that when passed as an argument to |
| a function, it is the pointer that is actually passed), and ‘mpfr_ptr’ |
| is the C data type representing a pointer to this structure; |
| ‘mpfr_srcptr’ is like ‘mpfr_ptr’, but the structure is read-only (i.e., |
| const qualified). |
|
|
| The “precision” is the number of bits used to represent the |
| significand of a floating-point number; the corresponding C data type is |
| ‘mpfr_prec_t’. The precision can be any integer between ‘MPFR_PREC_MIN’ |
| and ‘MPFR_PREC_MAX’. In the current implementation, ‘MPFR_PREC_MIN’ is |
| equal to 1. |
|
|
| Warning! MPFR needs to increase the precision internally, in order |
| to provide accurate results (and in particular, correct rounding). Do |
| not attempt to set the precision to any value near ‘MPFR_PREC_MAX’, |
| otherwise MPFR will abort due to an assertion failure. However, in |
| practice, the real limitation will probably be the available memory on |
| your platform, and in case of lack of memory, the program may abort, |
| crash or have undefined behavior (depending on your C implementation). |
|
|
| An “exponent” is a component of a regular floating-point number. Its |
| C data type is ‘mpfr_exp_t’. Valid exponents are restricted to a subset |
| of this type, and the exponent range can be changed globally as |
| described in *note Exception Related Functions::. Special values do not |
| have an exponent. |
|
|
| The “rounding mode” specifies the way to round the result of a |
| floating-point operation, in case the exact result cannot be represented |
| exactly in the destination (*note Rounding::). The corresponding C data |
| type is ‘mpfr_rnd_t’. |
|
|
| MPFR has a global (or per-thread) flag for each supported exception |
| and provides operations on flags (*note Exceptions::). This C data type |
| is used to represent a group of flags (or a mask). |
|
|
| |
| File: mpfr.info, Node: MPFR Variable Conventions, Next: Rounding, Prev: Nomenclature and Types, Up: MPFR Basics |
|
|
| 4.3 MPFR Variable Conventions |
| ============================= |
|
|
| Before you can assign to a MPFR 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 MPFR variables, since any variable has a |
| significand of fixed size. Hence unless you change its precision, or |
| clear and reinitialize it, a floating-point variable will have the same |
| allocated space during all its life. |
|
|
| As a general rule, all MPFR functions expect output arguments before |
| input arguments. This notation is based on an analogy with the |
| assignment operator. MPFR 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, ‘mpfr_mul’, can be used like this: |
| ‘mpfr_mul (x, x, x, rnd)’. This computes the square of X with rounding |
| mode ‘rnd’ and puts the result back in X. |
|
|
| |
| File: mpfr.info, Node: Rounding, Next: Floating-Point Values on Special Numbers, Prev: MPFR Variable Conventions, Up: MPFR Basics |
|
|
| 4.4 Rounding |
| ============ |
|
|
| The following rounding modes are supported: |
|
|
| • ‘MPFR_RNDN’: round to nearest, with the even rounding rule |
| (roundTiesToEven in IEEE 754); see details below. |
|
|
| • ‘MPFR_RNDD’: round toward negative infinity (roundTowardNegative in |
| IEEE 754). |
|
|
| • ‘MPFR_RNDU’: round toward positive infinity (roundTowardPositive in |
| IEEE 754). |
|
|
| • ‘MPFR_RNDZ’: round toward zero (roundTowardZero in IEEE 754). |
|
|
| • ‘MPFR_RNDA’: round away from zero. |
|
|
| • ‘MPFR_RNDF’: faithful rounding. This feature is currently |
| experimental. Specific support for this rounding mode has been |
| added to some functions, such as the basic operations (addition, |
| subtraction, multiplication, square, division, square root) or when |
| explicitly documented. It might also work with other functions, as |
| it is possible that they do not need modification in their code; |
| even though a correct behavior is not guaranteed yet (corrections |
| were done when failures occurred in the test suite, but almost |
| nothing has been checked manually), failures should be regarded as |
| bugs and reported, so that they can be fixed. |
|
|
| Note that, in particular for a result equal to zero, the sign is |
| preserved by the rounding operation. |
|
|
| The ‘MPFR_RNDN’ mode works like roundTiesToEven from the IEEE 754 |
| standard: in case the number to be rounded lies exactly in the middle |
| between two consecutive representable numbers, it is rounded to the one |
| with an even significand; in radix 2, this means that the least |
| significant bit is 0. For example, the number 2.5, which is represented |
| by (10.1) in binary, is rounded to (10.0) = 2 with a precision of two |
| bits, and not to (11.0) = 3. This rule avoids the “drift” phenomenon |
| mentioned by Knuth in volume 2 of The Art of Computer Programming |
| (Section 4.2.2). |
|
|
| Note: In particular for a 1-digit precision (in radix 2 or other |
| radices, as in conversions to a string of digits), one considers the |
| significands associated with the exponent of the number to be rounded. |
| For instance, to round the number 95 in radix 10 with a 1-digit |
| precision, one considers its truncated 1-digit integer significand 9 and |
| the following integer 10 (since these are consecutive integers, exactly |
| one of them is even). 10 is the even significand, so that 95 will be |
| rounded to 100, not to 90. |
|
|
| For the “directed rounding modes”, a number X is rounded to the |
| number Y that is the closest to X such that |
| • ‘MPFR_RNDD’: Y is less than or equal to X; |
| • ‘MPFR_RNDU’: Y is greater than or equal to X; |
| • ‘MPFR_RNDZ’: abs(Y) is less than or equal to abs(X); |
| • ‘MPFR_RNDA’: abs(Y) is greater than or equal to abs(X). |
|
|
| The ‘MPFR_RNDF’ mode works as follows: the computed value is either |
| that corresponding to ‘MPFR_RNDD’ or that corresponding to ‘MPFR_RNDU’. |
| In particular when those values are identical, i.e., when the result of |
| the corresponding operation is exactly representable, that exact result |
| is returned. Thus, the computed result can take at most two possible |
| values, and in absence of underflow/overflow, the corresponding error is |
| strictly less than one ulp (unit in the last place) of that result and |
| of the exact result. For ‘MPFR_RNDF’, the ternary value (defined below) |
| and the inexact flag (defined later, as with the other flags) are |
| unspecified, the divide-by-zero flag is as with other roundings, and the |
| underflow and overflow flags match what would be obtained in the case |
| the computed value is the same as with ‘MPFR_RNDD’ or ‘MPFR_RNDU’. The |
| results may not be reproducible. |
|
|
| Most MPFR functions take as first argument the destination variable, |
| as second and following arguments the input variables, as last argument |
| a rounding mode, and have a return value of type ‘int’, called the |
| “ternary value”. The value stored in the destination variable is |
| correctly rounded, i.e., MPFR behaves as if it computed the result with |
| an infinite precision, then rounded it to the precision of this |
| variable. The input variables are regarded as exact (in particular, |
| their precision does not affect the result). |
|
|
| As a consequence, in case of a non-zero real rounded result, the |
| error on the result is less than or equal to 1/2 ulp (unit in the last |
| place) of that result in the rounding to nearest mode, and less than 1 |
| ulp of that result in the directed rounding modes (a ulp is the weight |
| of the least significant represented bit of the result after rounding). |
|
|
| Unless documented otherwise, functions returning an ‘int’ return a |
| ternary value. If the ternary value is zero, it means that the value |
| stored in the destination variable is the exact result of the |
| corresponding mathematical function. If the ternary value is positive |
| (resp. negative), it means the value stored in the destination variable |
| is greater (resp. lower) than the exact result. For example with the |
| ‘MPFR_RNDU’ rounding mode, the ternary value is usually positive, except |
| when the result is exact, in which case it is zero. In the case of an |
| infinite result, it is considered as inexact when it was obtained by |
| overflow, and exact otherwise. A NaN result (Not-a-Number) always |
| corresponds to an exact return value. The opposite of a returned |
| ternary value is guaranteed to be representable in an ‘int’. |
|
|
| Unless documented otherwise, functions returning as result the value |
| ‘1’ (or any other value specified in this manual) for special cases |
| (like ‘acos(0)’) yield an overflow or an underflow if that value is not |
| representable in the current exponent range. |
|
|
| |
| File: mpfr.info, Node: Floating-Point Values on Special Numbers, Next: Exceptions, Prev: Rounding, Up: MPFR Basics |
|
|
| 4.5 Floating-Point Values on Special Numbers |
| ============================================ |
|
|
| This section specifies the floating-point values (of type ‘mpfr_t’) |
| returned by MPFR functions (where by “returned” we mean here the |
| modified value of the destination object, which should not be mixed with |
| the ternary return value of type ‘int’ of those functions). For |
| functions returning several values (like ‘mpfr_sin_cos’), the rules |
| apply to each result separately. |
|
|
| Functions can have one or several input arguments. An input point is |
| a mapping from these input arguments to the set of the MPFR numbers. |
| When none of its components are NaN, an input point can also be seen as |
| a tuple in the extended real numbers (the set of the real numbers with |
| both infinities). |
|
|
| When the input point is in the domain of the mathematical function, |
| the result is rounded as described in *note Rounding:: (but see below |
| for the specification of the sign of an exact zero). Otherwise the |
| general rules from this section apply unless stated otherwise in the |
| description of the MPFR function (*note MPFR Interface::). |
|
|
| When the input point is not in the domain of the mathematical |
| function but is in its closure in the extended real numbers and the |
| function can be extended by continuity, the result is the obtained |
| limit. Examples: ‘mpfr_hypot’ on (+Inf,0) gives +Inf. But ‘mpfr_pow’ |
| cannot be defined on (1,+Inf) using this rule, as one can find sequences |
| (X_N,Y_N) such that X_N goes to 1, Y_N goes to +Inf and X_N to the Y_N |
| goes to any positive value when N goes to the infinity. |
|
|
| When the input point is in the closure of the domain of the |
| mathematical function and an input argument is +0 (resp. −0), one |
| considers the limit when the corresponding argument approaches 0 from |
| above (resp. below), if possible. If the limit is not defined (e.g., |
| ‘mpfr_sqrt’ and ‘mpfr_log’ on −0), the behavior is specified in the |
| description of the MPFR function, but must be consistent with the rule |
| from the above paragraph (e.g., ‘mpfr_log’ on ±0 gives −Inf). |
|
|
| When the result is equal to 0, its sign is determined by considering |
| the limit as if the input point were not in the domain: If one |
| approaches 0 from above (resp. below), the result is +0 (resp. −0); for |
| example, ‘mpfr_sin’ on −0 gives −0 and ‘mpfr_acos’ on 1 gives +0 (in all |
| rounding modes). In the other cases, the sign is specified in the |
| description of the MPFR function; for example ‘mpfr_max’ on −0 and +0 |
| gives +0. |
|
|
| When the input point is not in the closure of the domain of the |
| function, the result is NaN. Example: ‘mpfr_sqrt’ on −17 gives NaN. |
|
|
| When an input argument is NaN, the result is NaN, possibly except |
| when a partial function is constant on the finite floating-point |
| numbers; such a case is always explicitly specified in *note MPFR |
| Interface::. Example: ‘mpfr_hypot’ on (NaN,0) gives NaN, but |
| ‘mpfr_hypot’ on (NaN,+Inf) gives +Inf (as specified in *note |
| Transcendental Functions::), since for any finite or infinite input X, |
| ‘mpfr_hypot’ on (X,+Inf) gives +Inf. |
|
|
| MPFR also tries to follow the specifications of the IEEE 754 standard |
| on special values (IEEE 754 agree with the above rules in most cases). |
| Any difference with IEEE 754 that is not explicitly mentioned, other |
| than those due to the single NaN, is unintended and might be regarded as |
| a bug. See also *note MPFR and the IEEE 754 Standard::. |
|
|
| |
| File: mpfr.info, Node: Exceptions, Next: Memory Handling, Prev: Floating-Point Values on Special Numbers, Up: MPFR Basics |
|
|
| 4.6 Exceptions |
| ============== |
|
|
| MPFR defines a global (or per-thread) flag for each supported exception. |
| A macro evaluating to a power of two is associated with each flag and |
| exception, in order to be able to specify a group of flags (or a mask) |
| by OR’ing such macros. |
|
|
| Flags can be cleared (lowered), set (raised), and tested by functions |
| described in *note Exception Related Functions::. |
|
|
| The supported exceptions are listed below. The macro associated with |
| each exception is in parentheses. |
|
|
| • Underflow (‘MPFR_FLAGS_UNDERFLOW’): An underflow occurs when the |
| exact result of a function is a non-zero real number and the result |
| obtained after the rounding, assuming an unbounded exponent range |
| (for the rounding), has an exponent smaller than the minimum value |
| of the current exponent range. (In the round-to-nearest mode, the |
| halfway case is rounded toward zero.) |
|
|
| Note: This is not the single possible definition of the underflow. |
| MPFR chooses to consider the underflow _after_ rounding. The |
| underflow before rounding can also be defined. For instance, |
| consider a function that has the exact result 7 multiplied by two |
| to the power E − 4, where E is the smallest exponent (for a |
| significand between 1/2 and 1), with a 2-bit target precision and |
| rounding toward positive infinity. The exact result has the |
| exponent E − 1. With the underflow before rounding, such a |
| function call would yield an underflow, as E − 1 is outside the |
| current exponent range. However, MPFR first considers the rounded |
| result assuming an unbounded exponent range. The exact result |
| cannot be represented exactly in precision 2, and here, it is |
| rounded to 0.5 times 2 to E, which is representable in the current |
| exponent range. As a consequence, this will not yield an underflow |
| in MPFR. |
|
|
| • Overflow (‘MPFR_FLAGS_OVERFLOW’): An overflow occurs when the exact |
| result of a function is a non-zero real number and the result |
| obtained after the rounding, assuming an unbounded exponent range |
| (for the rounding), has an exponent larger than the maximum value |
| of the current exponent range. In the round-to-nearest mode, the |
| result is infinite. Note: unlike the underflow case, there is only |
| one possible definition of overflow here. |
|
|
| • Divide-by-zero (‘MPFR_FLAGS_DIVBY0’): An exact infinite result is |
| obtained from finite inputs. |
|
|
| • NaN (‘MPFR_FLAGS_NAN’): A NaN exception occurs when the result of a |
| function is NaN. |
|
|
| • Inexact (‘MPFR_FLAGS_INEXACT’): An inexact exception occurs when |
| the result of a function cannot be represented exactly and must be |
| rounded. |
|
|
| • Range error (‘MPFR_FLAGS_ERANGE’): A range exception occurs when a |
| function that does not return a MPFR number (such as comparisons |
| and conversions to an integer) has an invalid result (e.g., an |
| argument is NaN in ‘mpfr_cmp’, or a conversion to an integer cannot |
| be represented in the target type). |
|
|
| Moreover, the group consisting of all the flags is represented by the |
| ‘MPFR_FLAGS_ALL’ macro (if new flags are added in future MPFR versions, |
| they will be added to this macro too). |
|
|
| Differences with the ISO C99 standard: |
|
|
| • In C, only quiet NaNs are specified, and a NaN propagation does not |
| raise an invalid exception. Unless explicitly stated otherwise, |
| MPFR sets the NaN flag whenever a NaN is generated, even when a NaN |
| is propagated (e.g., in NaN + NaN), as if all NaNs were signaling. |
|
|
| • An invalid exception in C corresponds to either a NaN exception or |
| a range error in MPFR. |
|
|
| |
| File: mpfr.info, Node: Memory Handling, Next: Getting the Best Efficiency Out of MPFR, Prev: Exceptions, Up: MPFR Basics |
|
|
| 4.7 Memory Handling |
| =================== |
|
|
| MPFR functions may create caches, e.g., when computing constants such as |
| Pi, either because the user has called a function like ‘mpfr_const_pi’ |
| directly or because such a function was called internally by the MPFR |
| library itself to compute some other function. When more precision is |
| needed, the value is automatically recomputed; a minimum of 10% increase |
| of the precision is guaranteed to avoid too many recomputations. |
|
|
| MPFR functions may also create thread-local pools for internal use to |
| avoid the cost of memory allocation. The pools can be freed with |
| ‘mpfr_free_pool’ (but with a default MPFR build, they should not take |
| much memory, as the allocation size is limited). |
|
|
| At any time, the user can free various caches and pools with |
| ‘mpfr_free_cache’ and ‘mpfr_free_cache2’. It is strongly advised to |
| free thread-local caches before terminating a thread, and all caches |
| before exiting when using tools like ‘valgrind’ (to avoid memory leaks |
| being reported). |
|
|
| MPFR allocates its memory either on the stack (for temporary memory |
| only) or with the same allocator as the one configured for GMP: *note |
| (gmp.info)Custom Allocation::. This means that the application must |
| make sure that data allocated with the current allocator will not be |
| reallocated or freed with a new allocator. So, in practice, if an |
| application needs to change the allocator with |
| ‘mp_set_memory_functions’, it should first free all data allocated with |
| the current allocator: for its own data, with ‘mpfr_clear’, etc.; for |
| the caches and pools, with ‘mpfr_mp_memory_cleanup’ in all threads where |
| MPFR is potentially used. This function is currently equivalent to |
| ‘mpfr_free_cache’, but ‘mpfr_mp_memory_cleanup’ is the recommended way |
| in case the allocation method changes in the future (for instance, one |
| may choose to allocate the caches for floating-point constants with |
| ‘malloc’ to avoid freeing them if the allocator changes). Developers |
| should also be aware that MPFR may also be used indirectly by libraries, |
| so that libraries based on MPFR should provide a clean-up function |
| calling ‘mpfr_mp_memory_cleanup’ and/or warn their users about this |
| issue. |
|
|
| Note: For multithreaded applications, the allocator must be valid in |
| all threads where MPFR may be used; data allocated in one thread may be |
| reallocated and/or freed in some other thread. |
|
|
| MPFR internal data such as flags, the exponent range, the default |
| precision, and the default rounding mode are either global (if MPFR has |
| not been compiled as thread safe) or per-thread (thread-local storage, |
| TLS). The initial values of TLS data after a thread is created entirely |
| depend on the compiler and thread implementation (MPFR simply does a |
| conventional variable initialization, the variables being declared with |
| an implementation-defined TLS specifier). |
|
|
| Writers of libraries using MPFR should be aware that the application |
| and/or another library used by the application may also use MPFR, so |
| that changing the exponent range, the default precision, or the default |
| rounding mode may have an effect on this other use of MPFR since these |
| data are not duplicated (unless they are in a different thread). |
| Therefore any such value changed in a library function should be |
| restored before the function returns (unless the purpose of the function |
| is to do such a change). Writers of software using MPFR should also be |
| careful when changing such a value if they use a library using MPFR |
| (directly or indirectly), in order to make sure that such a change is |
| compatible with the library. |
|
|
| |
| File: mpfr.info, Node: Getting the Best Efficiency Out of MPFR, Prev: Memory Handling, Up: MPFR Basics |
|
|
| 4.8 Getting the Best Efficiency Out of MPFR |
| =========================================== |
|
|
| Here are a few hints to get the best efficiency out of MPFR: |
|
|
| • you should avoid allocating and clearing variables. Reuse |
| variables whenever possible, allocate or clear outside of loops, |
| pass temporary variables to subroutines instead of allocating them |
| inside the subroutines; |
|
|
| • use ‘mpfr_swap’ instead of ‘mpfr_set’ whenever possible. This will |
| avoid copying the significands; |
|
|
| • avoid using MPFR from C++, or make sure your C++ interface does not |
| perform unnecessary allocations or copies. Slowdowns of up to a |
| factor 15 have been observed on some applications with a C++ |
| interface; |
|
|
| • MPFR functions work in-place: to compute ‘a = a + b’ you don’t need |
| an auxiliary variable, you can directly write ‘mpfr_add (a, a, b, |
| ...)’. |
|
|
| |
| File: mpfr.info, Node: MPFR Interface, Next: API Compatibility, Prev: MPFR Basics, Up: Top |
|
|
| 5 MPFR Interface |
| |
|
|
| The floating-point functions expect arguments of type ‘mpfr_t’. |
|
|
| The MPFR floating-point functions have an interface that is similar |
| to the GNU MP functions. The function prefix for floating-point |
| operations is ‘mpfr_’. |
|
|
| The user has to specify the precision of each variable. A |
| computation that assigns a variable will take place with the precision |
| of the assigned variable; the cost of that computation should not depend |
| on the precision of variables used as input (on average). |
|
|
| The semantics of a calculation in MPFR is specified as follows: |
| Compute the requested operation exactly (with “infinite accuracy”), and |
| round the result to the precision of the destination variable, with the |
| given rounding mode. The MPFR floating-point functions are intended to |
| be a smooth extension of the IEEE 754 arithmetic. The results obtained |
| on a given computer are identical to those obtained on a computer with a |
| different word size, or with a different compiler or operating system. |
|
|
| MPFR _does not keep track_ of the accuracy of a computation. This is |
| left to the user or to a higher layer (for example, the MPFI library for |
| interval arithmetic). As a consequence, if two variables are used to |
| store only a few significant bits, and their product is stored in a |
| variable with a large precision, then MPFR will still compute the result |
| with full precision. |
|
|
| The value of the standard C macro ‘errno’ may be set to non-zero |
| after calling any MPFR function or macro, whether or not there is an |
| error. Except when documented, MPFR will not set ‘errno’, but functions |
| called by the MPFR code (libc functions, memory allocator, etc.) may do |
| so. |
|
|
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| File: mpfr.info, Node: Initialization Functions, Next: Assignment Functions, Prev: MPFR Interface, Up: MPFR Interface |
|
|
| 5.1 Initialization Functions |
| ============================ |
|
|
| An ‘mpfr_t’ object must be initialized before storing the first value in |
| it. The functions ‘mpfr_init’ and ‘mpfr_init2’ are used for that |
| purpose. |
|
|
| -- Function: void mpfr_init2 (mpfr_t X, mpfr_prec_t PREC) |
| Initialize X, set its precision to be *exactly* PREC bits and its |
| value to NaN. (Warning: the corresponding MPF function initializes |
| to zero instead.) |
|
|
| Normally, a variable should be initialized once only or at least be |
| cleared, using ‘mpfr_clear’, between initializations. To change |
| the precision of a variable that has already been initialized, use |
| ‘mpfr_set_prec’ or ‘mpfr_prec_round’; note that if the precision is |
| decreased, the unused memory will not be freed, so that it may be |
| wise to choose a large enough initial precision in order to avoid |
| reallocations. The precision PREC must be an integer between |
| ‘MPFR_PREC_MIN’ and ‘MPFR_PREC_MAX’ (otherwise the behavior is |
| undefined). |
|
|
| -- Function: void mpfr_inits2 (mpfr_prec_t PREC, mpfr_t X, ...) |
| Initialize all the ‘mpfr_t’ variables of the given variable |
| argument ‘va_list’, set their precision to be *exactly* PREC bits |
| and their value to NaN. See ‘mpfr_init2’ for more details. The |
| ‘va_list’ is assumed to be composed only of type ‘mpfr_t’ (or |
| equivalently ‘mpfr_ptr’). It begins from X, and ends when it |
| encounters a null pointer (whose type must also be ‘mpfr_ptr’). |
|
|
| -- Function: void mpfr_clear (mpfr_t X) |
| Free the space occupied by the significand of X. Make sure to call |
| this function for all ‘mpfr_t’ variables when you are done with |
| them. |
|
|
| -- Function: void mpfr_clears (mpfr_t X, ...) |
| Free the space occupied by all the ‘mpfr_t’ variables of the given |
| ‘va_list’. See ‘mpfr_clear’ for more details. The ‘va_list’ is |
| assumed to be composed only of type ‘mpfr_t’ (or equivalently |
| ‘mpfr_ptr’). It begins from X, and ends when it encounters a null |
| pointer (whose type must also be ‘mpfr_ptr’). |
|
|
| Here is an example of how to use multiple initialization functions |
| (since ‘NULL’ is not necessarily defined in this context, we use |
| ‘(mpfr_ptr) 0’ instead, but ‘(mpfr_ptr) NULL’ is also correct). |
|
|
| { |
| mpfr_t x, y, z, t; |
| mpfr_inits2 (256, x, y, z, t, (mpfr_ptr) 0); |
| ... |
| mpfr_clears (x, y, z, t, (mpfr_ptr) 0); |
| } |
|
|
| -- Function: void mpfr_init (mpfr_t X) |
| Initialize X, set its precision to the default precision, and set |
| its value to NaN. The default precision can be changed by a call |
| to ‘mpfr_set_default_prec’. |
|
|
| Warning! In a given program, some other libraries might change the |
| default precision and not restore it. Thus it is safer to use |
| ‘mpfr_init2’. |
|
|
| -- Function: void mpfr_inits (mpfr_t X, ...) |
| Initialize all the ‘mpfr_t’ variables of the given ‘va_list’, set |
| their precision to the default precision and their value to NaN. |
| See ‘mpfr_init’ for more details. The ‘va_list’ is assumed to be |
| composed only of type ‘mpfr_t’ (or equivalently ‘mpfr_ptr’). It |
| begins from X, and ends when it encounters a null pointer (whose |
| type must also be ‘mpfr_ptr’). |
|
|
| Warning! In a given program, some other libraries might change the |
| default precision and not restore it. Thus it is safer to use |
| ‘mpfr_inits2’. |
|
|
| -- Macro: MPFR_DECL_INIT (NAME, PREC) |
| This macro declares NAME as an automatic variable of type ‘mpfr_t’, |
| initializes it and sets its precision to be *exactly* PREC bits and |
| its value to NaN. NAME must be a valid identifier. You must use |
| this macro in the declaration section. This macro is much faster |
| than using ‘mpfr_init2’ but has some drawbacks: |
|
|
| • You *must not* call ‘mpfr_clear’ with variables created with |
| this macro (the storage is allocated at the point of |
| declaration and deallocated when the brace-level is exited). |
|
|
| • You *cannot* change their precision. |
|
|
| • You *should not* create variables with huge precision with |
| this macro. |
|
|
| • Your compiler must support ‘Non-Constant Initializers’ |
| (standard in C++ and ISO C99) and ‘Token Pasting’ (standard in |
| ISO C90). If PREC is not a constant expression, your compiler |
| must support ‘variable-length automatic arrays’ (standard in |
| ISO C99). GCC 2.95.3 and above supports all these features. |
| If you compile your program with GCC in C90 mode and with |
| ‘-pedantic’, you may want to define the ‘MPFR_USE_EXTENSION’ |
| macro to avoid warnings due to the ‘MPFR_DECL_INIT’ |
| implementation. |
|
|
| -- Function: void mpfr_set_default_prec (mpfr_prec_t PREC) |
| Set the default precision to be *exactly* PREC bits, where PREC can |
| be any integer between ‘MPFR_PREC_MIN’ and ‘MPFR_PREC_MAX’. The |
| precision of a variable means the number of bits used to store its |
| significand. All subsequent calls to ‘mpfr_init’ or ‘mpfr_inits’ |
| will use this precision, but previously initialized variables are |
| unaffected. The default precision is set to 53 bits initially. |
|
|
| Note: when MPFR is built with the ‘--enable-thread-safe’ configure |
| option, the default precision is local to each thread. *Note |
| Memory Handling::, for more information. |
|
|
| -- Function: mpfr_prec_t mpfr_get_default_prec (void) |
| Return the current default MPFR precision in bits. See the |
| documentation of ‘mpfr_set_default_prec’. |
|
|
| Here is an example on how to initialize floating-point variables: |
|
|
| { |
| mpfr_t x, y; |
| mpfr_init (x); |
| mpfr_init2 (y, 256); |
| ... |
| |
| mpfr_clear (x); |
| mpfr_clear (y); |
| mpfr_free_cache (); |
| } |
|
|
| The following functions are 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 mpfr_set_prec (mpfr_t X, mpfr_prec_t PREC) |
| Set the precision of X to be *exactly* PREC bits, and set its value |
| to NaN. The previous value stored in X is lost. It is equivalent |
| to a call to ‘mpfr_clear(X)’ followed by a call to ‘mpfr_init2(X, |
| PREC)’, but more efficient as no allocation is done in case the |
| current allocated space for the significand of X is enough. The |
| precision PREC can be any integer between ‘MPFR_PREC_MIN’ and |
| ‘MPFR_PREC_MAX’. In case you want to keep the previous value |
| stored in X, use ‘mpfr_prec_round’ instead. |
|
|
| Warning! You must not use this function if X was initialized with |
| ‘MPFR_DECL_INIT’ or with ‘mpfr_custom_init_set’ (*note Custom |
| Interface::). |
|
|
| -- Function: mpfr_prec_t mpfr_get_prec (mpfr_t X) |
| Return the precision of X, i.e., the number of bits used to store |
| its significand. |
|
|
| |
| File: mpfr.info, Node: Assignment Functions, Next: Combined Initialization and Assignment Functions, Prev: Initialization Functions, Up: MPFR Interface |
|
|
| 5.2 Assignment Functions |
| ======================== |
|
|
| These functions assign new values to already initialized floats (*note |
| Initialization Functions::). |
|
|
| -- Function: int mpfr_set (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_ui (mpfr_t ROP, unsigned long int OP, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_set_si (mpfr_t ROP, long int OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_uj (mpfr_t ROP, uintmax_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_sj (mpfr_t ROP, intmax_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_flt (mpfr_t ROP, float OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_d (mpfr_t ROP, double OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_ld (mpfr_t ROP, long double OP, mpfr_rnd_t |
| RND) |
| -- Function: int mpfr_set_float128 (mpfr_t ROP, _Float128 OP, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_set_decimal64 (mpfr_t ROP, _Decimal64 OP, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_set_decimal128 (mpfr_t ROP, _Decimal128 OP, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_set_z (mpfr_t ROP, mpz_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_q (mpfr_t ROP, mpq_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_f (mpfr_t ROP, mpf_t OP, mpfr_rnd_t RND) |
| Set the value of ROP from OP, rounded toward the given direction |
| RND. Note that the input 0 is converted to +0 by ‘mpfr_set_ui’, |
| ‘mpfr_set_si’, ‘mpfr_set_uj’, ‘mpfr_set_sj’, ‘mpfr_set_z’, |
| ‘mpfr_set_q’ and ‘mpfr_set_f’, regardless of the rounding mode. |
| The ‘mpfr_set_float128’ function is built only with the configure |
| option ‘--enable-float128’, which requires the compiler or system |
| provides the ‘_Float128’ data type (GCC 4.3 or later supports this |
| data type); to use ‘mpfr_set_float128’, one should define the macro |
| ‘MPFR_WANT_FLOAT128’ before including ‘mpfr.h’. If the system does |
| not support the IEEE 754 standard, ‘mpfr_set_flt’, ‘mpfr_set_d’, |
| ‘mpfr_set_ld’, ‘mpfr_set_decimal64’ and ‘mpfr_set_decimal128’ might |
| not preserve the signed zeros (and in any case they don’t preserve |
| the sign bit of NaN). The ‘mpfr_set_decimal64’ and |
| ‘mpfr_set_decimal128’ functions are built only with the configure |
| option ‘--enable-decimal-float’, and when the compiler or system |
| provides the ‘_Decimal64’ and ‘_Decimal128’ data type; to use those |
| functions, one should define the macro ‘MPFR_WANT_DECIMAL_FLOATS’ |
| before including ‘mpfr.h’. ‘mpfr_set_q’ might fail if the |
| numerator (or the denominator) cannot be represented as a ‘mpfr_t’. |
|
|
| For ‘mpfr_set’, the sign of a NaN is propagated in order to mimic |
| the IEEE 754 ‘copy’ operation. But contrary to IEEE 754, the NaN |
| flag is set as usual. |
|
|
| Note: If you want to store a floating-point constant to a ‘mpfr_t’, |
| you should use ‘mpfr_set_str’ (or one of the MPFR constant |
| functions, such as ‘mpfr_const_pi’ for Pi) instead of |
| ‘mpfr_set_flt’, ‘mpfr_set_d’, ‘mpfr_set_ld’, ‘mpfr_set_decimal64’ |
| or ‘mpfr_set_decimal128’. Otherwise the floating-point constant |
| will be first converted into a reduced-precision (e.g., 53-bit) |
| binary (or decimal, for ‘mpfr_set_decimal64’ and |
| ‘mpfr_set_decimal128’) number before MPFR can work with it. |
|
|
| -- Function: int mpfr_set_ui_2exp (mpfr_t ROP, unsigned long int OP, |
| mpfr_exp_t E, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_si_2exp (mpfr_t ROP, long int OP, mpfr_exp_t |
| E, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_uj_2exp (mpfr_t ROP, uintmax_t OP, intmax_t |
| E, mpfr_rnd_t RND) |
| -- Function: int mpfr_set_sj_2exp (mpfr_t ROP, intmax_t OP, intmax_t E, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_set_z_2exp (mpfr_t ROP, mpz_t OP, mpfr_exp_t E, |
| mpfr_rnd_t RND) |
| Set the value of ROP from OP multiplied by two to the power E, |
| rounded toward the given direction RND. Note that the input 0 is |
| converted to +0. |
|
|
| -- Function: int mpfr_set_str (mpfr_t ROP, const char *S, int BASE, |
| mpfr_rnd_t RND) |
| Set ROP to the value of the string S in base BASE, rounded in the |
| direction RND. See the documentation of ‘mpfr_strtofr’ for a |
| detailed description of BASE (with its special value 0) and the |
| valid string formats. Contrary to ‘mpfr_strtofr’, ‘mpfr_set_str’ |
| requires the _whole_ string to represent a valid floating-point |
| number. |
|
|
| The meaning of the return value differs from other MPFR functions: |
| it is 0 if the entire string up to the final null character is a |
| valid number in base BASE; otherwise it is −1, and ROP may have |
| changed (users interested in the *note ternary value:: should use |
| ‘mpfr_strtofr’ instead). |
|
|
| Note: it is preferable to use ‘mpfr_strtofr’ if one wants to |
| distinguish between an infinite ROP value coming from an infinite S |
| or from an overflow. |
|
|
| -- Function: int mpfr_strtofr (mpfr_t ROP, const char *NPTR, char |
| |
| Read a floating-point number from a string NPTR in base BASE, |
| rounded in the direction RND; BASE must be either 0 (to detect the |
| base, as described below) or a number from 2 to 62 (otherwise the |
| behavior is undefined). If NPTR starts with valid data, the result |
| is stored in ROP and ‘*ENDPTR’ points to the character just after |
| the valid data (if ENDPTR is not a null pointer); otherwise ROP is |
| set to zero (for consistency with ‘strtod’) and the value of NPTR |
| is stored in the location referenced by ENDPTR (if ENDPTR is not a |
| null pointer). The usual ternary value is returned. |
|
|
| Parsing follows the standard C ‘strtod’ function with some |
| extensions. After optional leading whitespace, one has a subject |
| sequence consisting of an optional sign (‘+’ or ‘-’), and either |
| numeric data or special data. The subject sequence is defined as |
| the longest initial subsequence of the input string, starting with |
| the first non-whitespace character, that is of the expected form. |
|
|
| The form of numeric data is a non-empty sequence of significand |
| digits with an optional decimal-point character, and an optional |
| exponent consisting of an exponent prefix followed by an optional |
| sign and a non-empty sequence of decimal digits. A significand |
| digit is either a decimal digit or a Latin letter (62 possible |
| characters), with ‘A’ = 10, ‘B’ = 11, ..., ‘Z’ = 35; case is |
| ignored in bases less than or equal to 36, in bases larger than 36, |
| ‘a’ = 36, ‘b’ = 37, ..., ‘z’ = 61. The value of a significand |
| digit must be strictly less than the base. The decimal-point |
| character can be either the one defined by the current locale or |
| the period (the first one is accepted for consistency with the C |
| standard and the practice, the second one is accepted to allow the |
| programmer to provide MPFR numbers from strings in a way that does |
| not depend on the current locale). The exponent prefix can be ‘e’ |
| or ‘E’ for bases up to 10, or ‘@’ in any base; it indicates a |
| multiplication by a power of the base. In bases 2 and 16, the |
| exponent prefix can also be ‘p’ or ‘P’, in which case the exponent, |
| called _binary exponent_, indicates a multiplication by a power of |
| 2 instead of the base (there is a difference only for base 16); in |
| base 16 for example ‘1p2’ represents 4 whereas ‘1@2’ represents |
| 256. The value of an exponent is always written in base 10. |
|
|
| If the argument BASE is 0, then the base is automatically detected |
| as follows. If the significand starts with ‘0b’ or ‘0B’, base 2 is |
| assumed. If the significand starts with ‘0x’ or ‘0X’, base 16 is |
| assumed. Otherwise base 10 is assumed. |
|
|
| Note: The exponent (if present) must contain at least a digit. |
| Otherwise the possible exponent prefix and sign are not part of the |
| number (which ends with the significand). Similarly, if ‘0b’, |
| ‘0B’, ‘0x’ or ‘0X’ is not followed by a binary/hexadecimal digit, |
| then the subject sequence stops at the character ‘0’, thus 0 is |
| read. |
|
|
| Special data (for infinities and NaN) can be ‘@inf@’ or |
| ‘@nan@(n-char-sequence-opt)’, and if BASE <= 16, it can also be |
| ‘infinity’, ‘inf’, ‘nan’ or ‘nan(n-char-sequence-opt)’, all case |
| insensitive with the rules of the C locale. An |
| ‘n-char-sequence-opt’ is a possibly empty string containing only |
| digits, Latin letters and the underscore (0, 1, 2, ..., 9, a, b, |
| ..., z, A, B, ..., Z, _). Note: one has an optional sign for all |
| data, even NaN. For example, ‘-@nAn@(This_Is_Not_17)’ is a valid |
| representation for NaN in base 17. |
|
|
| -- Function: void mpfr_set_nan (mpfr_t X) |
| -- Function: void mpfr_set_inf (mpfr_t X, int SIGN) |
| -- Function: void mpfr_set_zero (mpfr_t X, int SIGN) |
| Set the variable X to NaN (Not-a-Number), infinity or zero |
| respectively. In ‘mpfr_set_inf’ or ‘mpfr_set_zero’, X is set to |
| positive infinity (+Inf) or positive zero (+0) iff SIGN is |
| non-negative; in ‘mpfr_set_nan’, the sign bit of the result is |
| unspecified. |
|
|
| -- Function: void mpfr_swap (mpfr_t X, mpfr_t Y) |
| Swap the structures pointed to by X and Y. In particular, the |
| values are exchanged without rounding (this may be different from |
| three ‘mpfr_set’ calls using a third auxiliary variable). |
|
|
| Warning! Since the precisions are exchanged, this will affect |
| future assignments. Moreover, since the significand pointers are |
| also exchanged, you must not use this function if the allocation |
| method used for X and/or Y does not permit it. This is the case |
| when X and/or Y were declared and initialized with |
| ‘MPFR_DECL_INIT’, and possibly with ‘mpfr_custom_init_set’ (*note |
| Custom Interface::). |
|
|
| |
| File: mpfr.info, Node: Combined Initialization and Assignment Functions, Next: Conversion Functions, Prev: Assignment Functions, Up: MPFR Interface |
|
|
| 5.3 Combined Initialization and Assignment Functions |
| ==================================================== |
|
|
| -- Macro: int mpfr_init_set (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Macro: int mpfr_init_set_ui (mpfr_t ROP, unsigned long int OP, |
| mpfr_rnd_t RND) |
| -- Macro: int mpfr_init_set_si (mpfr_t ROP, long int OP, mpfr_rnd_t |
| RND) |
| -- Macro: int mpfr_init_set_d (mpfr_t ROP, double OP, mpfr_rnd_t RND) |
| -- Macro: int mpfr_init_set_ld (mpfr_t ROP, long double OP, mpfr_rnd_t |
| RND) |
| -- Macro: int mpfr_init_set_z (mpfr_t ROP, mpz_t OP, mpfr_rnd_t RND) |
| -- Macro: int mpfr_init_set_q (mpfr_t ROP, mpq_t OP, mpfr_rnd_t RND) |
| -- Macro: int mpfr_init_set_f (mpfr_t ROP, mpf_t OP, mpfr_rnd_t RND) |
| Initialize ROP and set its value from OP, rounded in the direction |
| RND. The precision of ROP will be taken from the active default |
| precision, as set by ‘mpfr_set_default_prec’. |
|
|
| -- Function: int mpfr_init_set_str (mpfr_t X, const char *S, int BASE, |
| mpfr_rnd_t RND) |
| Initialize X and set its value from the string S in base BASE, |
| rounded in the direction RND. See ‘mpfr_set_str’. |
|
|
| |
| File: mpfr.info, Node: Conversion Functions, Next: Arithmetic Functions, Prev: Combined Initialization and Assignment Functions, Up: MPFR Interface |
|
|
| 5.4 Conversion Functions |
| ======================== |
|
|
| -- Function: float mpfr_get_flt (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: double mpfr_get_d (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: long double mpfr_get_ld (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: _Float128 mpfr_get_float128 (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: _Decimal64 mpfr_get_decimal64 (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: _Decimal128 mpfr_get_decimal128 (mpfr_t OP, mpfr_rnd_t |
| RND) |
| Convert OP to a ‘float’ (respectively ‘double’, ‘long double’, |
| ‘_Decimal64’, or ‘_Decimal128’) using the rounding mode RND. If OP |
| is NaN, some NaN (either quiet or signaling) or the result of |
| 0.0/0.0 is returned (the sign bit is not preserved). If OP is |
| ±Inf, an infinity of the same sign or the result of ±1.0/0.0 is |
| returned. If OP is zero, these functions return a zero, trying to |
| preserve its sign, if possible. The ‘mpfr_get_float128’, |
| ‘mpfr_get_decimal64’ and ‘mpfr_get_decimal128’ functions are built |
| only under some conditions: see the documentation of |
| ‘mpfr_set_float128’, ‘mpfr_set_decimal64’ and ‘mpfr_set_decimal128’ |
| respectively. |
|
|
| -- Function: long int mpfr_get_si (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: unsigned long int mpfr_get_ui (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: intmax_t mpfr_get_sj (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: uintmax_t mpfr_get_uj (mpfr_t OP, mpfr_rnd_t RND) |
| Convert OP to a ‘long int’, an ‘unsigned long int’, an ‘intmax_t’ |
| or an ‘uintmax_t’ (respectively) after rounding it to an integer |
| with respect to RND. If OP is NaN, 0 is returned and the _erange_ |
| flag is set. If OP is too big for the return type, the function |
| returns the maximum or the minimum of the corresponding C type, |
| depending on the direction of the overflow; the _erange_ flag is |
| set too. When there is no such range error, if the return value |
| differs from OP, i.e., if OP is not an integer, the inexact flag is |
| set. See also ‘mpfr_fits_slong_p’, ‘mpfr_fits_ulong_p’, |
| ‘mpfr_fits_intmax_p’ and ‘mpfr_fits_uintmax_p’. |
|
|
| -- Function: double mpfr_get_d_2exp (long *EXP, mpfr_t OP, mpfr_rnd_t |
| RND) |
| -- Function: long double mpfr_get_ld_2exp (long *EXP, mpfr_t OP, |
| mpfr_rnd_t RND) |
| Return D and set EXP (formally, the value pointed to by EXP) such |
| that 0.5 <= abs(D) < 1 and D times 2 raised to EXP equals OP |
| rounded to double (resp. long double) precision, using the given |
| rounding mode. If OP is zero, then a zero of the same sign (or an |
| unsigned zero, if the implementation does not have signed zeros) is |
| returned, and EXP is set to 0. If OP is NaN or an infinity, then |
| the corresponding double precision (resp. long-double precision) |
| value is returned, and EXP is undefined. |
|
|
| -- Function: int mpfr_frexp (mpfr_exp_t *EXP, mpfr_t Y, mpfr_t X, |
| mpfr_rnd_t RND) |
| Set EXP (formally, the value pointed to by EXP) and Y such that |
| 0.5 <= abs(Y) < 1 and Y times 2 raised to EXP equals X rounded to |
| the precision of Y, using the given rounding mode. If X is zero, |
| then Y is set to a zero of the same sign and EXP is set to 0. If X |
| is NaN or an infinity, then Y is set to the same value and EXP is |
| undefined. |
|
|
| -- Function: mpfr_exp_t mpfr_get_z_2exp (mpz_t ROP, mpfr_t OP) |
| Put the scaled significand of OP (regarded as an integer, with the |
| precision of OP) into ROP, and return the exponent EXP (which may |
| be outside the current exponent range) such that OP exactly equals |
| ROP times 2 raised to the power EXP. If OP is zero, the minimal |
| exponent EMIN is returned. If OP is NaN or an infinity, the |
| _erange_ flag is set, ROP is set to 0, and the minimal exponent |
| EMIN is returned. The returned exponent may be less than the |
| minimal exponent EMIN of MPFR numbers in the current exponent |
| range; in case the exponent is not representable in the |
| ‘mpfr_exp_t’ type, the _erange_ flag is set and the minimal value |
| of the ‘mpfr_exp_t’ type is returned. |
|
|
| -- Function: int mpfr_get_z (mpz_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Convert OP to a ‘mpz_t’, after rounding it with respect to RND. If |
| OP is NaN or an infinity, the _erange_ flag is set, ROP is set to |
| 0, and 0 is returned. Otherwise the return value is zero when ROP |
| is equal to OP (i.e., when OP is an integer), positive when it is |
| greater than OP, and negative when it is smaller than OP; moreover, |
| if ROP differs from OP, i.e., if OP is not an integer, the inexact |
| flag is set. |
|
|
| -- Function: void mpfr_get_q (mpq_t ROP, mpfr_t OP) |
| Convert OP to a ‘mpq_t’. If OP is NaN or an infinity, the _erange_ |
| flag is set and ROP is set to 0. Otherwise the conversion is |
| always exact. |
|
|
| -- Function: int mpfr_get_f (mpf_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Convert OP to a ‘mpf_t’, after rounding it with respect to RND. |
| The _erange_ flag is set if OP is NaN or an infinity, which do not |
| exist in MPF. If OP is NaN, then ROP is undefined. If OP is +Inf |
| (resp. −Inf), then ROP is set to the maximum (resp. minimum) value |
| in the precision of the MPF number; if a future MPF version |
| supports infinities, this behavior will be considered incorrect and |
| will change (portable programs should assume that ROP is set either |
| to this finite number or to an infinite number). Note that since |
| MPFR currently has the same exponent type as MPF (but not with the |
| same radix), the range of values is much larger in MPF than in |
| MPFR, so that an overflow or underflow is not possible. |
|
|
| -- Function: size_t mpfr_get_str_ndigits (int B, mpfr_prec_t P) |
| Return the minimal integer m such that any number of P bits, when |
| output with m digits in radix B with rounding to nearest, can be |
| recovered exactly when read again, still with rounding to nearest. |
| More precisely, we have m = 1 + ceil(P times log(2)/log(B)), with P |
| replaced by P − 1 if B is a power of 2. |
|
|
| The argument B must be in the range 2 to 62; this is the range of |
| bases supported by the ‘mpfr_get_str’ function. Note that contrary |
| to the base argument of this function, negative values are not |
| accepted. |
|
|
| -- Function: char * mpfr_get_str (char *STR, mpfr_exp_t *EXPPTR, int |
| BASE, size_t N, mpfr_t OP, mpfr_rnd_t RND) |
| Convert OP to a string of digits in base abs(BASE), with rounding |
| in the direction RND, where N is either zero (see below) or the |
| number of significant digits output in the string. The argument |
| BASE may vary from 2 to 62 or from −2 to −36; otherwise the |
| function does nothing and immediately returns a null pointer. |
|
|
| For BASE in the range 2 to 36, digits and lower-case letters are |
| used; for −2 to −36, digits and upper-case letters are used; for 37 |
| to 62, digits, upper-case letters, and lower-case letters, in that |
| significance order, are used. Warning! This implies that for |
| BASE > 10, the successor of the digit 9 depends on BASE. This |
| choice has been done for compatibility with GMP’s ‘mpf_get_str’ |
| function. Users who wish a more consistent behavior should write a |
| simple wrapper. |
|
|
| If the input is NaN, then the returned string is ‘@NaN@’ and the |
| NaN flag is set. If the input is +Inf (resp. −Inf), then the |
| returned string is ‘@Inf@’ (resp. ‘-@Inf@’). |
|
|
| If the input number is a finite number, the exponent is written |
| through the pointer EXPPTR (for input 0, the current minimal |
| exponent is written); the type ‘mpfr_exp_t’ is large enough to hold |
| the exponent in all cases. |
|
|
| The generated string is a fraction, with an implicit radix point |
| immediately to the left of the first digit. For example, the |
| number −3.1416 would be returned as ‘-31416’ in the string and 1 |
| written at EXPPTR. If RND is to nearest, and OP is exactly in the |
| middle of two consecutive possible outputs, the one with an even |
| significand is chosen, where both significands are considered with |
| the exponent of OP. Note that for an odd base, this may not |
| correspond to an even last digit: for example, with 2 digits in |
| base 7, (14) and a half is rounded to (15), which is 12 in decimal, |
| (16) and a half is rounded to (20), which is 14 in decimal, and |
| (26) and a half is rounded to (26), which is 20 in decimal. |
|
|
| If N is zero, the number of digits of the significand is taken as |
| ‘mpfr_get_str_ndigits (BASE, P)’, where P is the precision of OP |
| (*note mpfr_get_str_ndigits::). |
|
|
| If STR is a null pointer, space for the significand is allocated |
| using the allocation function (*note Memory Handling::) and a |
| pointer to the string is returned (unless the base is invalid). To |
| free the returned string, you must use ‘mpfr_free_str’. |
|
|
| If STR is not a null pointer, it should point to a block of storage |
| large enough for the significand. A safe block size (sufficient |
| for any value) is max(N + 2, 7) if N is not zero; if N is zero, |
| replace it by ‘mpfr_get_str_ndigits (BASE, P)’, where P is the |
| precision of OP, as mentioned above. The extra two bytes are for a |
| possible minus sign, and for the terminating null character, and |
| the value 7 accounts for ‘-@Inf@’ plus the terminating null |
| character. The pointer to the string STR is returned (unless the |
| base is invalid). |
|
|
| Like in usual functions, the inexact flag is set iff the result is |
| inexact. |
|
|
| -- Function: void mpfr_free_str (char *STR) |
| Free a string allocated by ‘mpfr_get_str’ using the unallocation |
| function (*note Memory Handling::). The block is assumed to be |
| ‘strlen(STR)+1’ bytes. |
|
|
| -- Function: int mpfr_fits_ulong_p (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_fits_slong_p (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_fits_uint_p (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_fits_sint_p (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_fits_ushort_p (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_fits_sshort_p (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_fits_uintmax_p (mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_fits_intmax_p (mpfr_t OP, mpfr_rnd_t RND) |
| Return non-zero if OP would fit in the respective C data type, |
| respectively ‘unsigned long int’, ‘long int’, ‘unsigned int’, |
| ‘int’, ‘unsigned short’, ‘short’, ‘uintmax_t’, ‘intmax_t’, when |
| rounded to an integer in the direction RND. For instance, with the |
| ‘MPFR_RNDU’ rounding mode on −0.5, the result will be non-zero for |
| all these functions. For ‘MPFR_RNDF’, those functions return |
| non-zero when it is guaranteed that the corresponding conversion |
| function (for example ‘mpfr_get_ui’ for ‘mpfr_fits_ulong_p’), when |
| called with faithful rounding, will always return a number that is |
| representable in the corresponding type. As a consequence, for |
| ‘MPFR_RNDF’, ‘mpfr_fits_ulong_p’ will return non-zero for a |
| non-negative number less than or equal to ‘ULONG_MAX’. |
|
|
| |
| File: mpfr.info, Node: Arithmetic Functions, Next: Comparison Functions, Prev: Conversion Functions, Up: MPFR Interface |
|
|
| 5.5 Arithmetic Functions |
| ======================== |
|
|
| -- Function: int mpfr_add (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_add_ui (mpfr_t ROP, mpfr_t OP1, unsigned long int |
| OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_add_si (mpfr_t ROP, mpfr_t OP1, long int OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_add_d (mpfr_t ROP, mpfr_t OP1, double OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_add_z (mpfr_t ROP, mpfr_t OP1, mpz_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_add_q (mpfr_t ROP, mpfr_t OP1, mpq_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to OP1 + OP2 rounded in the direction RND. The IEEE 754 |
| rules are used, in particular for signed zeros. But for types |
| having no signed zeros, 0 is considered unsigned (i.e., |
| (+0) + 0 = (+0) and (−0) + 0 = (−0)). The ‘mpfr_add_d’ function |
| assumes that the radix of the ‘double’ type is a power of 2, with a |
| precision at most that declared by the C implementation (macro |
| ‘IEEE_DBL_MANT_DIG’, and if not defined 53 bits). |
|
|
| -- Function: int mpfr_sub (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_ui_sub (mpfr_t ROP, unsigned long int OP1, mpfr_t |
| OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_sub_ui (mpfr_t ROP, mpfr_t OP1, unsigned long int |
| OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_si_sub (mpfr_t ROP, long int OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_sub_si (mpfr_t ROP, mpfr_t OP1, long int OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_d_sub (mpfr_t ROP, double OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_sub_d (mpfr_t ROP, mpfr_t OP1, double OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_z_sub (mpfr_t ROP, mpz_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_sub_z (mpfr_t ROP, mpfr_t OP1, mpz_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_sub_q (mpfr_t ROP, mpfr_t OP1, mpq_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to OP1 − OP2 rounded in the direction RND. The IEEE 754 |
| rules are used, in particular for signed zeros. But for types |
| having no signed zeros, 0 is considered unsigned (i.e., |
| (+0) − 0 = (+0), (−0) − 0 = (−0), 0 − (+0) = (−0) and |
| 0 − (−0) = (+0)). The same restrictions as for ‘mpfr_add_d’ apply |
| to ‘mpfr_d_sub’ and ‘mpfr_sub_d’. |
|
|
| -- Function: int mpfr_mul (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_mul_ui (mpfr_t ROP, mpfr_t OP1, unsigned long int |
| OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_mul_si (mpfr_t ROP, mpfr_t OP1, long int OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_mul_d (mpfr_t ROP, mpfr_t OP1, double OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_mul_z (mpfr_t ROP, mpfr_t OP1, mpz_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_mul_q (mpfr_t ROP, mpfr_t OP1, mpq_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to OP1 times OP2 rounded in the direction RND. When a |
| result is zero, its sign is the product of the signs of the |
| operands (for types having no signed zeros, 0 is considered |
| positive). The same restrictions as for ‘mpfr_add_d’ apply to |
| ‘mpfr_mul_d’. Note: when OP1 and OP2 are equal, use ‘mpfr_sqr’ |
| instead of ‘mpfr_mul’ for better efficiency. |
|
|
| -- Function: int mpfr_sqr (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the square of OP rounded in the direction RND. |
|
|
| -- Function: int mpfr_div (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_ui_div (mpfr_t ROP, unsigned long int OP1, mpfr_t |
| OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_div_ui (mpfr_t ROP, mpfr_t OP1, unsigned long int |
| OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_si_div (mpfr_t ROP, long int OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_div_si (mpfr_t ROP, mpfr_t OP1, long int OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_d_div (mpfr_t ROP, double OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_div_d (mpfr_t ROP, mpfr_t OP1, double OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_div_z (mpfr_t ROP, mpfr_t OP1, mpz_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_div_q (mpfr_t ROP, mpfr_t OP1, mpq_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to OP1 / OP2 rounded in the direction RND. When a result |
| is zero, its sign is the product of the signs of the operands. For |
| types having no signed zeros, 0 is considered positive; but note |
| that if OP1 is non-zero and OP2 is zero, the result might change |
| from ±Inf to NaN in future MPFR versions if there is an opposite |
| decision on the IEEE 754 side. The same restrictions as for |
| ‘mpfr_add_d’ apply to ‘mpfr_d_div’ and ‘mpfr_div_d’. |
|
|
| -- Function: int mpfr_sqrt (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_sqrt_ui (mpfr_t ROP, unsigned long int OP, |
| mpfr_rnd_t RND) |
| Set ROP to the square root of OP rounded in the direction RND. Set |
| ROP to −0 if OP is −0, to be consistent with the IEEE 754 standard |
| (thus this differs from ‘mpfr_rootn_ui’ and ‘mpfr_rootn_si’ with |
| N = 2). Set ROP to NaN if OP is negative. |
|
|
| -- Function: int mpfr_rec_sqrt (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the reciprocal square root of OP rounded in the |
| direction RND. Set ROP to +Inf if OP is ±0, +0 if OP is +Inf, and |
| NaN if OP is negative. Warning! Therefore the result on −0 is |
| different from the one of the rSqrt function recommended by the |
| IEEE 754 standard (Section 9.2.1), which is −Inf instead of +Inf. |
| However, ‘mpfr_rec_sqrt’ is equivalent to ‘mpfr_rootn_si’ with |
| N = −2. |
|
|
| -- Function: int mpfr_cbrt (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_rootn_ui (mpfr_t ROP, mpfr_t OP, unsigned long |
| int N, mpfr_rnd_t RND) |
| -- Function: int mpfr_rootn_si (mpfr_t ROP, mpfr_t OP, long int N, |
| mpfr_rnd_t RND) |
| Set ROP to the Nth root (with N = 3, the cubic root, for |
| ‘mpfr_cbrt’) of OP rounded in the direction RND. For N = 0, set |
| ROP to NaN. For N odd (resp. even) and OP negative (including |
| −Inf), set ROP to a negative number (resp. NaN). If OP is zero, |
| set ROP to zero with the sign obtained by the usual limit rules, |
| i.e., the same sign as OP if N is odd, and positive if N is even. |
|
|
| These functions agree with the rootn operation of the IEEE 754 |
| standard. |
|
|
| -- Function: int mpfr_root (mpfr_t ROP, mpfr_t OP, unsigned long int N, |
| mpfr_rnd_t RND) |
| This function is the same as ‘mpfr_rootn_ui’ except when OP is −0 |
| and N is even: the result is −0 instead of +0 (the reason was to be |
| consistent with ‘mpfr_sqrt’). Said otherwise, if OP is zero, set |
| ROP to OP. |
|
|
| This function predates IEEE 754-2008, where rootn was introduced, |
| and behaves differently from the IEEE 754 rootn operation. It is |
| marked as deprecated and will be removed in a future release. |
|
|
| -- Function: int mpfr_neg (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_abs (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to −OP and the absolute value of OP respectively, rounded |
| in the direction RND. Just changes or adjusts the sign if ROP and |
| OP are the same variable, otherwise a rounding might occur if the |
| precision of ROP is less than that of OP. |
|
|
| The sign rule also applies to NaN in order to mimic the IEEE 754 |
| ‘negate’ and ‘abs’ operations, i.e., for ‘mpfr_neg’, the sign is |
| reversed, and for ‘mpfr_abs’, the sign is set to positive. But |
| contrary to IEEE 754, the NaN flag is set as usual. |
|
|
| -- Function: int mpfr_dim (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to the positive difference of OP1 and OP2, i.e., OP1 − OP2 |
| rounded in the direction RND if OP1 > OP2, +0 if OP1 <= OP2, and |
| NaN if OP1 or OP2 is NaN. |
|
|
| -- Function: int mpfr_mul_2ui (mpfr_t ROP, mpfr_t OP1, unsigned long |
| int OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_mul_2si (mpfr_t ROP, mpfr_t OP1, long int OP2, |
| mpfr_rnd_t RND) |
| Set ROP to OP1 times 2 raised to OP2 rounded in the direction RND. |
| Just increases the exponent by OP2 when ROP and OP1 are identical. |
|
|
| -- Function: int mpfr_div_2ui (mpfr_t ROP, mpfr_t OP1, unsigned long |
| int OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_div_2si (mpfr_t ROP, mpfr_t OP1, long int OP2, |
| mpfr_rnd_t RND) |
| Set ROP to OP1 divided by 2 raised to OP2 rounded in the direction |
| RND. Just decreases the exponent by OP2 when ROP and OP1 are |
| identical. |
|
|
| -- Function: int mpfr_fac_ui (mpfr_t ROP, unsigned long int OP, |
| mpfr_rnd_t RND) |
| Set ROP to the factorial of OP, rounded in the direction RND. |
|
|
| -- Function: int mpfr_fma (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, mpfr_t |
| OP3, mpfr_rnd_t RND) |
| -- Function: int mpfr_fms (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, mpfr_t |
| OP3, mpfr_rnd_t RND) |
| Set ROP to (OP1 times OP2) + OP3 (resp. (OP1 times OP2) − OP3) |
| rounded in the direction RND. Concerning special values (signed |
| zeros, infinities, NaN), these functions behave like a |
| multiplication followed by a separate addition or subtraction. |
| That is, the fused operation matters only for rounding. |
|
|
| -- Function: int mpfr_fmma (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, mpfr_t |
| OP3, mpfr_t OP4, mpfr_rnd_t RND) |
| -- Function: int mpfr_fmms (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, mpfr_t |
| OP3, mpfr_t OP4, mpfr_rnd_t RND) |
| Set ROP to (OP1 times OP2) + (OP3 times OP4) (resp. |
| (OP1 times OP2) − (OP3 times OP4)) rounded in the direction RND. |
| In case the computation of OP1 times OP2 overflows or underflows |
| (or that of OP3 times OP4), the result ROP is computed as if the |
| two intermediate products were computed with rounding toward zero. |
|
|
| -- Function: int mpfr_hypot (mpfr_t ROP, mpfr_t X, mpfr_t Y, mpfr_rnd_t |
| RND) |
| Set ROP to the Euclidean norm of X and Y, i.e., the square root of |
| the sum of the squares of X and Y, rounded in the direction RND. |
| Special values are handled as described in the ISO C99 |
| (Section F.9.4.3) and IEEE 754 (Section 9.2.1) standards: If X or Y |
| is an infinity, then +Inf is returned in ROP, even if the other |
| number is NaN. |
|
|
| -- Function: int mpfr_sum (mpfr_t ROP, const mpfr_ptr TAB[], unsigned |
| long int N, mpfr_rnd_t RND) |
| Set ROP to the sum of all elements of TAB, whose size is N, |
| correctly rounded in the direction RND. Warning: for efficiency |
| reasons, TAB is an array of pointers to ‘mpfr_t’, not an array of |
| ‘mpfr_t’. If N = 0, then the result is +0, and if N = 1, then the |
| function is equivalent to ‘mpfr_set’. For the special exact cases, |
| the result is the same as the one obtained with a succession of |
| additions (‘mpfr_add’) in infinite precision. In particular, if |
| the result is an exact zero and N >= 1: |
| • if all the inputs have the same sign (i.e., all +0 or all −0), |
| then the result has the same sign as the inputs; |
| • otherwise, either because all inputs are zeros with at least a |
| +0 and a −0, or because some inputs are non-zero (but they |
| globally cancel), the result is +0, except for the ‘MPFR_RNDD’ |
| rounding mode, where it is −0. |
|
|
| -- Function: int mpfr_dot (mpfr_t ROP, const mpfr_ptr A[], const |
| mpfr_ptr B[], unsigned long int N, mpfr_rnd_t RND) |
| Set ROP to the dot product of elements of A by those of B, whose |
| common size is N, correctly rounded in the direction RND. Warning: |
| for efficiency reasons, A and B are arrays of pointers to ‘mpfr_t’. |
| This function is experimental, and does not yet handle intermediate |
| overflows and underflows. |
|
|
| For the power functions (with an integer exponent or not), see *note |
| mpfr_pow:: in *note Transcendental Functions::. |
|
|
| |
| File: mpfr.info, Node: Comparison Functions, Next: Transcendental Functions, Prev: Arithmetic Functions, Up: MPFR Interface |
|
|
| 5.6 Comparison Functions |
| ======================== |
|
|
| -- Function: int mpfr_cmp (mpfr_t OP1, mpfr_t OP2) |
| -- Function: int mpfr_cmp_ui (mpfr_t OP1, unsigned long int OP2) |
| -- Function: int mpfr_cmp_si (mpfr_t OP1, long int OP2) |
| -- Function: int mpfr_cmp_d (mpfr_t OP1, double OP2) |
| -- Function: int mpfr_cmp_ld (mpfr_t OP1, long double OP2) |
| -- Function: int mpfr_cmp_z (mpfr_t OP1, mpz_t OP2) |
| -- Function: int mpfr_cmp_q (mpfr_t OP1, mpq_t OP2) |
| -- Function: int mpfr_cmp_f (mpfr_t OP1, mpf_t OP2) |
| Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero if |
| OP1 = OP2, and a negative value if OP1 < OP2. Both OP1 and OP2 are |
| considered to their full own precision, which may differ. If one |
| of the operands is NaN, set the _erange_ flag and return zero. |
|
|
| Note: These functions may be useful to distinguish the three |
| possible cases. If you need to distinguish two cases only, it is |
| recommended to use the predicate functions (e.g., ‘mpfr_equal_p’ |
| for the equality) described below; they behave like the IEEE 754 |
| comparisons, in particular when one or both arguments are NaN. But |
| only floating-point numbers can be compared (you may need to do a |
| conversion first). |
|
|
| -- Function: int mpfr_cmp_ui_2exp (mpfr_t OP1, unsigned long int OP2, |
| mpfr_exp_t E) |
| -- Function: int mpfr_cmp_si_2exp (mpfr_t OP1, long int OP2, mpfr_exp_t |
| E) |
| Compare OP1 and OP2 multiplied by two to the power E. Similar as |
| above. |
|
|
| -- Function: int mpfr_cmpabs (mpfr_t OP1, mpfr_t OP2) |
| -- Function: int mpfr_cmpabs_ui (mpfr_t OP1, unsigned long int OP2) |
| Compare |OP1| and |OP2|. Return a positive value if |OP1| > |OP2|, |
| zero if |OP1| = |OP2|, and a negative value if |OP1| < |OP2|. If |
| one of the operands is NaN, set the _erange_ flag and return zero. |
|
|
| -- Function: int mpfr_nan_p (mpfr_t OP) |
| -- Function: int mpfr_inf_p (mpfr_t OP) |
| -- Function: int mpfr_number_p (mpfr_t OP) |
| -- Function: int mpfr_zero_p (mpfr_t OP) |
| -- Function: int mpfr_regular_p (mpfr_t OP) |
| Return non-zero if OP is respectively NaN, an infinity, an ordinary |
| number (i.e., neither NaN nor an infinity), zero, or a regular |
| number (i.e., neither NaN, nor an infinity nor zero). Return zero |
| otherwise. |
|
|
| -- Macro: int mpfr_sgn (mpfr_t OP) |
| Return a positive value if OP > 0, zero if OP = 0, and a negative |
| value if OP < 0. If the operand is NaN, set the _erange_ flag and |
| return zero. This is equivalent to ‘mpfr_cmp_ui (OP, 0)’, but more |
| efficient. |
|
|
| -- Function: int mpfr_greater_p (mpfr_t OP1, mpfr_t OP2) |
| -- Function: int mpfr_greaterequal_p (mpfr_t OP1, mpfr_t OP2) |
| -- Function: int mpfr_less_p (mpfr_t OP1, mpfr_t OP2) |
| -- Function: int mpfr_lessequal_p (mpfr_t OP1, mpfr_t OP2) |
| -- Function: int mpfr_equal_p (mpfr_t OP1, mpfr_t OP2) |
| Return non-zero if OP1 > OP2, OP1 >= OP2, OP1 < OP2, OP1 <= OP2, |
| OP1 = OP2 respectively, and zero otherwise. Those functions return |
| zero whenever OP1 and/or OP2 is NaN. |
|
|
| -- Function: int mpfr_lessgreater_p (mpfr_t OP1, mpfr_t OP2) |
| Return non-zero if OP1 < OP2 or OP1 > OP2 (i.e., neither OP1, nor |
| OP2 is NaN, and OP1 <> OP2), zero otherwise (i.e., OP1 and/or OP2 |
| is NaN, or OP1 = OP2). |
|
|
| -- Function: int mpfr_unordered_p (mpfr_t OP1, mpfr_t OP2) |
| Return non-zero if OP1 or OP2 is a NaN (i.e., they cannot be |
| compared), zero otherwise. |
|
|
| -- Function: int mpfr_total_order_p (mpfr_t X, mpfr_t Y) |
| This function implements the totalOrder predicate from IEEE 754, |
| where −NaN < −Inf < negative finite numbers < −0 < +0 < positive |
| finite numbers < +Inf < +NaN. It returns a non-zero value (true) |
| when X is smaller than or equal to Y for this order relation, and |
| zero (false) otherwise. Contrary to ‘mpfr_cmp (X, Y)’, which |
| returns a ternary value, ‘mpfr_total_order_p’ returns a binary |
| value (zero or non-zero). In particular, ‘mpfr_total_order_p (X, |
| X)’ returns true, ‘mpfr_total_order_p (-0, +0)’ returns true and |
| ‘mpfr_total_order_p (+0, -0)’ returns false. The sign bit of NaN |
| also matters. |
|
|
| |
| File: mpfr.info, Node: Transcendental Functions, Next: Input and Output Functions, Prev: Comparison Functions, Up: MPFR Interface |
|
|
| 5.7 Transcendental Functions |
| ============================ |
|
|
| All those functions, except explicitly stated (for example |
| ‘mpfr_sin_cos’), return a *note ternary value::, i.e., zero for an exact |
| return value, a positive value for a return value larger than the exact |
| result, and a negative value otherwise. |
|
|
| Important note: In some domains, computing transcendental functions |
| (even more with correct rounding) is expensive, even in small precision, |
| for example the trigonometric and Bessel functions with a large |
| argument. For some functions, the algorithm complexity and memory usage |
| does not depend only on the output precision: for instance, the memory |
| usage of ‘mpfr_rootn_ui’ is also linear in the argument K, and the |
| memory usage of the incomplete Gamma function also depends on the |
| precision of the input OP. It is also theoretically possible that some |
| functions on some particular inputs might be very hard to round (i.e. |
| the Table Maker’s Dilemma occurs in much larger precisions than normally |
| expected from the context), meaning that the internal precision needs to |
| be increased even more; but it is conjectured that the needed precision |
| has a reasonable bound (and in particular, that potentially exact cases |
| are known and can be detected efficiently). |
|
|
| -- Function: int mpfr_log (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_log_ui (mpfr_t ROP, unsigned long int OP, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_log2 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_log10 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the natural logarithm of OP, log2(OP) or log10(OP), |
| respectively, rounded in the direction RND. Set ROP to +0 if OP is |
| 1 (in all rounding modes), for consistency with the ISO C99 and |
| IEEE 754 standards. Set ROP to −Inf if OP is ±0 (i.e., the sign of |
| the zero has no influence on the result). |
|
|
| -- Function: int mpfr_log1p (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_log2p1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_log10p1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the logarithm of one plus OP (in radix two for |
| ‘mpfr_log2p1’, and in radix ten for ‘mpfr_log10p1’), rounded in the |
| direction RND. Set ROP to −Inf if OP is −1. |
|
|
| -- Function: int mpfr_exp (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_exp2 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_exp10 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the exponential of OP, to 2 power of OP or to 10 power |
| of OP, respectively, rounded in the direction RND. |
|
|
| -- Function: int mpfr_expm1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_exp2m1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_exp10m1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the exponential of OP followed by a subtraction by one |
| (resp. 2 power of OP followed by a subtraction by one, and 10 power |
| of OP followed by a subtraction by one), rounded in the direction |
| RND. |
|
|
| -- Function: int mpfr_pow (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_powr (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_pow_ui (mpfr_t ROP, mpfr_t OP1, unsigned long int |
| OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_pow_si (mpfr_t ROP, mpfr_t OP1, long int OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_pow_uj (mpfr_t ROP, mpfr_t OP1, uintmax_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_pow_sj (mpfr_t ROP, mpfr_t OP1, intmax_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_pown (mpfr_t ROP, mpfr_t OP1, intmax_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_pow_z (mpfr_t ROP, mpfr_t OP1, mpz_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_ui_pow_ui (mpfr_t ROP, unsigned long int OP1, |
| unsigned long int OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_ui_pow (mpfr_t ROP, unsigned long int OP1, mpfr_t |
| OP2, mpfr_rnd_t RND) |
| Set ROP to OP1 raised to OP2, rounded in the direction RND. The |
| ‘mpfr_powr’ function corresponds to the ‘powr’ function from |
| IEEE 754, i.e., it computes the exponential of OP2 multiplied by |
| the logarithm of OP1. The ‘mpfr_pown’ function is just an alias |
| for ‘mpfr_pow_sj’ (defined with ‘#define mpfr_pown mpfr_pow_sj’), |
| to follow the C2x function ‘pown’. Special values are handled as |
| described in the ISO C99 and IEEE 754 standards for the ‘pow’ |
| function: |
| • ‘pow(±0, Y)’ returns ±Inf for Y a negative odd integer. |
| • ‘pow(±0, Y)’ returns +Inf for Y negative and not an odd |
| integer. |
| • ‘pow(±0, Y)’ returns ±0 for Y a positive odd integer. |
| • ‘pow(±0, Y)’ returns +0 for Y positive and not an odd integer. |
| • ‘pow(-1, ±Inf)’ returns 1. |
| • ‘pow(+1, Y)’ returns 1 for any Y, even a NaN. |
| • ‘pow(X, ±0)’ returns 1 for any X, even a NaN. |
| • ‘pow(X, Y)’ returns NaN for finite negative X and finite |
| non-integer Y. |
| • ‘pow(X, -Inf)’ returns +Inf for 0 < abs(x) < 1, and +0 for |
| abs(x) > 1. |
| • ‘pow(X, +Inf)’ returns +0 for 0 < abs(x) < 1, and +Inf for |
| abs(x) > 1. |
| • ‘pow(-Inf, Y)’ returns −0 for Y a negative odd integer. |
| • ‘pow(-Inf, Y)’ returns +0 for Y negative and not an odd |
| integer. |
| • ‘pow(-Inf, Y)’ returns −Inf for Y a positive odd integer. |
| • ‘pow(-Inf, Y)’ returns +Inf for Y positive and not an odd |
| integer. |
| • ‘pow(+Inf, Y)’ returns +0 for Y negative, and +Inf for Y |
| positive. |
| Note: When 0 is of integer type, it is regarded as +0 by these |
| functions. We do not use the usual limit rules in this case, as |
| these rules are not used for ‘pow’. |
|
|
| -- Function: int mpfr_compound_si (mpfr_t ROP, mpfr_t OP, long int N, |
| mpfr_rnd_t RND) |
| Set ROP to the power N of one plus OP, following IEEE 754 for the |
| special cases and exceptions. In particular: |
| • When OP < −1, ROP is set to NaN. |
| • When N is zero and OP is NaN (like any value greater or equal |
| to −1), ROP is set to 1. |
| • When OP = −1, ROP is set to +Inf for N < 0, and to +0 for |
| N > 0. |
| The other special cases follow the usual rules. |
|
|
| -- Function: int mpfr_cos (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_sin (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_tan (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the cosine of OP, sine of OP, tangent of OP, rounded in |
| the direction RND. |
|
|
| -- Function: int mpfr_cosu (mpfr_t ROP, mpfr_t OP, unsigned long int U, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_sinu (mpfr_t ROP, mpfr_t OP, unsigned long int U, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_tanu (mpfr_t ROP, mpfr_t OP, unsigned long int U, |
| mpfr_rnd_t RND) |
| Set ROP to the cosine (resp. sine and tangent) of OP multiplied by |
| 2 Pi and divided by U. For example, if U equals 360, one gets the |
| cosine (resp. sine and tangent) for OP in degrees. For |
| ‘mpfr_cosu’, when OP multiplied by 2 and divided by U is a |
| half-integer, the result is +0, following IEEE 754 (cosPi), so that |
| the function is even. For ‘mpfr_sinu’, when OP multiplied by 2 and |
| divided by U is an integer, the result is zero with the same sign |
| as OP, following IEEE 754 (sinPi), so that the function is odd. |
| Similarly, the function ‘mpfr_tanu’ follows IEEE 754 (tanPi). |
|
|
| -- Function: int mpfr_cospi (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_sinpi (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_tanpi (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the cosine (resp. sine and tangent) of OP multiplied by |
| Pi. See the description of ‘mpfr_sinu’, ‘mpfr_cosu’ and |
| ‘mpfr_tanu’ for special values. |
|
|
| -- Function: int mpfr_sin_cos (mpfr_t SOP, mpfr_t COP, mpfr_t OP, |
| mpfr_rnd_t RND) |
| Set simultaneously SOP to the sine of OP and COP to the cosine of |
| OP, rounded in the direction RND with the corresponding precisions |
| of SOP and COP, which must be different variables. Return 0 iff |
| both results are exact, more precisely it returns s + 4c where |
| s = 0 if SOP is exact, s = 1 if SOP is larger than the sine of OP, |
| s = 2 if SOP is smaller than the sine of OP, and similarly for c |
| and the cosine of OP. |
|
|
| -- Function: int mpfr_sec (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_csc (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_cot (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the secant of OP, cosecant of OP, cotangent of OP, |
| rounded in the direction RND. |
|
|
| -- Function: int mpfr_acos (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_asin (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_atan (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the arc-cosine, arc-sine or arc-tangent of OP, rounded |
| in the direction RND. Note that since ‘acos(-1)’ returns the |
| floating-point number closest to Pi according to the given rounding |
| mode, this number might not be in the output range 0 <= ROP < Pi of |
| the arc-cosine function; still, the result lies in the image of the |
| output range by the rounding function. The same holds for |
| ‘asin(-1)’, ‘asin(1)’, ‘atan(-Inf)’, ‘atan(+Inf)’ or for ‘atan(OP)’ |
| with large OP and small precision of ROP. |
|
|
| -- Function: int mpfr_acosu (mpfr_t ROP, mpfr_t OP, unsigned long int |
| U, mpfr_rnd_t RND) |
| -- Function: int mpfr_asinu (mpfr_t ROP, mpfr_t OP, unsigned long int |
| U, mpfr_rnd_t RND) |
| -- Function: int mpfr_atanu (mpfr_t ROP, mpfr_t OP, unsigned long int |
| U, mpfr_rnd_t RND) |
| Set ROP to A multiplied by U and divided by 2 Pi, where A is the |
| arc-cosine (resp. arc-sine and arc-tangent) of OP. For example, if |
| U equals 360, ‘mpfr_acosu’ yields the arc-cosine in degrees. |
|
|
| -- Function: int mpfr_acospi (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_asinpi (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_atanpi (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to ‘acos(OP)’ (resp. ‘asin(OP)’ and ‘atan(OP)’) divided by |
| Pi. |
|
|
| -- Function: int mpfr_atan2 (mpfr_t ROP, mpfr_t Y, mpfr_t X, mpfr_rnd_t |
| RND) |
| -- Function: int mpfr_atan2u (mpfr_t ROP, mpfr_t Y, mpfr_t X, unsigned |
| long int U, mpfr_rnd_t RND) |
| -- Function: int mpfr_atan2pi (mpfr_t ROP, mpfr_t Y, mpfr_t X, |
| mpfr_rnd_t RND) |
| For ‘mpfr_atan2’, set ROP to the arc-tangent2 of Y and X, rounded |
| in the direction RND: if X > 0, then ‘atan2(Y, X)’ returns |
| atan(Y/X); if X < 0, then ‘atan2(Y, X)’ returns the sign of Y |
| multiplied by Pi − atan(abs(Y/X)), thus a number from −Pi to Pi. |
| As for ‘atan’, in case the exact mathematical result is +Pi or −Pi, |
| its rounded result might be outside the function output range. The |
| function ‘mpfr_atan2u’ behaves similarly, except the result is |
| multiplied by U and divided by 2 Pi; and ‘mpfr_atan2pi’ is the same |
| as ‘mpfr_atan2u’ with U = 2. For example, if U equals 360, |
| ‘mpfr_atan2u’ returns the arc-tangent in degrees, with values from |
| −180 to 180. |
|
|
| ‘atan2(Y, 0)’ does not raise any floating-point exception. Special |
| values are handled as described in the ISO C99 and IEEE 754 |
| standards for the ‘atan2’ function: |
| • ‘atan2(+0, -0)’ returns +Pi. |
| • ‘atan2(-0, -0)’ returns −Pi. |
| • ‘atan2(+0, +0)’ returns +0. |
| • ‘atan2(-0, +0)’ returns −0. |
| • ‘atan2(+0, X)’ returns +Pi for X < 0. |
| • ‘atan2(-0, X)’ returns −Pi for X < 0. |
| • ‘atan2(+0, X)’ returns +0 for X > 0. |
| • ‘atan2(-0, X)’ returns −0 for X > 0. |
| • ‘atan2(Y, 0)’ returns −Pi/2 for Y < 0. |
| • ‘atan2(Y, 0)’ returns +Pi/2 for Y > 0. |
| • ‘atan2(+Inf, -Inf)’ returns +3*Pi/4. |
| • ‘atan2(-Inf, -Inf)’ returns −3*Pi/4. |
| • ‘atan2(+Inf, +Inf)’ returns +Pi/4. |
| • ‘atan2(-Inf, +Inf)’ returns −Pi/4. |
| • ‘atan2(+Inf, X)’ returns +Pi/2 for finite X. |
| • ‘atan2(-Inf, X)’ returns −Pi/2 for finite X. |
| • ‘atan2(Y, -Inf)’ returns +Pi for finite Y > 0. |
| • ‘atan2(Y, -Inf)’ returns −Pi for finite Y < 0. |
| • ‘atan2(Y, +Inf)’ returns +0 for finite Y > 0. |
| • ‘atan2(Y, +Inf)’ returns −0 for finite Y < 0. |
|
|
| -- Function: int mpfr_cosh (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_sinh (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_tanh (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the hyperbolic cosine, sine or tangent of OP, rounded in |
| the direction RND. |
|
|
| -- Function: int mpfr_sinh_cosh (mpfr_t SOP, mpfr_t COP, mpfr_t OP, |
| mpfr_rnd_t RND) |
| Set simultaneously SOP to the hyperbolic sine of OP and COP to the |
| hyperbolic cosine of OP, rounded in the direction RND with the |
| corresponding precision of SOP and COP, which must be different |
| variables. Return 0 iff both results are exact (see ‘mpfr_sin_cos’ |
| for a more detailed description of the return value). |
|
|
| -- Function: int mpfr_sech (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_csch (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_coth (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the hyperbolic secant of OP, cosecant of OP, cotangent |
| of OP, rounded in the direction RND. |
|
|
| -- Function: int mpfr_acosh (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_asinh (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_atanh (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the inverse hyperbolic cosine, sine or tangent of OP, |
| rounded in the direction RND. |
|
|
| -- Function: int mpfr_eint (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the exponential integral of OP, rounded in the direction |
| RND. This is the sum of Euler’s constant, of the logarithm of the |
| absolute value of OP, and of the sum for k from 1 to infinity of OP |
| to the power k, divided by k and the factorial of k. For positive |
| OP, it corresponds to the Ei function at OP (see formula 5.1.10 |
| from the Handbook of Mathematical Functions from Abramowitz and |
| Stegun), and for negative OP, to the opposite of the E1 function |
| (sometimes called eint1) at −OP (formula 5.1.1 from the same |
| reference). |
|
|
| -- Function: int mpfr_li2 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to real part of the dilogarithm of OP, rounded in the |
| direction RND. MPFR defines the dilogarithm function as the |
| integral of −log(1−t)/t from 0 to OP. |
|
|
| -- Function: int mpfr_gamma (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_gamma_inc (mpfr_t ROP, mpfr_t OP, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to the value of the Gamma function on OP, resp. the |
| incomplete Gamma function on OP and OP2, rounded in the direction |
| RND. (In the literature, ‘mpfr_gamma_inc’ is called upper |
| incomplete Gamma function, or sometimes complementary incomplete |
| Gamma function.) For ‘mpfr_gamma’ (and ‘mpfr_gamma_inc’ when OP2 |
| is zero), when OP is a negative integer, ROP is set to NaN. |
|
|
| Note: the current implementation of ‘mpfr_gamma_inc’ is slow for |
| large values of ROP or OP, in which case some internal overflow |
| might also occur. |
|
|
| -- Function: int mpfr_lngamma (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the value of the logarithm of the Gamma function on OP, |
| rounded in the direction RND. When OP is 1 or 2, set ROP to +0 (in |
| all rounding modes). When OP is an infinity or a non-positive |
| integer, set ROP to +Inf, following the general rules on special |
| values. When −2k − 1 < OP < −2k, k being a non-negative integer, |
| set ROP to NaN. See also ‘mpfr_lgamma’. |
|
|
| -- Function: int mpfr_lgamma (mpfr_t ROP, int *SIGNP, mpfr_t OP, |
| mpfr_rnd_t RND) |
| Set ROP to the value of the logarithm of the absolute value of the |
| Gamma function on OP, rounded in the direction RND. The sign (1 or |
| −1) of Gamma(OP) is returned in the object pointed to by SIGNP. |
| When OP is 1 or 2, set ROP to +0 (in all rounding modes). When OP |
| is an infinity or a non-positive integer, set ROP to +Inf. When OP |
| is NaN, −Inf or a negative integer, *SIGNP is undefined, and when |
| OP is ±0, *SIGNP is the sign of the zero. |
|
|
| -- Function: int mpfr_digamma (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the value of the Digamma (sometimes also called Psi) |
| function on OP, rounded in the direction RND. When OP is a |
| negative integer, set ROP to NaN. |
|
|
| -- Function: int mpfr_beta (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to the value of the Beta function at arguments OP1 and OP2. |
| Note: the current code does not try to avoid internal overflow or |
| underflow, and might use a huge internal precision in some cases. |
|
|
| -- Function: int mpfr_zeta (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_zeta_ui (mpfr_t ROP, unsigned long int OP, |
| mpfr_rnd_t RND) |
| Set ROP to the value of the Riemann Zeta function on OP, rounded in |
| the direction RND. |
|
|
| -- Function: int mpfr_erf (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_erfc (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the value of the error function on OP (resp. the |
| complementary error function on OP) rounded in the direction RND. |
|
|
| -- Function: int mpfr_j0 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_j1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_jn (mpfr_t ROP, long int N, mpfr_t OP, mpfr_rnd_t |
| RND) |
| Set ROP to the value of the first kind Bessel function of order 0, |
| (resp. 1 and N) on OP, rounded in the direction RND. When OP is |
| NaN, ROP is always set to NaN. When OP is positive or negative |
| infinity, ROP is set to +0. When OP is zero, and N is not zero, |
| ROP is set to +0 or −0 depending on the parity and sign of N, and |
| the sign of OP. |
|
|
| -- Function: int mpfr_y0 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_y1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_yn (mpfr_t ROP, long int N, mpfr_t OP, mpfr_rnd_t |
| RND) |
| Set ROP to the value of the second kind Bessel function of order 0 |
| (resp. 1 and N) on OP, rounded in the direction RND. When OP is |
| NaN or negative, ROP is always set to NaN. When OP is +Inf, ROP is |
| set to +0. When OP is zero, ROP is set to +Inf or −Inf depending |
| on the parity and sign of N. |
|
|
| -- Function: int mpfr_agm (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to the arithmetic-geometric mean of OP1 and OP2, rounded in |
| the direction RND. The arithmetic-geometric mean is the common |
| limit of the sequences u_n and v_n, where u_0 = OP1, v_0 = OP2, |
| u_(n+1) is the arithmetic mean of u_n and v_n, and v_(n+1) is the |
| geometric mean of u_n and v_n. If any operand is negative and the |
| other one is not zero, set ROP to NaN. If any operand is zero and |
| the other one is finite (resp. infinite), set ROP to +0 (resp. |
| NaN). |
|
|
| -- Function: int mpfr_ai (mpfr_t ROP, mpfr_t X, mpfr_rnd_t RND) |
| Set ROP to the value of the Airy function Ai on X, rounded in the |
| direction RND. When X is NaN, ROP is always set to NaN. When X is |
| +Inf or −Inf, ROP is +0. The current implementation is not |
| intended to be used with large arguments. It works with abs(X) |
| typically smaller than 500. For larger arguments, other methods |
| should be used and will be implemented in a future version. |
|
|
| -- Function: int mpfr_const_log2 (mpfr_t ROP, mpfr_rnd_t RND) |
| -- Function: int mpfr_const_pi (mpfr_t ROP, mpfr_rnd_t RND) |
| -- Function: int mpfr_const_euler (mpfr_t ROP, mpfr_rnd_t RND) |
| -- Function: int mpfr_const_catalan (mpfr_t ROP, mpfr_rnd_t RND) |
| Set ROP to the logarithm of 2, the value of Pi, of Euler’s constant |
| 0.577..., of Catalan’s constant 0.915..., respectively, rounded in |
| the direction RND. These functions cache the computed values to |
| avoid other calculations if a lower or equal precision is |
| requested. To free these caches, use ‘mpfr_free_cache’ or |
| ‘mpfr_free_cache2’. |
|
|
| |
| File: mpfr.info, Node: Input and Output Functions, Next: Formatted Output Functions, Prev: Transcendental Functions, Up: MPFR Interface |
|
|
| 5.8 Input and Output Functions |
| ============================== |
|
|
| This section describes functions that perform input from an input/output |
| stream, and functions that output to an input/output stream. Passing a |
| null pointer for a ‘stream’ to any of these functions will make them |
| read from ‘stdin’ and write to ‘stdout’, respectively. |
|
|
| When using a function that takes a ‘FILE *’ argument, you must |
| include the ‘<stdio.h>’ standard header before ‘mpfr.h’, to allow |
| ‘mpfr.h’ to define prototypes for these functions. |
|
|
| -- Function: size_t mpfr_out_str (FILE *STREAM, int BASE, size_t N, |
| mpfr_t OP, mpfr_rnd_t RND) |
| Output OP on stream STREAM as a text string in base abs(BASE), |
| rounded in the direction RND. The base may vary from 2 to 62 or |
| from −2 to −36 (any other value yields undefined behavior). The |
| argument N has the same meaning as in ‘mpfr_get_str’ (*note |
| mpfr_get_str::): Print N significant digits exactly, or if N is 0, |
| the number ‘mpfr_get_str_ndigits (BASE, P)’, where P is the |
| precision of OP (*note mpfr_get_str_ndigits::). |
|
|
| If the input is NaN, +Inf, −Inf, +0, or −0, then ‘@NaN@’, ‘@Inf@’, |
| ‘-@Inf@’, ‘0’, or ‘-0’ is output, respectively. |
|
|
| For the regular numbers, the format of the output is the following: |
| the most significant digit, then a decimal-point character (defined |
| by the current locale), then the remaining N − 1 digits (including |
| trailing zeros), then the exponent prefix, then the exponent in |
| decimal. The exponent prefix is ‘e’ when abs(BASE) <= 10, and ‘@’ |
| when abs(BASE) > 10. *Note mpfr_get_str:: for information on the |
| digits depending on the base. |
|
|
| Return the number of characters written, or if an error occurred, |
| return 0. |
|
|
| -- Function: size_t mpfr_inp_str (mpfr_t ROP, FILE *STREAM, int BASE, |
| mpfr_rnd_t RND) |
| Input a string in base BASE from stream STREAM, rounded in the |
| direction RND, and put the read float in ROP. |
|
|
| After skipping optional whitespace (as defined by ‘isspace’, which |
| depends on the current locale), this function reads a word, defined |
| as the longest sequence of non-whitespace characters, and parses it |
| using ‘mpfr_set_str’. See the documentation of ‘mpfr_strtofr’ for |
| a detailed description of the valid string formats. |
|
|
| Return the number of bytes read (including the leading whitespace, |
| if any), or if the string format is invalid or an error occurred, |
| return 0. |
|
|
| -- Function: int mpfr_fpif_export (FILE *STREAM, mpfr_t OP) |
| Export the number OP to the stream STREAM in a floating-point |
| interchange format. In particular one can export on a 32-bit |
| computer and import on a 64-bit computer, or export on a |
| little-endian computer and import on a big-endian computer. The |
| precision of OP and the sign bit of a NaN are stored too. Return 0 |
| iff the export was successful. |
|
|
| Note: this function is experimental and its interface might change |
| in future versions. |
|
|
| -- Function: int mpfr_fpif_import (mpfr_t OP, FILE *STREAM) |
| Import the number OP from the stream STREAM in a floating-point |
| interchange format (see ‘mpfr_fpif_export’). Note that the |
| precision of OP is set to the one read from the stream, and the |
| sign bit is always retrieved (even for NaN). If the stored |
| precision is zero or greater than ‘MPFR_PREC_MAX’, the function |
| fails (it returns non-zero) and OP is unchanged. If the function |
| fails for another reason, OP is set to NaN and it is unspecified |
| whether the precision of OP has changed to the one read from the |
| file. Return 0 iff the import was successful. |
|
|
| Note: this function is experimental and its interface might change |
| in future versions. |
|
|
| -- Function: void mpfr_dump (mpfr_t OP) |
| Output OP on ‘stdout’ in some unspecified format, then a newline |
| character. This function is mainly for debugging purpose. Thus |
| invalid data may be supported. Everything that is not specified |
| may change without breaking the ABI and may depend on the |
| environment. |
|
|
| The current output format is the following: a minus sign if the |
| sign bit is set (even for NaN); ‘@NaN@’, ‘@Inf@’ or ‘0’ if the |
| argument is NaN, an infinity or zero, respectively; otherwise the |
| remaining of the output is as follows: ‘0.’ then the p bits of the |
| binary significand, where p is the precision of the number; if the |
| trailing bits are not all zeros (which must not occur with valid |
| data), they are output enclosed by square brackets; the character |
| ‘E’ followed by the exponent written in base 10; in case of invalid |
| data or out-of-range exponent, this function outputs three |
| exclamation marks (‘!!!’), followed by flags, followed by three |
| exclamation marks (‘!!!’) again. These flags are: ‘N’ if the most |
| significant bit of the significand is 0 (i.e., the number is not |
| normalized); ‘T’ if there are non-zero trailing bits; ‘U’ if this |
| is an UBF number (internal use only); ‘<’ if the exponent is less |
| than the current minimum exponent; ‘>’ if the exponent is greater |
| than the current maximum exponent. |
|
|
| |
| File: mpfr.info, Node: Formatted Output Functions, Next: Integer and Remainder Related Functions, Prev: Input and Output Functions, Up: MPFR Interface |
|
|
| 5.9 Formatted Output Functions |
| ============================== |
|
|
| 5.9.1 Requirements |
| ------------------ |
|
|
| The class of ‘mpfr_printf’ functions provides formatted output in a |
| similar manner as the standard C ‘printf’. These functions are defined |
| only if your system supports ISO C variadic functions and the |
| corresponding argument access macros. |
|
|
| When using any of these functions, you must include the ‘<stdio.h>’ |
| standard header before ‘mpfr.h’, to allow ‘mpfr.h’ to define prototypes |
| for these functions. |
|
|
| 5.9.2 Format String |
| ------------------- |
|
|
| The format specification accepted by ‘mpfr_printf’ is an extension of |
| the ‘gmp_printf’ one (itself, an extension of the ‘printf’ one). The |
| conversion specification is of the form: |
|
|
| % [flags] [width] [.[precision]] [type] [rounding] conv |
|
|
| ‘flags’, ‘width’, and ‘precision’ have the same meaning as for the |
| standard ‘printf’ (in particular, notice that the precision is related |
| to the number of digits displayed in the base chosen by ‘conv’ and not |
| related to the internal precision of the ‘mpfr_t’ variable), but note |
| that for ‘Re’, the default precision is not the same as the one for ‘e’. |
| ‘mpfr_printf’ accepts the same ‘type’ specifiers as GMP (except the |
| non-standard and deprecated ‘q’, use ‘ll’ instead), namely the length |
| modifiers defined in the C standard: |
|
|
| ‘h’ ‘short’ |
| ‘hh’ ‘char’ |
| ‘j’ ‘intmax_t’ or ‘uintmax_t’ |
| ‘l’ ‘long’ or ‘wchar_t’ |
| ‘ll’ ‘long long’ |
| ‘L’ ‘long double’ |
| ‘t’ ‘ptrdiff_t’ |
| ‘z’ ‘size_t’ |
|
|
| and the ‘type’ specifiers defined in GMP, plus ‘R’ and ‘P’, which are |
| specific to MPFR (the second column in the table below shows the type of |
| the argument read in the argument list and the kind of ‘conv’ specifier |
| to use after the ‘type’ specifier): |
|
|
| ‘F’ ‘mpf_t’, float conversions |
| ‘Q’ ‘mpq_t’, integer conversions |
| ‘M’ ‘mp_limb_t’, integer conversions |
| ‘N’ ‘mp_limb_t’ array, integer conversions |
| ‘Z’ ‘mpz_t’, integer conversions |
| |
| ‘P’ ‘mpfr_prec_t’, integer conversions |
| ‘R’ ‘mpfr_t’, float conversions |
|
|
| The ‘type’ specifiers have the same restrictions as those mentioned |
| in the GMP documentation: *note (gmp.info)Formatted Output Strings::. |
| In particular, the ‘type’ specifiers (except ‘R’ and ‘P’) are supported |
| only if they are supported by ‘gmp_printf’ in your GMP build; this |
| implies that the standard specifiers, such as ‘t’, must _also_ be |
| supported by your C library if you want to use them. |
|
|
| The ‘rounding’ field is specific to ‘mpfr_t’ arguments and should not |
| be used with other types. |
|
|
| With conversion specification not involving ‘P’ and ‘R’ types, |
| ‘mpfr_printf’ behaves exactly as ‘gmp_printf’. |
|
|
| Thus the ‘conv’ specifier ‘F’ is not supported (due to the use of ‘F’ |
| as the ‘type’ specifier for ‘mpf_t’), except for the ‘type’ specifier |
| ‘R’ (i.e., for ‘mpfr_t’ arguments). |
|
|
| The ‘P’ type specifies that a following ‘d’, ‘i’, ‘o’, ‘u’, ‘x’, or |
| ‘X’ conversion specifier applies to a ‘mpfr_prec_t’ argument. It is |
| needed because the ‘mpfr_prec_t’ type does not necessarily correspond to |
| an ‘int’ or any fixed standard type. The ‘precision’ value specifies |
| the minimum number of digits to appear. The default precision is 1. |
| For example: |
| mpfr_t x; |
| mpfr_prec_t p; |
| mpfr_init (x); |
| ... |
| p = mpfr_get_prec (x); |
| mpfr_printf ("variable x with %Pd bits", p); |
|
|
| The ‘R’ type specifies that a following ‘a’, ‘A’, ‘b’, ‘e’, ‘E’, ‘f’, |
| ‘F’, ‘g’, ‘G’, or ‘n’ conversion specifier applies to a ‘mpfr_t’ |
| argument. The ‘R’ type can be followed by a ‘rounding’ specifier |
| denoted by one of the following characters: |
|
|
| ‘U’ round toward positive infinity |
| ‘D’ round toward negative infinity |
| ‘Y’ round away from zero |
| ‘Z’ round toward zero |
| ‘N’ round to nearest (with ties to even) |
| ‘*’ rounding mode indicated by the |
| ‘mpfr_rnd_t’ argument just before the |
| corresponding ‘mpfr_t’ variable. |
|
|
| The default rounding mode is rounding to nearest. The following |
| three examples are equivalent: |
| mpfr_t x; |
| mpfr_init (x); |
| ... |
| mpfr_printf ("%.128Rf", x); |
| mpfr_printf ("%.128RNf", x); |
| mpfr_printf ("%.128R*f", MPFR_RNDN, x); |
|
|
| Note that the rounding away from zero mode is specified with ‘Y’ |
| because ISO C reserves the ‘A’ specifier for hexadecimal output (see |
| below). |
|
|
| The output ‘conv’ specifiers allowed with ‘mpfr_t’ parameter are: |
|
|
| ‘a’ ‘A’ hex float, C99 style |
| ‘b’ binary output |
| ‘e’ ‘E’ scientific-format float |
| ‘f’ ‘F’ fixed-point float |
| ‘g’ ‘G’ fixed-point or scientific float |
|
|
| The conversion specifier ‘b’, which displays the argument in binary, |
| is specific to ‘mpfr_t’ arguments and should not be used with other |
| types. Other conversion specifiers have the same meaning as for a |
| ‘double’ argument. |
|
|
| In case of non-decimal output, only the significand is written in the |
| specified base, the exponent is always displayed in decimal. |
|
|
| Non-real values are always displayed as ‘nan’ / ‘inf’ for the ‘a’, |
| ‘b’, ‘e’, ‘f’, and ‘g’ specifiers, and ‘NAN’ / ‘INF’ for ‘A’, ‘E’, ‘F’, |
| and ‘G’ specifiers, possibly preceded by a sign or a space (the minus |
| sign when the value has a negative sign, the plus sign when the value |
| has a positive sign and the ‘+’ flag is used, a space when the value has |
| a positive sign and the _space_ flag is used). |
|
|
| The ‘mpfr_t’ number is rounded to the given precision in the |
| direction specified by the rounding mode (see below if the precision is |
| missing). Similarly to the native C types, the precision is the number |
| of digits output after the decimal-point character, except for the ‘g’ |
| and ‘G’ conversion specifiers, where it is the number of significant |
| digits (but trailing zeros of the fractional part are not output by |
| default), or 1 if the precision is zero. If the precision is zero with |
| rounding to nearest mode and one of the following conversion specifiers: |
| ‘a’, ‘A’, ‘b’, ‘e’, ‘E’, tie case is rounded to even when it lies |
| between two consecutive values at the wanted precision which have the |
| same exponent, otherwise, it is rounded away from zero. For instance, |
| 85 is displayed as ‘8e+1’ and 95 is displayed as ‘1e+2’ with the format |
| specification ‘"%.0RNe"’. This also applies when the ‘g’ (resp. ‘G’) |
| conversion specifier uses the ‘e’ (resp. ‘E’) style. If the precision |
| is set to a value greater than the maximum value for an ‘int’, it will |
| be silently reduced down to ‘INT_MAX’. |
|
|
| If the precision is missing, it is chosen as follows, depending on |
| the conversion specifier. |
| • With ‘a’, ‘A’, and ‘b’, it is chosen to have an exact |
| representation with no trailing zeros. |
| • With ‘e’ and ‘E’, it is ceil(p times log(2)/log(10)), where p is |
| the precision of the input variable, matching the choice done for |
| ‘mpfr_get_str’; thus, if rounding to nearest is used, outputting |
| the value with a missing precision and reading it back will yield |
| the original value. |
| • With ‘f’, ‘F’, ‘g’, and ‘G’, it is 6. |
|
|
| 5.9.3 Functions |
| --------------- |
|
|
| For all the following functions, if the number of characters that ought |
| to be written exceeds the maximum limit ‘INT_MAX’ for an ‘int’, nothing |
| is written in the stream (resp. to ‘stdout’, to BUF, to STR), the |
| function returns −1, sets the _erange_ flag, and ‘errno’ is set to |
| ‘EOVERFLOW’ if the ‘EOVERFLOW’ macro is defined (such as on POSIX |
| systems). Note, however, that ‘errno’ might be changed to another value |
| by some internal library call if another error occurs there (currently, |
| this would come from the unallocation function). |
|
|
| -- Function: int mpfr_fprintf (FILE *STREAM, const char *TEMPLATE, ...) |
| -- Function: int mpfr_vfprintf (FILE *STREAM, const char *TEMPLATE, |
| va_list AP) |
| Print to the stream STREAM the optional arguments under the control |
| of the template string TEMPLATE. Return the number of characters |
| written or a negative value if an error occurred. |
|
|
| -- Function: int mpfr_printf (const char *TEMPLATE, ...) |
| -- Function: int mpfr_vprintf (const char *TEMPLATE, va_list AP) |
| Print to ‘stdout’ the optional arguments under the control of the |
| template string TEMPLATE. Return the number of characters written |
| or a negative value if an error occurred. |
|
|
| -- Function: int mpfr_sprintf (char *BUF, const char *TEMPLATE, ...) |
| -- Function: int mpfr_vsprintf (char *BUF, const char *TEMPLATE, |
| va_list AP) |
| Form a null-terminated string corresponding to the optional |
| arguments under the control of the template string TEMPLATE, and |
| print it in BUF. No overlap is permitted between BUF and the other |
| arguments. Return the number of characters written in the array |
| BUF _not counting_ the terminating null character or a negative |
| value if an error occurred. |
|
|
| -- Function: int mpfr_snprintf (char *BUF, size_t N, const char |
| |
| -- Function: int mpfr_vsnprintf (char *BUF, size_t N, const char |
| |
| Form a null-terminated string corresponding to the optional |
| arguments under the control of the template string TEMPLATE, and |
| print it in BUF. If N is zero, nothing is written and BUF may be a |
| null pointer, otherwise, the first N − 1 characters are written in |
| BUF and the N-th one is a null character. Return the number of |
| characters that would have been written had N been sufficiently |
| large, _not counting_ the terminating null character, or a negative |
| value if an error occurred. |
|
|
| -- Function: int mpfr_asprintf (char **STR, const char *TEMPLATE, ...) |
| -- Function: int mpfr_vasprintf (char **STR, const char *TEMPLATE, |
| va_list AP) |
| Write their output as a null terminated string in a block of memory |
| allocated using the allocation function (*note Memory Handling::). |
| A pointer to the block is stored in STR. The block of memory must |
| be freed using ‘mpfr_free_str’. The return value is the number of |
| characters written in the string, excluding the null-terminator, or |
| a negative value if an error occurred, in which case the contents |
| of STR are undefined. |
|
|
| |
| File: mpfr.info, Node: Integer and Remainder Related Functions, Next: Rounding-Related Functions, Prev: Formatted Output Functions, Up: MPFR Interface |
|
|
| 5.10 Integer and Remainder Related Functions |
| ============================================ |
|
|
| -- Function: int mpfr_rint (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_ceil (mpfr_t ROP, mpfr_t OP) |
| -- Function: int mpfr_floor (mpfr_t ROP, mpfr_t OP) |
| -- Function: int mpfr_round (mpfr_t ROP, mpfr_t OP) |
| -- Function: int mpfr_roundeven (mpfr_t ROP, mpfr_t OP) |
| -- Function: int mpfr_trunc (mpfr_t ROP, mpfr_t OP) |
| Set ROP to OP rounded to an integer. ‘mpfr_rint’ rounds to the |
| nearest representable integer in the given direction RND, and the |
| other five functions behave in a similar way with some fixed |
| rounding mode: |
| • ‘mpfr_ceil’: to the next higher or equal representable integer |
| (like ‘mpfr_rint’ with ‘MPFR_RNDU’); |
| • ‘mpfr_floor’ to the next lower or equal representable integer |
| (like ‘mpfr_rint’ with ‘MPFR_RNDD’); |
| • ‘mpfr_round’ to the nearest representable integer, rounding |
| halfway cases away from zero (as in the roundTiesToAway mode |
| of IEEE 754); |
| • ‘mpfr_roundeven’ to the nearest representable integer, |
| rounding halfway cases with the even-rounding rule (like |
| ‘mpfr_rint’ with ‘MPFR_RNDN’); |
| • ‘mpfr_trunc’ to the next representable integer toward zero |
| (like ‘mpfr_rint’ with ‘MPFR_RNDZ’). |
| When OP is a zero or an infinity, set ROP to the same value (with |
| the same sign). |
|
|
| The return value is zero when the result is exact, positive when it |
| is greater than the original value of OP, and negative when it is |
| smaller. More precisely, the return value is 0 when OP is an |
| integer representable in ROP, 1 or −1 when OP is an integer that is |
| not representable in ROP, 2 or −2 when OP is not an integer. |
|
|
| When OP is NaN, the NaN flag is set as usual. In the other cases, |
| the inexact flag is set when ROP differs from OP, following the ISO |
| C99 rule for the ‘rint’ function. If you want the behavior to be |
| more like IEEE 754 / ISO TS 18661-1, i.e., the usual behavior where |
| the round-to-integer function is regarded as any other mathematical |
| function, you should use one of the ‘mpfr_rint_*’ functions |
| instead. |
|
|
| Note that no double rounding is performed; for instance, 10.5 |
| (1010.1 in binary) is rounded by ‘mpfr_rint’ with rounding to |
| nearest to 12 (1100 in binary) in 2-bit precision, because the two |
| enclosing numbers representable on two bits are 8 and 12, and the |
| closest is 12. (If one first rounded to an integer, one would |
| round 10.5 to 10 with even rounding, and then 10 would be rounded |
| to 8 again with even rounding.) |
|
|
| -- Function: int mpfr_rint_ceil (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| -- Function: int mpfr_rint_floor (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t |
| RND) |
| -- Function: int mpfr_rint_round (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t |
| RND) |
| -- Function: int mpfr_rint_roundeven (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t |
| RND) |
| -- Function: int mpfr_rint_trunc (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t |
| RND) |
| Set ROP to OP rounded to an integer: |
| • ‘mpfr_rint_ceil’: to the next higher or equal integer; |
| • ‘mpfr_rint_floor’: to the next lower or equal integer; |
| • ‘mpfr_rint_round’: to the nearest integer, rounding halfway |
| cases away from zero; |
| • ‘mpfr_rint_roundeven’: to the nearest integer, rounding |
| halfway cases to the nearest even integer; |
| • ‘mpfr_rint_trunc’ to the next integer toward zero. |
| If the result is not representable, it is rounded in the direction |
| RND. When OP is a zero or an infinity, set ROP to the same value |
| (with the same sign). The return value is the ternary value |
| associated with the considered round-to-integer function (regarded |
| in the same way as any other mathematical function). |
|
|
| Contrary to ‘mpfr_rint’, those functions do perform a double |
| rounding: first OP is rounded to the nearest integer in the |
| direction given by the function name, then this nearest integer (if |
| not representable) is rounded in the given direction RND. Thus |
| these round-to-integer functions behave more like the other |
| mathematical functions, i.e., the returned result is the correct |
| rounding of the exact result of the function in the real numbers. |
|
|
| For example, ‘mpfr_rint_round’ with rounding to nearest and a |
| precision of two bits rounds 6.5 to 7 (halfway cases away from |
| zero), then 7 is rounded to 8 by the round-even rule, despite the |
| fact that 6 is also representable on two bits, and is closer to 6.5 |
| than 8. |
|
|
| -- Function: int mpfr_frac (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND) |
| Set ROP to the fractional part of OP, having the same sign as OP, |
| rounded in the direction RND (unlike in ‘mpfr_rint’, RND affects |
| only how the exact fractional part is rounded, not how the |
| fractional part is generated). When OP is an integer or an |
| infinity, set ROP to zero with the same sign as OP. |
|
|
| -- Function: int mpfr_modf (mpfr_t IOP, mpfr_t FOP, mpfr_t OP, |
| mpfr_rnd_t RND) |
| Set simultaneously IOP to the integral part of OP and FOP to the |
| fractional part of OP, rounded in the direction RND with the |
| corresponding precision of IOP and FOP (equivalent to |
| ‘mpfr_trunc(IOP, OP, RND)’ and ‘mpfr_frac(FOP, OP, RND)’). The |
| variables IOP and FOP must be different. Return 0 iff both results |
| are exact (see ‘mpfr_sin_cos’ for a more detailed description of |
| the return value). |
|
|
| -- Function: int mpfr_fmod (mpfr_t R, mpfr_t X, mpfr_t Y, mpfr_rnd_t |
| RND) |
| -- Function: int mpfr_fmod_ui (mpfr_t R, mpfr_t X, unsigned long int Y, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_fmodquo (mpfr_t R, long int* Q, mpfr_t X, mpfr_t |
| Y, mpfr_rnd_t RND) |
| -- Function: int mpfr_remainder (mpfr_t R, mpfr_t X, mpfr_t Y, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_remquo (mpfr_t R, long int* Q, mpfr_t X, mpfr_t |
| Y, mpfr_rnd_t RND) |
| Set R to the value of X − NY, rounded according to the direction |
| RND, where N is the integer quotient of X divided by Y, defined as |
| follows: N is rounded toward zero for ‘mpfr_fmod’, ‘mpfr_fmod_ui’ |
| and ‘mpfr_fmodquo’, and to the nearest integer (ties rounded to |
| even) for ‘mpfr_remainder’ and ‘mpfr_remquo’. |
|
|
| Special values are handled as described in Section F.9.7.1 of the |
| ISO C99 standard: If X is infinite or Y is zero, R is NaN. If Y is |
| infinite and X is finite, R is X rounded to the precision of R. If |
| R is zero, it has the sign of X. The return value is the ternary |
| value corresponding to R. |
|
|
| Additionally, ‘mpfr_fmodquo’ and ‘mpfr_remquo’ store the low |
| significant bits from the quotient N in *Q (more precisely the |
| number of bits in a ‘long int’ minus one), with the sign of X |
| divided by Y (except if those low bits are all zero, in which case |
| zero is returned). If the result is NaN, the value of *Q is |
| unspecified. Note that X may be so large in magnitude relative to |
| Y that an exact representation of the quotient is not practical. |
| The ‘mpfr_remainder’ and ‘mpfr_remquo’ functions are useful for |
| additive argument reduction. |
|
|
| -- Function: int mpfr_integer_p (mpfr_t OP) |
| Return non-zero iff OP is an integer. |
|
|
| |
| File: mpfr.info, Node: Rounding-Related Functions, Next: Miscellaneous Functions, Prev: Integer and Remainder Related Functions, Up: MPFR Interface |
|
|
| 5.11 Rounding-Related Functions |
| =============================== |
|
|
| -- Function: void mpfr_set_default_rounding_mode (mpfr_rnd_t RND) |
| Set the default rounding mode to RND. The default rounding mode is |
| to nearest initially. |
|
|
| -- Function: mpfr_rnd_t mpfr_get_default_rounding_mode (void) |
| Get the default rounding mode. |
|
|
| -- Function: int mpfr_prec_round (mpfr_t X, mpfr_prec_t PREC, |
| mpfr_rnd_t RND) |
| Round X according to RND with precision PREC, which must be an |
| integer between ‘MPFR_PREC_MIN’ and ‘MPFR_PREC_MAX’ (otherwise the |
| behavior is undefined). If PREC is greater than or equal to the |
| precision of X, then new space is allocated for the significand, |
| and it is filled with zeros. Otherwise, the significand is rounded |
| to precision PREC with the given direction; no memory reallocation |
| to free the unused limbs is done. In both cases, the precision of |
| X is changed to PREC. |
|
|
| Here is an example of how to use ‘mpfr_prec_round’ to implement |
| Newton’s algorithm to compute the inverse of A, assuming X is |
| already an approximation to N bits: |
| mpfr_set_prec (t, 2 * n); |
| mpfr_set (t, a, MPFR_RNDN); |
| mpfr_mul (t, t, x, MPFR_RNDN); |
| mpfr_ui_sub (t, 1, t, MPFR_RNDN); |
| mpfr_prec_round (t, n, MPFR_RNDN); |
| mpfr_mul (t, t, x, MPFR_RNDN); |
| mpfr_prec_round (x, 2 * n, MPFR_RNDN); |
| mpfr_add (x, x, t, MPFR_RNDN); |
|
|
| Warning! You must not use this function if X was initialized with |
| ‘MPFR_DECL_INIT’ or with ‘mpfr_custom_init_set’ (*note Custom |
| Interface::). |
|
|
| -- Function: int mpfr_can_round (mpfr_t B, mpfr_exp_t ERR, mpfr_rnd_t |
| RND1, mpfr_rnd_t RND2, mpfr_prec_t PREC) |
| Assuming B is an approximation of an unknown number X in the |
| direction RND1 with error at most two to the power EXP(B) − ERR |
| where EXP(B) is the exponent of B, return a non-zero value if one |
| is able to round correctly X to precision PREC with the direction |
| RND2 assuming an unbounded exponent range, and 0 otherwise |
| (including for NaN and Inf). In other words, if the error on B is |
| bounded by two to the power K ulps, and B has precision PREC, you |
| should give ERR = PREC − K. This function *does not modify* its |
| arguments. |
|
|
| If RND1 is ‘MPFR_RNDN’ or ‘MPFR_RNDF’, the error is considered to |
| be either positive or negative, thus the possible range is twice as |
| large as with a directed rounding for RND1 (with the same value of |
| ERR). |
|
|
| When RND2 is ‘MPFR_RNDF’, let RND3 be the opposite direction if |
| RND1 is a directed rounding, and ‘MPFR_RNDN’ if RND1 is ‘MPFR_RNDN’ |
| or ‘MPFR_RNDF’. The returned value of ‘mpfr_can_round (b, err, |
| rnd1, MPFR_RNDF, prec)’ is non-zero iff after the call ‘mpfr_set |
| (y, b, rnd3)’ with Y of precision PREC, Y is guaranteed to be a |
| faithful rounding of X. |
|
|
| Note: The *note ternary value:: cannot be determined in general |
| with this function. However, if it is known that the exact value |
| is not exactly representable in precision PREC, then one can use |
| the following trick to determine the (non-zero) ternary value in |
| any rounding mode RND2 (note that ‘MPFR_RNDZ’ below can be replaced |
| by any directed rounding mode): |
| if (mpfr_can_round (b, err, MPFR_RNDN, MPFR_RNDZ, |
| prec + (rnd2 == MPFR_RNDN))) |
| { |
| |
| |
| inex = mpfr_set (r, b, rnd2); |
| } |
| Indeed, if RND2 is ‘MPFR_RNDN’, this will check if one can round to |
| PREC + 1 bits with a directed rounding: if so, one can surely round |
| to nearest to PREC bits, and in addition one can determine the |
| correct ternary value, which would not be the case when B is near |
| from a value exactly representable on PREC bits. |
|
|
| A detailed example is available in the ‘examples’ subdirectory, |
| file ‘can_round.c’. |
|
|
| -- Function: mpfr_prec_t mpfr_min_prec (mpfr_t X) |
| Return the minimal number of bits required to store the significand |
| of X, and 0 for special values, including 0. |
|
|
| -- Function: const char * mpfr_print_rnd_mode (mpfr_rnd_t RND) |
| Return a string (‘"MPFR_RNDN"’, ‘"MPFR_RNDZ"’, ‘"MPFR_RNDU"’, |
| ‘"MPFR_RNDD"’, ‘"MPFR_RNDA"’, ‘"MPFR_RNDF"’) corresponding to the |
| rounding mode RND, or a null pointer if RND is an invalid rounding |
| mode. |
|
|
| -- Macro: int mpfr_round_nearest_away (int (FOO)(mpfr_t, type1_t, ..., |
| mpfr_rnd_t), mpfr_t ROP, type1_t OP, ...) |
| Given a function FOO and one or more values OP (which may be a |
| ‘mpfr_t’, a ‘long int’, a ‘double’, etc.), put in ROP the |
| round-to-nearest-away rounding of ‘FOO(OP,...)’. This rounding is |
| defined in the same way as round-to-nearest-even, except in case of |
| tie, where the value away from zero is returned. The function FOO |
| takes as input, from second to penultimate argument(s), the |
| argument list given after ROP, a rounding mode as final argument, |
| puts in its first argument the value ‘FOO(OP,...)’ rounded |
| according to this rounding mode, and returns the corresponding |
| ternary value (which is expected to be correct, otherwise |
| ‘mpfr_round_nearest_away’ will not work as desired). Due to |
| implementation constraints, this function must not be called when |
| the minimal exponent EMIN is the smallest possible one. This macro |
| has been made such that the compiler is able to detect mismatch |
| between the argument list OP and the function prototype of FOO. |
| Multiple input arguments OP are supported only with C99 compilers. |
| Otherwise, for C90 compilers, only one such argument is supported. |
|
|
| Note: this macro is experimental and its interface might change in |
| future versions. |
| unsigned long ul; |
| mpfr_t f, r; |
| |
| int i = mpfr_round_nearest_away (mpfr_add_ui, r, f, ul); |
|
|
| |
| File: mpfr.info, Node: Miscellaneous Functions, Next: Exception Related Functions, Prev: Rounding-Related Functions, Up: MPFR Interface |
|
|
| 5.12 Miscellaneous Functions |
| ============================ |
|
|
| -- Function: void mpfr_nexttoward (mpfr_t X, mpfr_t Y) |
| If X or Y is NaN, set X to NaN; note that the NaN flag is set as |
| usual. If X and Y are equal, X is unchanged. Otherwise, if X is |
| different from Y, replace X by the next floating-point number (with |
| the precision of X and the current exponent range) in the direction |
| of Y (the infinite values are seen as the smallest and largest |
| floating-point numbers). If the result is zero, it keeps the same |
| sign. No underflow, overflow, or inexact exception is raised. |
|
|
| Note: Concerning the exceptions and the sign of 0, the behavior |
| differs from the ISO C ‘nextafter’ and ‘nexttoward’ functions. It |
| is similar to the nextUp and nextDown operations from IEEE 754 |
| (introduced in its 2008 revision). |
|
|
| -- Function: void mpfr_nextabove (mpfr_t X) |
| -- Function: void mpfr_nextbelow (mpfr_t X) |
| Equivalent to ‘mpfr_nexttoward’ where Y is +Inf (resp. −Inf). |
|
|
| -- Function: int mpfr_min (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_max (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| Set ROP to the minimum (resp. maximum) of OP1 and OP2. If OP1 and |
| OP2 are both NaN, then ROP is set to NaN. If OP1 or OP2 is NaN, |
| then ROP is set to the numeric value. If OP1 and OP2 are zeros of |
| different signs, then ROP is set to −0 (resp. +0). As usual, the |
| NaN flag is set only when the result is NaN, i.e., when both OP1 |
| and OP2 are NaN. |
|
|
| Note: These functions correspond to the minimumNumber and |
| maximumNumber operations of IEEE 754-2019 for the result. But in |
| MPFR, the NaN flag is set only when _both_ operands are NaN. |
|
|
| -- Function: int mpfr_urandomb (mpfr_t ROP, gmp_randstate_t STATE) |
| Generate a uniformly distributed random float in the interval |
| 0 <= ROP < 1. More precisely, the number can be seen as a float |
| with a random non-normalized significand and exponent 0, which is |
| then normalized (thus if E denotes the exponent after |
| normalization, then the least −E significant bits of the |
| significand are always 0). |
|
|
| Return 0, unless the exponent is not in the current exponent range, |
| in which case ROP is set to NaN and a non-zero value is returned |
| (this should never happen in practice, except in very specific |
| cases). The second argument is a ‘gmp_randstate_t’ structure, |
| which should be created using the GMP ‘gmp_randinit’ function (see |
| the GMP manual). |
|
|
| Note: for a given version of MPFR, the returned value of ROP and |
| the new value of STATE (which controls further random values) do |
| not depend on the machine word size. |
|
|
| -- Function: int mpfr_urandom (mpfr_t ROP, gmp_randstate_t STATE, |
| mpfr_rnd_t RND) |
| Generate a uniformly distributed random float. The floating-point |
| number ROP can be seen as if a random real number is generated |
| according to the continuous uniform distribution on the interval |
| [0, 1] and then rounded in the direction RND. |
|
|
| The second argument is a ‘gmp_randstate_t’ structure, which should |
| be created using the GMP ‘gmp_randinit’ function (see the GMP |
| manual). |
|
|
| Note: the note for ‘mpfr_urandomb’ holds too. Moreover, the exact |
| number (the random value to be rounded) and the next random state |
| do not depend on the current exponent range and the rounding mode. |
| However, they depend on the target precision: from the same state |
| of the random generator, if the precision of the destination is |
| changed, then the value may be completely different (and the state |
| of the random generator is different too). |
|
|
| -- Function: int mpfr_nrandom (mpfr_t ROP1, gmp_randstate_t STATE, |
| mpfr_rnd_t RND) |
| -- Function: int mpfr_grandom (mpfr_t ROP1, mpfr_t ROP2, |
| gmp_randstate_t STATE, mpfr_rnd_t RND) |
| Generate one (possibly two for ‘mpfr_grandom’) random |
| floating-point number according to a standard normal Gaussian |
| distribution (with mean zero and variance one). For |
| ‘mpfr_grandom’, if ROP2 is a null pointer, then only one value is |
| generated and stored in ROP1. |
|
|
| The floating-point number ROP1 (and ROP2) can be seen as if a |
| random real number were generated according to the standard normal |
| Gaussian distribution and then rounded in the direction RND. |
|
|
| The ‘gmp_randstate_t’ argument should be created using the GMP |
| ‘gmp_randinit’ function (see the GMP manual). |
|
|
| For ‘mpfr_grandom’, the combination of the ternary values is |
| returned like with ‘mpfr_sin_cos’. If ROP2 is a null pointer, the |
| second ternary value is assumed to be 0 (note that the encoding of |
| the only ternary value is not the same as the usual encoding for |
| functions that return only one result). Otherwise the ternary |
| value of a random number is always non-zero. |
|
|
| Note: the note for ‘mpfr_urandomb’ holds too. In addition, the |
| exponent range and the rounding mode might have a side effect on |
| the next random state. |
|
|
| Note: ‘mpfr_nrandom’ is much more efficient than ‘mpfr_grandom’, |
| especially for large precision. Thus ‘mpfr_grandom’ is marked as |
| deprecated and will be removed in a future release. |
|
|
| -- Function: int mpfr_erandom (mpfr_t ROP1, gmp_randstate_t STATE, |
| mpfr_rnd_t RND) |
| Generate one random floating-point number according to an |
| exponential distribution, with mean one. Other characteristics are |
| identical to ‘mpfr_nrandom’. |
|
|
| -- Function: mpfr_exp_t mpfr_get_exp (mpfr_t X) |
| Return the exponent of X, assuming that X is a non-zero ordinary |
| number and the significand is considered in [1/2,1). For this |
| function, X is allowed to be outside of the current range of |
| acceptable values. The behavior for NaN, infinity or zero is |
| undefined. |
|
|
| -- Function: int mpfr_set_exp (mpfr_t X, mpfr_exp_t E) |
| Set the exponent of X to E if X is a non-zero ordinary number and E |
| is in the current exponent range, and return 0; otherwise, return a |
| non-zero value (X is not changed). |
|
|
| -- Function: int mpfr_signbit (mpfr_t OP) |
| Return a non-zero value iff OP has its sign bit set (i.e., if it is |
| negative, −0, or a NaN whose representation has its sign bit set). |
|
|
| -- Function: int mpfr_setsign (mpfr_t ROP, mpfr_t OP, int S, mpfr_rnd_t |
| RND) |
| Set the value of ROP from OP, rounded toward the given direction |
| RND, then set (resp. clear) its sign bit if S is non-zero (resp. |
| zero), even when OP is a NaN. |
|
|
| -- Function: int mpfr_copysign (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| Set the value of ROP from OP1, rounded toward the given direction |
| RND, then set its sign bit to that of OP2 (even when OP1 or OP2 is |
| a NaN). This function is equivalent to ‘mpfr_setsign (ROP, OP1, |
| mpfr_signbit (OP2), RND)’. |
|
|
| -- Function: const char * mpfr_get_version (void) |
| Return the MPFR version, as a null-terminated string. |
|
|
| -- Macro: MPFR_VERSION |
| -- Macro: MPFR_VERSION_MAJOR |
| -- Macro: MPFR_VERSION_MINOR |
| -- Macro: MPFR_VERSION_PATCHLEVEL |
| -- Macro: MPFR_VERSION_STRING |
| ‘MPFR_VERSION’ is the version of MPFR as a preprocessing constant. |
| ‘MPFR_VERSION_MAJOR’, ‘MPFR_VERSION_MINOR’ and |
| ‘MPFR_VERSION_PATCHLEVEL’ are respectively the major, minor and |
| patch level of MPFR version, as preprocessing constants. |
| ‘MPFR_VERSION_STRING’ is the version (with an optional suffix, used |
| in development and pre-release versions) as a string constant, |
| which can be compared to the result of ‘mpfr_get_version’ to check |
| at run time the header file and library used match: |
| if (strcmp (mpfr_get_version (), MPFR_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 MPFR version can be |
| dynamically linked with a newer MPFR library version (if allowed by |
| the library versioning system). |
|
|
| -- Macro: long MPFR_VERSION_NUM (MAJOR, MINOR, PATCHLEVEL) |
| Create an integer in the same format as used by ‘MPFR_VERSION’ from |
| the given MAJOR, MINOR and PATCHLEVEL. Here is an example of how |
| to check the MPFR version at compile time: |
| #if (!defined(MPFR_VERSION) || (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0))) |
| # error "Wrong MPFR version." |
| #endif |
|
|
| -- Function: const char * mpfr_get_patches (void) |
| Return a null-terminated string containing the ids of the patches |
| applied to the MPFR library (contents of the ‘PATCHES’ file), |
| separated by spaces. Note: If the program has been compiled with |
| an older MPFR version and is dynamically linked with a new MPFR |
| library version, the identifiers of the patches applied to the old |
| (compile-time) MPFR version are not available (however, this |
| information should not have much interest in general). |
|
|
| -- Function: int mpfr_buildopt_tls_p (void) |
| Return a non-zero value if MPFR was compiled as thread safe using |
| compiler-level Thread-Local Storage (that is, MPFR was built with |
| the ‘--enable-thread-safe’ configure option, see ‘INSTALL’ file), |
| return zero otherwise. |
|
|
| -- Function: int mpfr_buildopt_float128_p (void) |
| Return a non-zero value if MPFR was compiled with ‘_Float128’ |
| support (that is, MPFR was built with the ‘--enable-float128’ |
| configure option), return zero otherwise. |
|
|
| -- Function: int mpfr_buildopt_decimal_p (void) |
| Return a non-zero value if MPFR was compiled with decimal float |
| support (that is, MPFR was built with the ‘--enable-decimal-float’ |
| configure option), return zero otherwise. |
|
|
| -- Function: int mpfr_buildopt_gmpinternals_p (void) |
| Return a non-zero value if MPFR was compiled with GMP internals |
| (that is, MPFR was built with either ‘--with-gmp-build’ or |
| ‘--enable-gmp-internals’ configure option), return zero otherwise. |
|
|
| -- Function: int mpfr_buildopt_sharedcache_p (void) |
| Return a non-zero value if MPFR was compiled so that all threads |
| share the same cache for one MPFR constant, like ‘mpfr_const_pi’ or |
| ‘mpfr_const_log2’ (that is, MPFR was built with the |
| ‘--enable-shared-cache’ configure option), return zero otherwise. |
| If the return value is non-zero, MPFR applications may need to be |
| compiled with the ‘-pthread’ option. |
|
|
| -- Function: const char * mpfr_buildopt_tune_case (void) |
| Return a string saying which thresholds file has been used at |
| compile time. This file is normally selected from the processor |
| type. |
|
|
| |
| File: mpfr.info, Node: Exception Related Functions, Next: Memory Handling Functions, Prev: Miscellaneous Functions, Up: MPFR Interface |
|
|
| 5.13 Exception Related Functions |
| ================================ |
|
|
| -- Function: mpfr_exp_t mpfr_get_emin (void) |
| -- Function: mpfr_exp_t mpfr_get_emax (void) |
| Return the (current) smallest and largest exponents allowed for a |
| floating-point variable. The smallest positive value of a |
| floating-point variable is one half times 2 raised to the smallest |
| exponent and the largest value has the form (1 − epsilon) times 2 |
| raised to the largest exponent, where epsilon depends on the |
| precision of the considered variable. |
|
|
| -- Function: int mpfr_set_emin (mpfr_exp_t EXP) |
| -- Function: int mpfr_set_emax (mpfr_exp_t EXP) |
| Set the smallest and largest exponents allowed for a floating-point |
| variable. Return a non-zero value when EXP is not in the range |
| accepted by the implementation (in that case the smallest or |
| largest exponent is not changed), and zero otherwise. |
|
|
| For the subsequent operations, it is the user’s responsibility to |
| check that any floating-point value used as an input is in the new |
| exponent range (for example using ‘mpfr_check_range’). If a |
| floating-point value outside the new exponent range is used as an |
| input, the default behavior is undefined, in the sense of the ISO C |
| standard; the behavior may also be explicitly documented, such as |
| for ‘mpfr_check_range’. |
|
|
| Note: Caches may still have values outside the current exponent |
| range. This is not an issue as the user cannot use these caches |
| directly via the API (MPFR extends the exponent range internally |
| when need be). |
|
|
| If EMIN > EMAX and a floating-point value needs to be produced as |
| output, the behavior is undefined (‘mpfr_set_emin’ and |
| ‘mpfr_set_emax’ do not check this condition as it might occur |
| between successive calls to these two functions). |
|
|
| -- Function: mpfr_exp_t mpfr_get_emin_min (void) |
| -- Function: mpfr_exp_t mpfr_get_emin_max (void) |
| -- Function: mpfr_exp_t mpfr_get_emax_min (void) |
| -- Function: mpfr_exp_t mpfr_get_emax_max (void) |
| Return the minimum and maximum of the exponents allowed for |
| ‘mpfr_set_emin’ and ‘mpfr_set_emax’ respectively. These values are |
| implementation dependent, thus a program using |
| ‘mpfr_set_emax(mpfr_get_emax_max())’ or |
| ‘mpfr_set_emin(mpfr_get_emin_min())’ may not be portable. |
|
|
| -- Function: int mpfr_check_range (mpfr_t X, int T, mpfr_rnd_t RND) |
| This function assumes that X is the correctly rounded value of some |
| real value Y in the direction RND and some extended exponent range, |
| and that T is the corresponding *note ternary value::. For |
| example, one performed ‘t = mpfr_log (x, u, rnd)’, and Y is the |
| exact logarithm of U. Thus T is negative if X is smaller than Y, |
| positive if X is larger than Y, and zero if X equals Y. This |
| function modifies X if needed to be in the current range of |
| acceptable values: It generates an underflow or an overflow if the |
| exponent of X is outside the current allowed range; the value of T |
| may be used to avoid a double rounding. This function returns zero |
| if the new value of X equals the exact one Y, a positive value if |
| that new value is larger than Y, and a negative value if it is |
| smaller than Y. Note that unlike most functions, the new result X |
| is compared to the (unknown) exact one Y, not the input value X, |
| i.e., the ternary value is propagated. |
|
|
| Note: If X is an infinity and T is different from zero (i.e., if |
| the rounded result is an inexact infinity), then the overflow flag |
| is set. This is useful because ‘mpfr_check_range’ is typically |
| called (at least in MPFR functions) after restoring the flags that |
| could have been set due to internal computations. |
|
|
| -- Function: int mpfr_subnormalize (mpfr_t X, int T, mpfr_rnd_t RND) |
| This function rounds X emulating subnormal number arithmetic: if X |
| is outside the subnormal exponent range of the emulated |
| floating-point system, this function just propagates the *note |
| ternary value:: T; otherwise, if EXP(X) denotes the exponent of X, |
| it rounds X to precision EXP(X)−EMIN+1 according to rounding mode |
| RND and previous ternary value T, avoiding double rounding |
| problems. More precisely in the subnormal domain, denoting by e |
| the value of EMIN, X is rounded in fixed-point arithmetic to an |
| integer multiple of two to the power e − 1; as a consequence, 1.5 |
| multiplied by two to the power e − 1 when T is zero is rounded to |
| two to the power e with rounding to nearest. |
|
|
| The precision PREC(X) of X is not modified by this function. RND |
| and T must be the rounding mode and the returned ternary value used |
| when computing X (as in ‘mpfr_check_range’). The subnormal |
| exponent range is from EMIN to EMIN+PREC(X)−1. If the result |
| cannot be represented in the current exponent range of MPFR (due to |
| a too small EMAX), the behavior is undefined. Note that unlike |
| most functions, the result is compared to the exact one, not the |
| input value X, i.e., the ternary value is propagated. |
|
|
| As usual, if the returned ternary value is non zero, the inexact |
| flag is set. Moreover, if a second rounding occurred (because the |
| input X was in the subnormal range), the underflow flag is set. |
|
|
| Warning! If you change EMIN (with ‘mpfr_set_emin’) just before |
| calling ‘mpfr_subnormalize’, you need to make sure that the value |
| is in the current exponent range of MPFR. But it is better to |
| change EMIN before any computation, if possible. |
|
|
| This is an example of how to emulate binary64 IEEE 754 arithmetic |
| (a.k.a. double precision) using MPFR: |
|
|
| { |
| mpfr_t xa, xb; int i; volatile double a, b; |
|
|
| mpfr_set_default_prec (53); |
| mpfr_set_emin (-1073); mpfr_set_emax (1024); |
|
|
| mpfr_init (xa); mpfr_init (xb); |
|
|
| b = 34.3; mpfr_set_d (xb, b, MPFR_RNDN); |
| a = 0x1.1235P-1021; mpfr_set_d (xa, a, MPFR_RNDN); |
|
|
| a /= b; |
| i = mpfr_div (xa, xa, xb, MPFR_RNDN); |
| i = mpfr_subnormalize (xa, i, MPFR_RNDN); |
|
|
| mpfr_clear (xa); mpfr_clear (xb); |
| } |
|
|
| Note that ‘mpfr_set_emin’ and ‘mpfr_set_emax’ are called early enough |
| in order to make sure that all computed values are in the current |
| exponent range. Warning! This emulates a double IEEE 754 arithmetic |
| with correct rounding in the subnormal range, which may not be the case |
| for your hardware. |
|
|
| Below is another example showing how to emulate fixed-point |
| arithmetic in a specific case. Here we compute the sine of the integers |
| 1 to 17 with a result in a fixed-point arithmetic rounded at two to the |
| power −42 (using the fact that the result is at most 1 in absolute |
| value): |
|
|
| { |
| mpfr_t x; int i, inex; |
|
|
| mpfr_set_emin (-41); |
| mpfr_init2 (x, 42); |
| for (i = 1; i <= 17; i++) |
| { |
| mpfr_set_ui (x, i, MPFR_RNDN); |
| inex = mpfr_sin (x, x, MPFR_RNDZ); |
| mpfr_subnormalize (x, inex, MPFR_RNDZ); |
| mpfr_dump (x); |
| } |
| mpfr_clear (x); |
| } |
|
|
| -- Function: void mpfr_clear_underflow (void) |
| -- Function: void mpfr_clear_overflow (void) |
| -- Function: void mpfr_clear_divby0 (void) |
| -- Function: void mpfr_clear_nanflag (void) |
| -- Function: void mpfr_clear_inexflag (void) |
| -- Function: void mpfr_clear_erangeflag (void) |
| Clear (lower) the underflow, overflow, divide-by-zero, invalid, |
| inexact and _erange_ flags. |
|
|
| -- Function: void mpfr_clear_flags (void) |
| Clear (lower) all global flags (underflow, overflow, |
| divide-by-zero, invalid, inexact, _erange_). Note: a group of |
| flags can be cleared by using ‘mpfr_flags_clear’. |
|
|
| -- Function: void mpfr_set_underflow (void) |
| -- Function: void mpfr_set_overflow (void) |
| -- Function: void mpfr_set_divby0 (void) |
| -- Function: void mpfr_set_nanflag (void) |
| -- Function: void mpfr_set_inexflag (void) |
| -- Function: void mpfr_set_erangeflag (void) |
| Set (raise) the underflow, overflow, divide-by-zero, invalid, |
| inexact and _erange_ flags. |
|
|
| -- Function: int mpfr_underflow_p (void) |
| -- Function: int mpfr_overflow_p (void) |
| -- Function: int mpfr_divby0_p (void) |
| -- Function: int mpfr_nanflag_p (void) |
| -- Function: int mpfr_inexflag_p (void) |
| -- Function: int mpfr_erangeflag_p (void) |
| Return the corresponding (underflow, overflow, divide-by-zero, |
| invalid, inexact, _erange_) flag, which is non-zero iff the flag is |
| set. |
|
|
| The ‘mpfr_flags_’ functions below that take an argument MASK can |
| operate on any subset of the exception flags: a flag is part of this |
| subset (or group) if and only if the corresponding bit of the argument |
| MASK is set. The ‘MPFR_FLAGS_’ macros will normally be used to build |
| this argument. *Note Exceptions::. |
|
|
| -- Function: void mpfr_flags_clear (mpfr_flags_t MASK) |
| Clear (lower) the group of flags specified by MASK. |
|
|
| -- Function: void mpfr_flags_set (mpfr_flags_t MASK) |
| Set (raise) the group of flags specified by MASK. |
|
|
| -- Function: mpfr_flags_t mpfr_flags_test (mpfr_flags_t MASK) |
| Return the flags specified by MASK. To test whether any flag from |
| MASK is set, compare the return value to 0. You can also test |
| individual flags by AND’ing the result with ‘MPFR_FLAGS_’ macros. |
| Example: |
| mpfr_flags_t t = mpfr_flags_test (MPFR_FLAGS_UNDERFLOW| |
| MPFR_FLAGS_OVERFLOW) |
| ... |
| if (t) |
| { |
| if (t & MPFR_FLAGS_UNDERFLOW) { } |
| if (t & MPFR_FLAGS_OVERFLOW) { } |
| } |
|
|
| -- Function: mpfr_flags_t mpfr_flags_save (void) |
| Return all the flags. It is equivalent to |
| ‘mpfr_flags_test(MPFR_FLAGS_ALL)’. |
|
|
| -- Function: void mpfr_flags_restore (mpfr_flags_t FLAGS, mpfr_flags_t |
| MASK) |
| Restore the flags specified by MASK to their state represented in |
| FLAGS. |
|
|
| |
| File: mpfr.info, Node: Memory Handling Functions, Next: Compatibility with MPF, Prev: Exception Related Functions, Up: MPFR Interface |
|
|
| 5.14 Memory Handling Functions |
| ============================== |
|
|
| These are general functions concerning memory handling (*note Memory |
| Handling::, for more information). |
|
|
| -- Function: void mpfr_free_cache (void) |
| Free all caches and pools used by MPFR internally (those local to |
| the current thread and those shared by all threads). You should |
| call this function before terminating a thread, even if you did not |
| call ‘mpfr_const_*’ functions directly (they could have been called |
| internally). |
|
|
| -- Function: void mpfr_free_cache2 (mpfr_free_cache_t WAY) |
| Free various caches and pools used by MPFR internally, as specified |
| by WAY, which is a set of flags: |
| • those local to the current thread if flag |
| ‘MPFR_FREE_LOCAL_CACHE’ is set; |
| • those shared by all threads if flag ‘MPFR_FREE_GLOBAL_CACHE’ |
| is set. |
| The other bits of WAY are currently ignored and are reserved for |
| future use; they should be zero. |
|
|
| Note: ‘mpfr_free_cache2 (MPFR_FREE_LOCAL_CACHE | |
| MPFR_FREE_GLOBAL_CACHE)’ is currently equivalent to |
| ‘mpfr_free_cache()’. |
|
|
| -- Function: void mpfr_free_pool (void) |
| Free the pools used by MPFR internally. Note: This function is |
| automatically called after the thread-local caches are freed (with |
| ‘mpfr_free_cache’ or ‘mpfr_free_cache2’). |
|
|
| -- Function: int mpfr_mp_memory_cleanup (void) |
| This function should be called before calling |
| ‘mp_set_memory_functions’. *Note Memory Handling::, for more |
| information. Zero is returned in case of success, non-zero in case |
| of error. Errors are currently not possible, but checking the |
| return value is recommended for future compatibility. |
|
|
| |
| File: mpfr.info, Node: Compatibility with MPF, Next: Custom Interface, Prev: Memory Handling Functions, Up: MPFR Interface |
|
|
| 5.15 Compatibility With MPF |
| =========================== |
|
|
| A header file ‘mpf2mpfr.h’ is included in the distribution of MPFR for |
| compatibility with the GNU MP class MPF. By inserting the following two |
| lines after the ‘#include <gmp.h>’ line, |
| #include <mpfr.h> |
| #include <mpf2mpfr.h> |
| many programs written for MPF can be compiled directly against MPFR |
| without any changes. All operations are then performed with the default |
| MPFR rounding mode, which can be reset with |
| ‘mpfr_set_default_rounding_mode’. |
|
|
| Warning! There are some differences. In particular: |
| • The precision is different: MPFR rounds to the exact number of bits |
| (zeroing trailing bits in the internal representation). Users may |
| need to increase the precision of their variables. |
| • The exponent range is also different. |
| • The formatted output functions (‘gmp_printf’, etc.) will not work |
| for arguments of arbitrary-precision floating-point type (‘mpf_t’, |
| which ‘mpf2mpfr.h’ redefines as ‘mpfr_t’). |
| • The output of ‘mpf_out_str’ has a format slightly different from |
| the one of ‘mpfr_out_str’ (concerning the position of the |
| decimal-point character, trailing zeros and the output of the value |
| 0). |
|
|
| -- Function: void mpfr_set_prec_raw (mpfr_t X, mpfr_prec_t PREC) |
| Reset the precision of X to be *exactly* PREC bits. The only |
| difference with ‘mpfr_set_prec’ is that PREC is assumed to be small |
| enough so that the significand fits into the current allocated |
| memory space for X. Otherwise the behavior is undefined. |
|
|
| -- Function: int mpfr_eq (mpfr_t OP1, mpfr_t OP2, unsigned long int |
| OP3) |
| Return non-zero if OP1 and OP2 are both non-zero ordinary numbers |
| with the same exponent and the same first OP3 bits, both zero, or |
| both infinities of the same sign. Return zero otherwise. This |
| function is defined for compatibility with MPF, we do not recommend |
| to use it otherwise. Do not use it either if you want to know |
| whether two numbers are close to each other; for instance, 1.011111 |
| and 1.100000 are regarded as different for any value of OP3 larger |
| than 1. |
|
|
| -- Function: void mpfr_reldiff (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2, |
| mpfr_rnd_t RND) |
| Compute the relative difference between OP1 and OP2 and store the |
| result in ROP. This function does not guarantee the correct |
| rounding on the relative difference; it just computes |
| |OP1 − OP2| / OP1, using the precision of ROP and the rounding mode |
| RND for all operations. |
|
|
| -- Function: int mpfr_mul_2exp (mpfr_t ROP, mpfr_t OP1, unsigned long |
| int OP2, mpfr_rnd_t RND) |
| -- Function: int mpfr_div_2exp (mpfr_t ROP, mpfr_t OP1, unsigned long |
| int OP2, mpfr_rnd_t RND) |
| These functions are identical to ‘mpfr_mul_2ui’ and ‘mpfr_div_2ui’ |
| respectively. These functions are only kept for compatibility with |
| MPF, one should prefer ‘mpfr_mul_2ui’ and ‘mpfr_div_2ui’ otherwise. |
|
|
| |
| File: mpfr.info, Node: Custom Interface, Next: Internals, Prev: Compatibility with MPF, Up: MPFR Interface |
|
|
| 5.16 Custom Interface |
| ===================== |
|
|
| Some applications use a stack to handle the memory and their objects. |
| However, the MPFR memory design is not well suited for such a thing. So |
| that such applications are able to use MPFR, an auxiliary memory |
| interface has been created: the Custom Interface. |
|
|
| The following interface allows one to use MPFR in two ways: |
|
|
| • Either directly store a floating-point number as a ‘mpfr_t’ on the |
| stack. |
|
|
| • Either store its own representation on the stack and construct a |
| new temporary ‘mpfr_t’ each time it is needed. |
|
|
| Nothing has to be done to destroy the floating-point numbers except |
| garbaging the used memory: all the memory management (allocating, |
| destroying, garbaging) is left to the application. |
|
|
| Each function in this interface is also implemented as a macro for |
| efficiency reasons: for example ‘mpfr_custom_init (s, p)’ uses the |
| macro, while ‘(mpfr_custom_init) (s, p)’ uses the function. The |
| ‘mpfr_custom_init_set’ macro is not usable in contexts where an |
| expression is expected, e.g., inside ‘for(...)’ or before a comma |
| operator. |
|
|
| Note 1: MPFR functions may still initialize temporary floating-point |
| numbers using ‘mpfr_init’ and similar functions. See Custom Allocation |
| (GNU MP). |
|
|
| Note 2: MPFR functions may use the cached functions (‘mpfr_const_pi’ |
| for example), even if they are not explicitly called. You have to call |
| ‘mpfr_free_cache’ each time you garbage the memory iff ‘mpfr_init’, |
| through GMP Custom Allocation, allocates its memory on the application |
| stack. |
|
|
| -- Function: size_t mpfr_custom_get_size (mpfr_prec_t PREC) |
| Return the needed size in bytes to store the significand of a |
| floating-point number of precision PREC. |
|
|
| -- Function: void mpfr_custom_init (void *SIGNIFICAND, mpfr_prec_t |
| PREC) |
| Initialize a significand of precision PREC, where SIGNIFICAND must |
| be an area of ‘mpfr_custom_get_size (prec)’ bytes at least and be |
| suitably aligned for an array of ‘mp_limb_t’ (GMP type, *note |
| Internals::). |
|
|
| -- Function: void mpfr_custom_init_set (mpfr_t X, int KIND, mpfr_exp_t |
| EXP, mpfr_prec_t PREC, void *SIGNIFICAND) |
| Perform a dummy initialization of a ‘mpfr_t’ and set it to: |
| • if abs(KIND) = ‘MPFR_NAN_KIND’, X is set to NaN; |
| • if abs(KIND) = ‘MPFR_INF_KIND’, X is set to the infinity of |
| the same sign as KIND; |
| • if abs(KIND) = ‘MPFR_ZERO_KIND’, X is set to the zero of the |
| same sign as KIND; |
| • if abs(KIND) = ‘MPFR_REGULAR_KIND’, X is set to the regular |
| number whose sign is the one of KIND, and whose exponent and |
| significand are given by EXP and SIGNIFICAND. |
| In all cases, SIGNIFICAND will be used directly for further |
| computing involving X. This function does not allocate anything. |
| A floating-point number initialized with this function cannot be |
| resized using ‘mpfr_set_prec’ or ‘mpfr_prec_round’, or cleared |
| using ‘mpfr_clear’! The SIGNIFICAND must have been initialized |
| with ‘mpfr_custom_init’ using the same precision PREC. |
|
|
| -- Function: int mpfr_custom_get_kind (mpfr_t X) |
| Return the current kind of a ‘mpfr_t’ as created by |
| ‘mpfr_custom_init_set’. The behavior of this function for any |
| ‘mpfr_t’ not initialized with ‘mpfr_custom_init_set’ is undefined. |
|
|
| -- Function: void * mpfr_custom_get_significand (mpfr_t X) |
| Return a pointer to the significand used by a ‘mpfr_t’ initialized |
| with ‘mpfr_custom_init_set’. The behavior of this function for any |
| ‘mpfr_t’ not initialized with ‘mpfr_custom_init_set’ is undefined. |
|
|
| -- Function: mpfr_exp_t mpfr_custom_get_exp (mpfr_t X) |
| Return the exponent of X, assuming that X is a non-zero ordinary |
| number and the significand is considered in [1/2,1). But if X is |
| NaN, infinity or zero, contrary to ‘mpfr_get_exp’ (where the |
| behavior is undefined), the return value is here an unspecified, |
| valid value of the ‘mpfr_exp_t’ type. The behavior of this |
| function for any ‘mpfr_t’ not initialized with |
| ‘mpfr_custom_init_set’ is undefined. |
|
|
| -- Function: void mpfr_custom_move (mpfr_t X, void *NEW_POSITION) |
| Inform MPFR that the significand of X has moved due to a garbage |
| collect and update its new position to ‘new_position’. However, |
| the application has to move the significand and the ‘mpfr_t’ |
| itself. The behavior of this function for any ‘mpfr_t’ not |
| initialized with ‘mpfr_custom_init_set’ is undefined. |
|
|
| |
| File: mpfr.info, Node: Internals, Prev: Custom Interface, Up: MPFR Interface |
|
|
| 5.17 Internals |
| ============== |
|
|
| A “limb” means the part of a multi-precision number that fits in a |
| single word. Usually a limb contains 32 or 64 bits. The C data type |
| for a limb is ‘mp_limb_t’. |
|
|
| The ‘mpfr_t’ type is internally defined as a one-element array of a |
| structure, and ‘mpfr_ptr’ is the C data type representing a pointer to |
| this structure. The ‘mpfr_t’ type consists of four fields: |
|
|
| • The ‘_mpfr_prec’ field is used to store the precision of the |
| variable (in bits); this is not less than ‘MPFR_PREC_MIN’. |
|
|
| • The ‘_mpfr_sign’ field is used to store the sign of the variable. |
|
|
| • The ‘_mpfr_exp’ field stores the exponent. An exponent of 0 means |
| a radix point just above the most significant limb. Non-zero |
| values n are a multiplier 2^n relative to that point. A NaN, an |
| infinity and a zero are indicated by special values of the exponent |
| field. |
|
|
| • Finally, the ‘_mpfr_d’ field is a pointer to the limbs, least |
| significant limbs stored first. The number of limbs in use is |
| controlled by ‘_mpfr_prec’, namely |
| ceil(‘_mpfr_prec’/‘mp_bits_per_limb’). Non-singular (i.e., |
| different from NaN, infinity or zero) values always have the most |
| significant bit of the most significant limb set to 1. When the |
| precision does not correspond to a whole number of limbs, the |
| excess bits at the low end of the data are zeros. |
|
|
| |
| File: mpfr.info, Node: API Compatibility, Next: MPFR and the IEEE 754 Standard, Prev: MPFR Interface, Up: Top |
|
|
| 6 API Compatibility |
| |
|
|
| The goal of this section is to describe some API changes that occurred |
| from one version of MPFR to another, and how to write code that can be |
| compiled and run with older MPFR versions. The minimum MPFR version |
| that is considered here is 2.2.0 (released on 20 September 2005). |
|
|
| API changes can only occur between major or minor versions. Thus the |
| patchlevel (the third number in the MPFR version) will be ignored in the |
| following. If a program does not use MPFR internals, changes in the |
| behavior between two versions differing only by the patchlevel should |
| only result from what was regarded as a bug or unspecified behavior. |
|
|
| As a general rule, a program written for some MPFR version should |
| work with later versions, possibly except at a new major version, where |
| some features (described as obsolete for some time) can be removed. In |
| such a case, a failure should occur during compilation or linking. If a |
| result becomes incorrect because of such a change, please look at the |
| various changes below (they are minimal, and most software should be |
| unaffected), at the FAQ and at the MPFR web page for your version (a bug |
| could have been introduced and be already fixed); and if the problem is |
| not mentioned, please send us a bug report (*note Reporting Bugs::). |
|
|
| However, a program written for the current MPFR version (as |
| documented by this manual) may not necessarily work with previous |
| versions of MPFR. This section should help developers to write portable |
| code. |
|
|
| Note: Information given here may be incomplete. API changes are also |
| described in the NEWS file (for each version, instead of being |
| classified like here), together with other changes. |
|
|
| |
|
|
| |
| |
| |
| |
| |
|
|
| |
| File: mpfr.info, Node: Type and Macro Changes, Next: Added Functions, Prev: API Compatibility, Up: API Compatibility |
|
|
| 6.1 Type and Macro Changes |
| ========================== |
|
|
| The official type for exponent values changed from ‘mp_exp_t’ to |
| ‘mpfr_exp_t’ in MPFR 3.0. The type ‘mp_exp_t’ will remain available as |
| it comes from GMP (with a different meaning). These types are currently |
| the same (‘mpfr_exp_t’ is defined as ‘mp_exp_t’ with ‘typedef’), so that |
| programs can still use ‘mp_exp_t’; but this may change in the future. |
| Alternatively, using the following code after including ‘mpfr.h’ will |
| work with official MPFR versions, as ‘mpfr_exp_t’ was never defined in |
| MPFR 2.x: |
| #if MPFR_VERSION_MAJOR < 3 |
| typedef mp_exp_t mpfr_exp_t; |
| #endif |
|
|
| The official types for precision values and for rounding modes |
| respectively changed from ‘mp_prec_t’ and ‘mp_rnd_t’ to ‘mpfr_prec_t’ |
| and ‘mpfr_rnd_t’ in MPFR 3.0. This change was actually done a long time |
| ago in MPFR, at least since MPFR 2.2.0, with the following code in |
| ‘mpfr.h’: |
| #ifndef mp_rnd_t |
| # define mp_rnd_t mpfr_rnd_t |
| #endif |
| #ifndef mp_prec_t |
| # define mp_prec_t mpfr_prec_t |
| #endif |
| This means that it is safe to use the new official types |
| ‘mpfr_prec_t’ and ‘mpfr_rnd_t’ in your programs. The types ‘mp_prec_t’ |
| and ‘mp_rnd_t’ (defined in MPFR only) may be removed in the future, as |
| the prefix ‘mp_’ is reserved by GMP. |
|
|
| The precision type ‘mpfr_prec_t’ (‘mp_prec_t’) was unsigned before |
| MPFR 3.0; it is now signed. ‘MPFR_PREC_MAX’ has not changed, though. |
| Indeed the MPFR code requires that ‘MPFR_PREC_MAX’ be representable in |
| the exponent type, which may have the same size as ‘mpfr_prec_t’ but has |
| always been signed. The consequence is that valid code that does not |
| assume anything about the signedness of ‘mpfr_prec_t’ should work with |
| past and new MPFR versions. This change was useful as the use of |
| unsigned types tends to convert signed values to unsigned ones in |
| expressions due to the usual arithmetic conversions, which can yield |
| incorrect results if a negative value is converted in such a way. |
| Warning! A program assuming (intentionally or not) that ‘mpfr_prec_t’ |
| is signed may be affected by this problem when it is built and run |
| against MPFR 2.x. |
|
|
| The rounding modes ‘GMP_RNDx’ were renamed to ‘MPFR_RNDx’ in |
| MPFR 3.0. However, the old names ‘GMP_RNDx’ have been kept for |
| compatibility (this might change in future versions), using: |
| #define GMP_RNDN MPFR_RNDN |
| #define GMP_RNDZ MPFR_RNDZ |
| #define GMP_RNDU MPFR_RNDU |
| #define GMP_RNDD MPFR_RNDD |
| The rounding mode “round away from zero” (‘MPFR_RNDA’) was added in |
| MPFR 3.0 (however, no rounding mode ‘GMP_RNDA’ exists). Faithful |
| rounding (‘MPFR_RNDF’) was added in MPFR 4.0, but currently, it is |
| partially supported. |
|
|
| The flags-related macros, whose name starts with ‘MPFR_FLAGS_’, were |
| added in MPFR 4.0 (for the new functions ‘mpfr_flags_clear’, |
| ‘mpfr_flags_restore’, ‘mpfr_flags_set’ and ‘mpfr_flags_test’, in |
| particular). |
|
|
| |
| File: mpfr.info, Node: Added Functions, Next: Changed Functions, Prev: Type and Macro Changes, Up: API Compatibility |
|
|
| 6.2 Added Functions |
| =================== |
|
|
| We give here in alphabetical order the functions (and function-like |
| macros) that were added after MPFR 2.2, and in which MPFR version. |
|
|
| • ‘mpfr_acospi’ and ‘mpfr_acosu’ in MPFR 4.2. |
|
|
| • ‘mpfr_add_d’ in MPFR 2.4. |
|
|
| • ‘mpfr_ai’ in MPFR 3.0 (incomplete, experimental). |
|
|
| • ‘mpfr_asinpi’ and ‘mpfr_asinu’ in MPFR 4.2. |
|
|
| • ‘mpfr_asprintf’ in MPFR 2.4. |
|
|
| • ‘mpfr_atan2pi’ and ‘mpfr_atan2u’ in MPFR 4.2. |
|
|
| • ‘mpfr_atanpi’ and ‘mpfr_atanu’ in MPFR 4.2. |
|
|
| • ‘mpfr_beta’ in MPFR 4.0 (incomplete, experimental). |
|
|
| • ‘mpfr_buildopt_decimal_p’ in MPFR 3.0. |
|
|
| • ‘mpfr_buildopt_float128_p’ in MPFR 4.0. |
|
|
| • ‘mpfr_buildopt_gmpinternals_p’ in MPFR 3.1. |
|
|
| • ‘mpfr_buildopt_sharedcache_p’ in MPFR 4.0. |
|
|
| • ‘mpfr_buildopt_tls_p’ in MPFR 3.0. |
|
|
| • ‘mpfr_buildopt_tune_case’ in MPFR 3.1. |
|
|
| • ‘mpfr_clear_divby0’ in MPFR 3.1 (new divide-by-zero exception). |
|
|
| • ‘mpfr_cmpabs_ui’ in MPFR 4.1. |
|
|
| • ‘mpfr_compound_si’ in MPFR 4.2. |
|
|
| • ‘mpfr_copysign’ in MPFR 2.3. Note: MPFR 2.2 had a ‘mpfr_copysign’ |
| function that was available, but not documented, and with a slight |
| difference in the semantics (when the second input operand is a |
| NaN). |
|
|
| • ‘mpfr_cospi’ and ‘mpfr_cosu’ in MPFR 4.2. |
|
|
| • ‘mpfr_custom_get_significand’ in MPFR 3.0. This function was named |
| ‘mpfr_custom_get_mantissa’ in previous versions; |
| ‘mpfr_custom_get_mantissa’ is still available via a macro in |
| ‘mpfr.h’: |
| #define mpfr_custom_get_mantissa mpfr_custom_get_significand |
| Thus code that needs to work with both MPFR 2.x and MPFR 3.x should |
| use ‘mpfr_custom_get_mantissa’. |
|
|
| • ‘mpfr_d_div’ and ‘mpfr_d_sub’ in MPFR 2.4. |
|
|
| • ‘mpfr_digamma’ in MPFR 3.0. |
|
|
| • ‘mpfr_divby0_p’ in MPFR 3.1 (new divide-by-zero exception). |
|
|
| • ‘mpfr_div_d’ in MPFR 2.4. |
|
|
| • ‘mpfr_dot’ in MPFR 4.1 (incomplete, experimental). |
|
|
| • ‘mpfr_erandom’ in MPFR 4.0. |
|
|
| • ‘mpfr_exp2m1’ and ‘mpfr_exp10m1’ in MPFR 4.2. |
|
|
| • ‘mpfr_flags_clear’, ‘mpfr_flags_restore’, ‘mpfr_flags_save’, |
| ‘mpfr_flags_set’ and ‘mpfr_flags_test’ in MPFR 4.0. |
|
|
| • ‘mpfr_fmma’ and ‘mpfr_fmms’ in MPFR 4.0. |
|
|
| • ‘mpfr_fmod’ in MPFR 2.4. |
|
|
| • ‘mpfr_fmodquo’ in MPFR 4.0. |
|
|
| • ‘mpfr_fmod_ui’ in MPFR 4.2. |
|
|
| • ‘mpfr_fms’ in MPFR 2.3. |
|
|
| • ‘mpfr_fpif_export’ and ‘mpfr_fpif_import’ in MPFR 4.0. |
|
|
| • ‘mpfr_fprintf’ in MPFR 2.4. |
|
|
| • ‘mpfr_free_cache2’ in MPFR 4.0. |
|
|
| • ‘mpfr_free_pool’ in MPFR 4.0. |
|
|
| • ‘mpfr_frexp’ in MPFR 3.1. |
|
|
| • ‘mpfr_gamma_inc’ in MPFR 4.0. |
|
|
| • ‘mpfr_get_decimal128’ in MPFR 4.1. |
|
|
| • ‘mpfr_get_float128’ in MPFR 4.0 if configured with |
| ‘--enable-float128’. |
|
|
| • ‘mpfr_get_flt’ in MPFR 3.0. |
|
|
| • ‘mpfr_get_patches’ in MPFR 2.3. |
|
|
| • ‘mpfr_get_q’ in MPFR 4.0. |
|
|
| • ‘mpfr_get_str_ndigits’ in MPFR 4.1. |
|
|
| • ‘mpfr_get_z_2exp’ in MPFR 3.0. This function was named |
| ‘mpfr_get_z_exp’ in previous versions; ‘mpfr_get_z_exp’ is still |
| available via a macro in ‘mpfr.h’: |
| #define mpfr_get_z_exp mpfr_get_z_2exp |
| Thus code that needs to work with both MPFR 2.x and MPFR 3.x should |
| use ‘mpfr_get_z_exp’. |
|
|
| • ‘mpfr_grandom’ in MPFR 3.1. |
|
|
| • ‘mpfr_j0’, ‘mpfr_j1’ and ‘mpfr_jn’ in MPFR 2.3. |
|
|
| • ‘mpfr_log2p1’ and ‘mpfr_log10p1’ in MPFR 4.2. |
|
|
| • ‘mpfr_lgamma’ in MPFR 2.3. |
|
|
| • ‘mpfr_li2’ in MPFR 2.4. |
|
|
| • ‘mpfr_log_ui’ in MPFR 4.0. |
|
|
| • ‘mpfr_min_prec’ in MPFR 3.0. |
|
|
| • ‘mpfr_modf’ in MPFR 2.4. |
|
|
| • ‘mpfr_mp_memory_cleanup’ in MPFR 4.0. |
|
|
| • ‘mpfr_mul_d’ in MPFR 2.4. |
|
|
| • ‘mpfr_nrandom’ in MPFR 4.0. |
|
|
| • ‘mpfr_powr’, ‘mpfr_pown’, ‘mpfr_pow_sj’ and ‘mpfr_pow_uj’ in |
| MPFR 4.2. |
|
|
| • ‘mpfr_printf’ in MPFR 2.4. |
|
|
| • ‘mpfr_rec_sqrt’ in MPFR 2.4. |
|
|
| • ‘mpfr_regular_p’ in MPFR 3.0. |
|
|
| • ‘mpfr_remainder’ and ‘mpfr_remquo’ in MPFR 2.3. |
|
|
| • ‘mpfr_rint_roundeven’ and ‘mpfr_roundeven’ in MPFR 4.0. |
|
|
| • ‘mpfr_round_nearest_away’ in MPFR 4.0. |
|
|
| • ‘mpfr_rootn_si’ in MPFR 4.2. |
|
|
| • ‘mpfr_rootn_ui’ in MPFR 4.0. |
|
|
| • ‘mpfr_set_decimal128’ in MPFR 4.1. |
|
|
| • ‘mpfr_set_divby0’ in MPFR 3.1 (new divide-by-zero exception). |
|
|
| • ‘mpfr_set_float128’ in MPFR 4.0 if configured with |
| ‘--enable-float128’. |
|
|
| • ‘mpfr_set_flt’ in MPFR 3.0. |
|
|
| • ‘mpfr_set_z_2exp’ in MPFR 3.0. |
|
|
| • ‘mpfr_set_zero’ in MPFR 3.0. |
|
|
| • ‘mpfr_setsign’ in MPFR 2.3. |
|
|
| • ‘mpfr_signbit’ in MPFR 2.3. |
|
|
| • ‘mpfr_sinh_cosh’ in MPFR 2.4. |
|
|
| • ‘mpfr_sinpi’ and ‘mpfr_sinu’ in MPFR 4.2. |
|
|
| • ‘mpfr_snprintf’ and ‘mpfr_sprintf’ in MPFR 2.4. |
|
|
| • ‘mpfr_sub_d’ in MPFR 2.4. |
|
|
| • ‘mpfr_tanpi’ and ‘mpfr_tanu’ in MPFR 4.2. |
|
|
| • ‘mpfr_total_order_p’ in MPFR 4.1. |
|
|
| • ‘mpfr_urandom’ in MPFR 3.0. |
|
|
| • ‘mpfr_vasprintf’, ‘mpfr_vfprintf’, ‘mpfr_vprintf’, ‘mpfr_vsprintf’ |
| and ‘mpfr_vsnprintf’ in MPFR 2.4. |
|
|
| • ‘mpfr_y0’, ‘mpfr_y1’ and ‘mpfr_yn’ in MPFR 2.3. |
|
|
| • ‘mpfr_z_sub’ in MPFR 3.1. |
|
|
| |
| File: mpfr.info, Node: Changed Functions, Next: Removed Functions, Prev: Added Functions, Up: API Compatibility |
|
|
| 6.3 Changed Functions |
| ===================== |
|
|
| The following functions and function-like macros have changed after |
| MPFR 2.2. Changes can affect the behavior of code written for some MPFR |
| version when built and run against another MPFR version (older or |
| newer), as described below. |
|
|
| • The formatted output functions (‘mpfr_printf’, etc.) have slightly |
| changed in MPFR 4.1 in the case where the precision field is empty: |
| trailing zeros were not output with the conversion specifier ‘e’ / |
| ‘E’ (the chosen precision was not fully specified and it depended |
| on the input value), and also on the value zero with the conversion |
| specifiers ‘f’ / ‘F’ / ‘g’ / ‘G’ (this could partly be regarded as |
| a bug); they are now kept in a way similar to the formatted output |
| functions from C. Moreover, the case where the precision consists |
| only of a period has been fixed in MPFR 4.2 to be like ‘.0’ as |
| specified in the ISO C standard (it previously behaved as a missing |
| precision). |
|
|
| • ‘mpfr_abs’, ‘mpfr_neg’ and ‘mpfr_set’ changed in MPFR 4.0. In |
| previous MPFR versions, the sign bit of a NaN was unspecified; |
| however, in practice, it was set as now specified except for |
| ‘mpfr_neg’ with a reused argument: ‘mpfr_neg(x,x,rnd)’. |
|
|
| • ‘mpfr_check_range’ changed in MPFR 2.3.2 and MPFR 2.4. If the |
| value is an inexact infinity, the overflow flag is now set (in case |
| it was lost), while it was previously left unchanged. This is |
| really what is expected in practice (and what the MPFR code was |
| expecting), so that the previous behavior was regarded as a bug. |
| Hence the change in MPFR 2.3.2. |
|
|
| • ‘mpfr_eint’ changed in MPFR 4.0. This function now returns the |
| value of the E1/eint1 function for negative argument (before |
| MPFR 4.0, it was returning NaN). |
|
|
| • ‘mpfr_get_f’ changed in MPFR 3.0. This function was returning |
| zero, except for NaN and Inf, which do not exist in MPF. The |
| _erange_ flag is now set in these cases, and ‘mpfr_get_f’ now |
| returns the usual ternary value. |
|
|
| • ‘mpfr_get_si’, ‘mpfr_get_sj’, ‘mpfr_get_ui’ and ‘mpfr_get_uj’ |
| changed in MPFR 3.0. In previous MPFR versions, the cases where |
| the _erange_ flag is set were unspecified. |
|
|
| • ‘mpfr_get_str’ changed in MPFR 4.0. This function now sets the NaN |
| flag on NaN input (to follow the usual MPFR rules on NaN and |
| IEEE 754 recommendations on string conversions from |
| Subclause 5.12.1) and sets the inexact flag when the conversion is |
| inexact. |
|
|
| • ‘mpfr_get_z’ changed in MPFR 3.0. The return type was ‘void’; it |
| is now ‘int’, and the usual ternary value is returned. Thus |
| programs that need to work with both MPFR 2.x and 3.x must not use |
| the return value. Even in this case, C code using ‘mpfr_get_z’ as |
| the second or third term of a conditional operator may also be |
| affected. For instance, the following is correct with MPFR 3.0, |
| but not with MPFR 2.x: |
| bool ? mpfr_get_z(...) : mpfr_add(...); |
| On the other hand, the following is correct with MPFR 2.x, but not |
| with MPFR 3.0: |
| bool ? mpfr_get_z(...) : (void) mpfr_add(...); |
| Portable code should cast ‘mpfr_get_z(...)’ to ‘void’ to use the |
| type ‘void’ for both terms of the conditional operator, as in: |
| bool ? (void) mpfr_get_z(...) : (void) mpfr_add(...); |
| Alternatively, ‘if ... else’ can be used instead of the conditional |
| operator. |
|
|
| Moreover the cases where the _erange_ flag is set were unspecified |
| in MPFR 2.x. |
|
|
| • ‘mpfr_get_z_exp’ changed in MPFR 3.0. In previous MPFR versions, |
| the cases where the _erange_ flag is set were unspecified. Note: |
| this function has been renamed to ‘mpfr_get_z_2exp’ in MPFR 3.0, |
| but ‘mpfr_get_z_exp’ is still available for compatibility reasons. |
|
|
| • ‘mpfr_out_str’ changed in MPFR 4.1. The argument BASE can now be |
| negative (from −2 to −36), in order to follow ‘mpfr_get_str’ and |
| GMP’s ‘mpf_out_str’ functions. |
|
|
| • ‘mpfr_set_exp’ changed in MPFR 4.0. Before MPFR 4.0, the exponent |
| was set whatever the contents of the MPFR object in argument. In |
| practice, this could be useful as a low-level function when the |
| MPFR number was being constructed by setting the fields of its |
| internal structure, but the API does not provide a way to do this |
| except by using internals. Thus, for the API, this behavior was |
| useless and could quickly lead to undefined behavior due to the |
| fact that the generated value could have an invalid format if the |
| MPFR object contained a special value (NaN, infinity or zero). |
|
|
| • ‘mpfr_strtofr’ changed in MPFR 2.3.1 and MPFR 2.4. This was |
| actually a bug fix since the code and the documentation did not |
| match. But both were changed in order to have a more consistent |
| and useful behavior. The main changes in the code are as follows. |
| The binary exponent is now accepted even without the ‘0b’ or ‘0x’ |
| prefix. Data corresponding to NaN can now have an optional sign |
| (such data were previously invalid). |
|
|
| • ‘mpfr_strtofr’ changed in MPFR 3.0. This function now accepts |
| bases from 37 to 62 (no changes for the other bases). Note: if an |
| unsupported base is provided to this function, the behavior is |
| undefined; more precisely, in MPFR 2.3.1 and later, providing an |
| unsupported base yields an assertion failure (this behavior may |
| change in the future). |
|
|
| • ‘mpfr_subnormalize’ changed in MPFR 3.1. This was actually |
| regarded as a bug fix. The ‘mpfr_subnormalize’ implementation up |
| to MPFR 3.0.0 did not change the flags. In particular, it did not |
| follow the generic rule concerning the inexact flag (and no special |
| behavior was specified). The case of the underflow flag was more a |
| lack of specification. |
|
|
| • ‘mpfr_sum’ changed in MPFR 4.0. The ‘mpfr_sum’ function has |
| completely been rewritten for MPFR 4.0, with an update of the |
| specification: the sign of an exact zero result is now specified, |
| and the return value is now the usual ternary value. The old |
| ‘mpfr_sum’ implementation could also take all the memory and crash |
| on inputs of very different magnitude. |
|
|
| • ‘mpfr_urandom’ and ‘mpfr_urandomb’ changed in MPFR 3.1. Their |
| behavior no longer depends on the platform (assuming this is also |
| true for GMP’s random generator, which is not the case between GMP |
| 4.1 and 4.2 if ‘gmp_randinit_default’ is used). As a consequence, |
| the returned values can be different between MPFR 3.1 and previous |
| MPFR versions. Note: as the reproducibility of these functions was |
| not specified before MPFR 3.1, the MPFR 3.1 behavior is _not_ |
| regarded as backward incompatible with previous versions. |
|
|
| • ‘mpfr_urandom’ changed in MPFR 4.0. The next random state no |
| longer depends on the current exponent range and the rounding mode. |
| The exceptions due to the rounding of the random number are now |
| correctly generated, following the uniform distribution. As a |
| consequence, the returned values can be different between MPFR 4.0 |
| and previous MPFR versions. |
|
|
| • Up to MPFR 4.1.0, some macros of the *note Custom Interface:: had |
| undocumented limitations. In particular, their arguments may be |
| evaluated multiple times or none. |
|
|
| |
| File: mpfr.info, Node: Removed Functions, Next: Other Changes, Prev: Changed Functions, Up: API Compatibility |
|
|
| 6.4 Removed Functions |
| ===================== |
|
|
| Functions ‘mpfr_random’ and ‘mpfr_random2’ have been removed in MPFR 3.0 |
| (this only affects old code built against MPFR 3.0 or later). (The |
| function ‘mpfr_random’ had been deprecated since at least MPFR 2.2.0, |
| and ‘mpfr_random2’ since MPFR 2.4.0.) |
|
|
| Macros ‘mpfr_add_one_ulp’ and ‘mpfr_sub_one_ulp’ have been removed in |
| MPFR 4.0. They were no longer documented since MPFR 2.1.0 and were |
| announced as deprecated since MPFR 3.1.0. |
|
|
| Function ‘mpfr_grandom’ is marked as deprecated in MPFR 4.0. It will |
| be removed in a future release. |
|
|
| |
| File: mpfr.info, Node: Other Changes, Prev: Removed Functions, Up: API Compatibility |
|
|
| 6.5 Other Changes |
| ================= |
|
|
| For users of a C++ compiler, the way how the availability of ‘intmax_t’ |
| is detected has changed in MPFR 3.0. In MPFR 2.x, if a macro ‘INTMAX_C’ |
| or ‘UINTMAX_C’ was defined (e.g. when the ‘__STDC_CONSTANT_MACROS’ |
| macro had been defined before ‘<stdint.h>’ or ‘<inttypes.h>’ has been |
| included), ‘intmax_t’ was assumed to be defined. However, this was not |
| always the case (more precisely, ‘intmax_t’ can be defined only in the |
| namespace ‘std’, as with Boost), so that compilations could fail. Thus |
| the check for ‘INTMAX_C’ or ‘UINTMAX_C’ is now disabled for C++ |
| compilers, with the following consequences: |
|
|
| • Programs written for MPFR 2.x that need ‘intmax_t’ may no longer be |
| compiled against MPFR 3.0: a ‘#define MPFR_USE_INTMAX_T’ may be |
| necessary before ‘mpfr.h’ is included. |
|
|
| • The compilation of programs that work with MPFR 3.0 may fail with |
| MPFR 2.x due to the problem described above. Workarounds are |
| possible, such as defining ‘intmax_t’ and ‘uintmax_t’ in the global |
| namespace, though this is not clean. |
|
|
| The divide-by-zero exception is new in MPFR 3.1. However, it should |
| not introduce incompatible changes for programs that strictly follow the |
| MPFR API since the exception can only be seen via new functions. |
|
|
| As of MPFR 3.1, the ‘mpfr.h’ header can be included several times, |
| while still supporting optional functions (*note Headers and |
| Libraries::). |
|
|
| The way memory is allocated by MPFR should be regarded as |
| well-specified only as of MPFR 4.0. |
|
|
| |
| File: mpfr.info, Node: MPFR and the IEEE 754 Standard, Next: Contributors, Prev: API Compatibility, Up: Top |
|
|
| 7 MPFR and the IEEE 754 Standard |
| |
|
|
| This section describes differences between MPFR and the IEEE 754 |
| standard, and behaviors that are not specified yet in IEEE 754. |
|
|
| The MPFR numbers do not include subnormals. The reason is that |
| subnormals are less useful than in IEEE 754 as the default exponent |
| range in MPFR is large and they would have made the implementation more |
| complex. However, subnormals can be emulated using ‘mpfr_subnormalize’. |
|
|
| MPFR has a single NaN. The behavior is similar either to a signaling |
| NaN or to a quiet NaN, depending on the context. For any function |
| returning a NaN (either produced or propagated), the NaN flag is set, |
| while in IEEE 754, some operations are quiet (even on a signaling NaN). |
|
|
| The ‘mpfr_rec_sqrt’ function differs from IEEE 754 on −0, where it |
| gives +Inf (like for +0), following the usual limit rules, instead of |
| −Inf. |
|
|
| The ‘mpfr_root’ function predates IEEE 754-2008, where rootn was |
| introduced, and behaves differently from the IEEE 754 rootn operation. |
| It is deprecated and ‘mpfr_rootn_ui’ should be used instead. |
|
|
| Operations with an unsigned zero: For functions taking an argument of |
| integer or rational type, a zero of such a type is unsigned unlike the |
| floating-point zero (this includes the zero of type ‘unsigned long’, |
| which is a mathematical, exact zero, as opposed to a floating-point |
| zero, which may come from an underflow and whose sign would correspond |
| to the sign of the real non-zero value). Unless documented otherwise, |
| this zero is regarded as +0, as if it were first converted to a MPFR |
| number with ‘mpfr_set_ui’ or ‘mpfr_set_si’ (thus the result may not |
| agree with the usual limit rules applied to a mathematical zero). This |
| is not the case of addition and subtraction (‘mpfr_add_ui’, etc.), but |
| for these functions, only the sign of a zero result would be affected, |
| with +0 and −0 considered equal. Such operations are currently out of |
| the scope of the IEEE 754 standard, and at the time of specification in |
| MPFR, the Floating-Point Working Group in charge of the revision of |
| IEEE 754 did not want to discuss issues with non-floating-point types in |
| general. |
|
|
| Note also that some obvious differences may come from the fact that |
| in MPFR, each variable has its own precision. For instance, a |
| subtraction of two numbers of the same sign may yield an overflow; idem |
| for a call to ‘mpfr_set’, ‘mpfr_neg’ or ‘mpfr_abs’, if the destination |
| variable has a smaller precision. |
|
|
| |
| File: mpfr.info, Node: Contributors, Next: References, Prev: MPFR and the IEEE 754 Standard, Up: Top |
|
|
| Contributors |
| |
|
|
| The main developers of MPFR are Guillaume Hanrot, Vincent Lefèvre, |
| Patrick Pélissier, Philippe Théveny and Paul Zimmermann. |
|
|
| Sylvie Boldo from ENS-Lyon, France, contributed the functions |
| ‘mpfr_agm’ and ‘mpfr_log’. Sylvain Chevillard contributed the ‘mpfr_ai’ |
| function. David Daney contributed the hyperbolic and inverse hyperbolic |
| functions, the base-2 exponential, and the factorial function. Alain |
| Delplanque contributed the new version of the ‘mpfr_get_str’ function. |
| Mathieu Dutour contributed the functions ‘mpfr_acos’, ‘mpfr_asin’ and |
| ‘mpfr_atan’, and a previous version of ‘mpfr_gamma’. Laurent Fousse |
| contributed the original version of the ‘mpfr_sum’ function (used up to |
| MPFR 3.1). Emmanuel Jeandel, from ENS-Lyon too, contributed the generic |
| hypergeometric code, as well as the internal function ‘mpfr_exp3’, a |
| first implementation of the sine and cosine, and improved versions of |
| ‘mpfr_const_log2’ and ‘mpfr_const_pi’. Ludovic Meunier helped in the |
| design of the ‘mpfr_erf’ code. Jean-Luc Rémy contributed the |
| ‘mpfr_zeta’ code. Fabrice Rouillier contributed the ‘mpfr_xxx_z’ and |
| ‘mpfr_xxx_q’ functions, and helped to the Microsoft Windows porting. |
| Damien Stehlé contributed the ‘mpfr_get_ld_2exp’ function. Charles |
| Karney contributed the ‘mpfr_nrandom’ and ‘mpfr_erandom’ functions. |
|
|
| We would like to thank Jean-Michel Muller and Joris van der Hoeven |
| for very fruitful discussions at the beginning of that project, Torbjörn |
| Granlund and Kevin Ryde for their help about design issues, and Nathalie |
| Revol for her careful reading of a previous version of this |
| documentation. In particular Kevin Ryde did a tremendous job for the |
| portability of MPFR in 2002-2004. |
|
|
| The development of the MPFR library would not have been possible |
| without the continuous support of INRIA, and of the LORIA (Nancy, |
| France) and LIP (Lyon, France) laboratories. In particular the main |
| authors were or are members of the PolKA, Spaces, Cacao, Caramel and |
| Caramba project-teams at LORIA and of the Arénaire and AriC |
| project-teams at LIP. This project was started during the Fiable |
| (reliable in French) action supported by INRIA, and continued during the |
| AOC action. The development of MPFR was also supported by a grant |
| (202F0659 00 MPN 121) from the Conseil Régional de Lorraine in 2002, |
| from INRIA by an "associate engineer" grant (2003-2005), an "opération |
| de développement logiciel" grant (2007-2009), and the post-doctoral |
| grant of Sylvain Chevillard in 2009-2010. The MPFR-MPC workshop in June |
| 2012 was partly supported by the ERC grant ANTICS of Andreas Enge. The |
| MPFR-MPC workshop in January 2013 was partly supported by the ERC grant |
| ANTICS, the GDR IM and the Caramel project-team, during which Mickaël |
| Gastineau contributed the MPFRbench program, Fredrik Johansson a faster |
| version of ‘mpfr_const_euler’, and Jianyang Pan a formally proven |
| version of the ‘mpfr_add1sp1’ internal routine. |
|
|
| |
| File: mpfr.info, Node: References, Next: GNU Free Documentation License, Prev: Contributors, Up: Top |
|
|
| References |
| |
|
|
| • Richard Brent and Paul Zimmermann, "Modern Computer Arithmetic", |
| Cambridge University Press, Cambridge Monographs on Applied and |
| Computational Mathematics, Number 18, 2010. Electronic version |
| freely available at |
| <https: |
|
|
| • Laurent Fousse, Guillaume Hanrot, Vincent Lefèvre, Patrick |
| Pélissier and Paul Zimmermann, "MPFR: A Multiple-Precision Binary |
| Floating-Point Library With Correct Rounding", ACM Transactions on |
| Mathematical Software, volume 33, issue 2, article 13, 15 pages, |
| 2007, <https: |
|
|
| • Torbjörn Granlund, "GNU MP: The GNU Multiple Precision Arithmetic |
| Library", version 6.1.2, 2016, <https: |
|
|
| • 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. |
|
|
| • IEEE Standard for Floating-Point Arithmetic, IEEE Standard |
| 754-2008, 2008. Revision of IEEE Standard 754-1985, approved June |
| 12, 2008: IEEE-SA Standards Board, 70 pages. |
|
|
| • IEEE Standard for Floating-Point Arithmetic, IEEE Standard |
| 754-2019, 2019. Revision of IEEE Standard 754-2008, approved June |
| 13, 2019: IEEE-SA Standards Board, 84 pages. |
|
|
| • Donald E. Knuth, "The Art of Computer Programming", vol 2, |
| "Seminumerical Algorithms", 2nd edition, Addison-Wesley, 1981. |
|
|
| • Jean-Michel Muller, "Elementary Functions, Algorithms and |
| Implementation", Birkhäuser, Boston, 3rd edition, 2016. |
|
|
| • Jean-Michel Muller, Nicolas Brisebarre, Florent de Dinechin, |
| Claude-Pierre Jeannerod, Vincent Lefèvre, Guillaume Melquiond, |
| Nathalie Revol, Damien Stehlé and Serge Torrès, "Handbook of |
| Floating-Point Arithmetic", Birkhäuser, Boston, 2009. |
|
|
| |
| File: mpfr.info, Node: GNU Free Documentation License, Next: Concept Index, Prev: References, Up: Top |
|
|
| Appendix A GNU Free Documentation License |
| |
|
|
| Version 1.2, November 2002 |
|
|
| Copyright © 2000,2001,2002 Free Software Foundation, Inc. |
| 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
|
|
| Everyone is permitted to copy and distribute verbatim copies |
| of this license document, but changing it is not allowed. |
|
|
| 0. PREAMBLE |
|
|
| The purpose of this License is to make a manual, textbook, or other |
| functional and useful document “free” in the sense of freedom: to |
| assure everyone the effective freedom to copy and redistribute it, |
| with or without modifying it, either commercially or |
| noncommercially. Secondarily, this License preserves for the |
| author and publisher a way to get credit for their work, while not |
| being considered responsible for modifications made by others. |
|
|
| This License is a kind of “copyleft”, which means that derivative |
| works of the document must themselves be free in the same sense. |
| It complements the GNU General Public License, which is a copyleft |
| license designed for free software. |
|
|
| We have designed this License in order to use it for manuals for |
| free software, because free software needs free documentation: a |
| free program should come with manuals providing the same freedoms |
| that the software does. But this License is not limited to |
| software manuals; it can be used for any textual work, regardless |
| of subject matter or whether it is published as a printed book. We |
| recommend this License principally for works whose purpose is |
| instruction or reference. |
|
|
| 1. APPLICABILITY AND DEFINITIONS |
|
|
| This License applies to any manual or other work, in any medium, |
| that contains a notice placed by the copyright holder saying it can |
| be distributed under the terms of this License. Such a notice |
| grants a world-wide, royalty-free license, unlimited in duration, |
| to use that work under the conditions stated herein. The |
| “Document”, below, refers to any such manual or work. Any member |
| of the public is a licensee, and is addressed as “you”. You accept |
| the license if you copy, modify or distribute the work in a way |
| requiring permission under copyright law. |
|
|
| A “Modified Version” of the Document means any work containing the |
| Document or a portion of it, either copied verbatim, or with |
| modifications and/or translated into another language. |
|
|
| A “Secondary Section” is a named appendix or a front-matter section |
| of the Document that deals exclusively with the relationship of the |
| publishers or authors of the Document to the Document’s overall |
| subject (or to related matters) and contains nothing that could |
| fall directly within that overall subject. (Thus, if the Document |
| is in part a textbook of mathematics, a Secondary Section may not |
| explain any mathematics.) The relationship could be a matter of |
| historical connection with the subject or with related matters, or |
| of legal, commercial, philosophical, ethical or political position |
| regarding them. |
|
|
| The “Invariant Sections” are certain Secondary Sections whose |
| titles are designated, as being those of Invariant Sections, in the |
| notice that says that the Document is released under this License. |
| If a section does not fit the above definition of Secondary then it |
| is not allowed to be designated as Invariant. The Document may |
| contain zero Invariant Sections. If the Document does not identify |
| any Invariant Sections then there are none. |
|
|
| The “Cover Texts” are certain short passages of text that are |
| listed, as Front-Cover Texts or Back-Cover Texts, in the notice |
| that says that the Document is released under this License. A |
| Front-Cover Text may be at most 5 words, and a Back-Cover Text may |
| be at most 25 words. |
|
|
| A “Transparent” copy of the Document means a machine-readable copy, |
| represented in a format whose specification is available to the |
| general public, that is suitable for revising the document |
| straightforwardly with generic text editors or (for images composed |
| of pixels) generic paint programs or (for drawings) some widely |
| available drawing editor, and that is suitable for input to text |
| formatters or for automatic translation to a variety of formats |
| suitable for input to text formatters. A copy made in an otherwise |
| Transparent file format whose markup, or absence of markup, has |
| been arranged to thwart or discourage subsequent modification by |
| readers is not Transparent. An image format is not Transparent if |
| used for any substantial amount of text. A copy that is not |
| “Transparent” is called “Opaque”. |
|
|
| Examples of suitable formats for Transparent copies include plain |
| ASCII without markup, Texinfo input format, LaTeX input format, |
| SGML or XML using a publicly available DTD, and standard-conforming |
| simple HTML, PostScript or PDF designed for human modification. |
| Examples of transparent image formats include PNG, XCF and JPG. |
| Opaque formats include proprietary formats that can be read and |
| edited only by proprietary word processors, SGML or XML for which |
| the DTD and/or processing tools are not generally available, and |
| the machine-generated HTML, PostScript or PDF produced by some word |
| processors for output purposes only. |
|
|
| The “Title Page” means, for a printed book, the title page itself, |
| plus such following pages as are needed to hold, legibly, the |
| material this License requires to appear in the title page. For |
| works in formats which do not have any title page as such, “Title |
| Page” means the text near the most prominent appearance of the |
| work’s title, preceding the beginning of the body of the text. |
|
|
| A section “Entitled XYZ” means a named subunit of the Document |
| whose title either is precisely XYZ or contains XYZ in parentheses |
| following text that translates XYZ in another language. (Here XYZ |
| stands for a specific section name mentioned below, such as |
| “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) |
| To “Preserve the Title” of such a section when you modify the |
| Document means that it remains a section “Entitled XYZ” according |
| to this definition. |
|
|
| The Document may include Warranty Disclaimers next to the notice |
| which states that this License applies to the Document. These |
| Warranty Disclaimers are considered to be included by reference in |
| this License, but only as regards disclaiming warranties: any other |
| implication that these Warranty Disclaimers may have is void and |
| has no effect on the meaning of this License. |
|
|
| 2. VERBATIM COPYING |
|
|
| You may copy and distribute the Document in any medium, either |
| commercially or noncommercially, provided that this License, the |
| copyright notices, and the license notice saying this License |
| applies to the Document are reproduced in all copies, and that you |
| add no other conditions whatsoever to those of this License. You |
| may not use technical measures to obstruct or control the reading |
| or further copying of the copies you make or distribute. However, |
| you may accept compensation in exchange for copies. If you |
| distribute a large enough number of copies you must also follow the |
| conditions in section 3. |
|
|
| You may also lend copies, under the same conditions stated above, |
| and you may publicly display copies. |
|
|
| 3. COPYING IN QUANTITY |
|
|
| If you publish printed copies (or copies in media that commonly |
| have printed covers) of the Document, numbering more than 100, and |
| the Document’s license notice requires Cover Texts, you must |
| enclose the copies in covers that carry, clearly and legibly, all |
| these Cover Texts: Front-Cover Texts on the front cover, and |
| Back-Cover Texts on the back cover. Both covers must also clearly |
| and legibly identify you as the publisher of these copies. The |
| front cover must present the full title with all words of the title |
| equally prominent and visible. You may add other material on the |
| covers in addition. Copying with changes limited to the covers, as |
| long as they preserve the title of the Document and satisfy these |
| conditions, can be treated as verbatim copying in other respects. |
|
|
| If the required texts for either cover are too voluminous to fit |
| legibly, you should put the first ones listed (as many as fit |
| reasonably) on the actual cover, and continue the rest onto |
| adjacent pages. |
|
|
| If you publish or distribute Opaque copies of the Document |
| numbering more than 100, you must either include a machine-readable |
| Transparent copy along with each Opaque copy, or state in or with |
| each Opaque copy a computer-network location from which the general |
| network-using public has access to download using public-standard |
| network protocols a complete Transparent copy of the Document, free |
| of added material. If you use the latter option, you must take |
| reasonably prudent steps, when you begin distribution of Opaque |
| copies in quantity, to ensure that this Transparent copy will |
| remain thus accessible at the stated location until at least one |
| year after the last time you distribute an Opaque copy (directly or |
| through your agents or retailers) of that edition to the public. |
|
|
| It is requested, but not required, that you contact the authors of |
| the Document well before redistributing any large number of copies, |
| to give them a chance to provide you with an updated version of the |
| Document. |
|
|
| 4. MODIFICATIONS |
|
|
| You may copy and distribute a Modified Version of the Document |
| under the conditions of sections 2 and 3 above, provided that you |
| release the Modified Version under precisely this License, with the |
| Modified Version filling the role of the Document, thus licensing |
| distribution and modification of the Modified Version to whoever |
| possesses a copy of it. In addition, you must do these things in |
| the Modified Version: |
|
|
| A. Use in the Title Page (and on the covers, if any) a title |
| distinct from that of the Document, and from those of previous |
| versions (which should, if there were any, be listed in the |
| History section of the Document). You may use the same title |
| as a previous version if the original publisher of that |
| version gives permission. |
|
|
| B. List on the Title Page, as authors, one or more persons or |
| entities responsible for authorship of the modifications in |
| the Modified Version, together with at least five of the |
| principal authors of the Document (all of its principal |
| authors, if it has fewer than five), unless they release you |
| from this requirement. |
|
|
| C. State on the Title page the name of the publisher of the |
| Modified Version, as the publisher. |
|
|
| D. Preserve all the copyright notices of the Document. |
|
|
| E. Add an appropriate copyright notice for your modifications |
| adjacent to the other copyright notices. |
|
|
| F. Include, immediately after the copyright notices, a license |
| notice giving the public permission to use the Modified |
| Version under the terms of this License, in the form shown in |
| the Addendum below. |
|
|
| G. Preserve in that license notice the full lists of Invariant |
| Sections and required Cover Texts given in the Document’s |
| license notice. |
|
|
| H. Include an unaltered copy of this License. |
|
|
| I. Preserve the section Entitled “History”, Preserve its Title, |
| and add to it an item stating at least the title, year, new |
| authors, and publisher of the Modified Version as given on the |
| Title Page. If there is no section Entitled “History” in the |
| Document, create one stating the title, year, authors, and |
| publisher of the Document as given on its Title Page, then add |
| an item describing the Modified Version as stated in the |
| previous sentence. |
|
|
| J. Preserve the network location, if any, given in the Document |
| for public access to a Transparent copy of the Document, and |
| likewise the network locations given in the Document for |
| previous versions it was based on. These may be placed in the |
| “History” section. You may omit a network location for a work |
| that was published at least four years before the Document |
| itself, or if the original publisher of the version it refers |
| to gives permission. |
|
|
| K. For any section Entitled “Acknowledgements” or “Dedications”, |
| Preserve the Title of the section, and preserve in the section |
| all the substance and tone of each of the contributor |
| acknowledgements and/or dedications given therein. |
|
|
| L. Preserve all the Invariant Sections of the Document, unaltered |
| in their text and in their titles. Section numbers or the |
| equivalent are not considered part of the section titles. |
|
|
| M. Delete any section Entitled “Endorsements”. Such a section |
| may not be included in the Modified Version. |
|
|
| N. Do not retitle any existing section to be Entitled |
| “Endorsements” or to conflict in title with any Invariant |
| Section. |
|
|
| O. Preserve any Warranty Disclaimers. |
|
|
| If the Modified Version includes new front-matter sections or |
| appendices that qualify as Secondary Sections and contain no |
| material copied from the Document, you may at your option designate |
| some or all of these sections as invariant. To do this, add their |
| titles to the list of Invariant Sections in the Modified Version’s |
| license notice. These titles must be distinct from any other |
| section titles. |
|
|
| You may add a section Entitled “Endorsements”, provided it contains |
| nothing but endorsements of your Modified Version by various |
| parties—for example, statements of peer review or that the text has |
| been approved by an organization as the authoritative definition of |
| a standard. |
|
|
| You may add a passage of up to five words as a Front-Cover Text, |
| and a passage of up to 25 words as a Back-Cover Text, to the end of |
| the list of Cover Texts in the Modified Version. Only one passage |
| of Front-Cover Text and one of Back-Cover Text may be added by (or |
| through arrangements made by) any one entity. If the Document |
| already includes a cover text for the same cover, previously added |
| by you or by arrangement made by the same entity you are acting on |
| behalf of, you may not add another; but you may replace the old |
| one, on explicit permission from the previous publisher that added |
| the old one. |
|
|
| The author(s) and publisher(s) of the Document do not by this |
| License give permission to use their names for publicity for or to |
| assert or imply endorsement of any Modified Version. |
|
|
| 5. COMBINING DOCUMENTS |
|
|
| You may combine the Document with other documents released under |
| this License, under the terms defined in section 4 above for |
| modified versions, provided that you include in the combination all |
| of the Invariant Sections of all of the original documents, |
| unmodified, and list them all as Invariant Sections of your |
| combined work in its license notice, and that you preserve all |
| their Warranty Disclaimers. |
|
|
| The combined work need only contain one copy of this License, and |
| multiple identical Invariant Sections may be replaced with a single |
| copy. If there are multiple Invariant Sections with the same name |
| but different contents, make the title of each such section unique |
| by adding at the end of it, in parentheses, the name of the |
| original author or publisher of that section if known, or else a |
| unique number. Make the same adjustment to the section titles in |
| the list of Invariant Sections in the license notice of the |
| combined work. |
|
|
| In the combination, you must combine any sections Entitled |
| “History” in the various original documents, forming one section |
| Entitled “History”; likewise combine any sections Entitled |
| “Acknowledgements”, and any sections Entitled “Dedications”. You |
| must delete all sections Entitled “Endorsements.” |
|
|
| 6. COLLECTIONS OF DOCUMENTS |
|
|
| You may make a collection consisting of the Document and other |
| documents released under this License, and replace the individual |
| copies of this License in the various documents with a single copy |
| that is included in the collection, provided that you follow the |
| rules of this License for verbatim copying of each of the documents |
| in all other respects. |
|
|
| You may extract a single document from such a collection, and |
| distribute it individually under this License, provided you insert |
| a copy of this License into the extracted document, and follow this |
| License in all other respects regarding verbatim copying of that |
| document. |
|
|
| 7. AGGREGATION WITH INDEPENDENT WORKS |
|
|
| A compilation of the Document or its derivatives with other |
| separate and independent documents or works, in or on a volume of a |
| storage or distribution medium, is called an “aggregate” if the |
| copyright resulting from the compilation is not used to limit the |
| legal rights of the compilation’s users beyond what the individual |
| works permit. When the Document is included in an aggregate, this |
| License does not apply to the other works in the aggregate which |
| are not themselves derivative works of the Document. |
|
|
| If the Cover Text requirement of section 3 is applicable to these |
| copies of the Document, then if the Document is less than one half |
| of the entire aggregate, the Document’s Cover Texts may be placed |
| on covers that bracket the Document within the aggregate, or the |
| electronic equivalent of covers if the Document is in electronic |
| form. Otherwise they must appear on printed covers that bracket |
| the whole aggregate. |
|
|
| 8. TRANSLATION |
|
|
| Translation is considered a kind of modification, so you may |
| distribute translations of the Document under the terms of section |
| 4. Replacing Invariant Sections with translations requires special |
| permission from their copyright holders, but you may include |
| translations of some or all Invariant Sections in addition to the |
| original versions of these Invariant Sections. You may include a |
| translation of this License, and all the license notices in the |
| Document, and any Warranty Disclaimers, provided that you also |
| include the original English version of this License and the |
| original versions of those notices and disclaimers. In case of a |
| disagreement between the translation and the original version of |
| this License or a notice or disclaimer, the original version will |
| prevail. |
|
|
| If a section in the Document is Entitled “Acknowledgements”, |
| “Dedications”, or “History”, the requirement (section 4) to |
| Preserve its Title (section 1) will typically require changing the |
| actual title. |
|
|
| 9. TERMINATION |
|
|
| You may not copy, modify, sublicense, or distribute the Document |
| except as expressly provided for under this License. Any other |
| attempt to copy, modify, sublicense or distribute the Document is |
| void, and will automatically terminate your rights under this |
| License. However, parties who have received copies, or rights, |
| from you under this License will not have their licenses terminated |
| so long as such parties remain in full compliance. |
|
|
| 10. FUTURE REVISIONS OF THIS LICENSE |
|
|
| The Free Software Foundation may publish new, revised versions of |
| the GNU Free Documentation License from time to time. Such new |
| versions will be similar in spirit to the present version, but may |
| differ in detail to address new problems or concerns. See |
| <https: |
|
|
| Each version of the License is given a distinguishing version |
| number. If the Document specifies that a particular numbered |
| version of this License “or any later version” applies to it, you |
| have the option of following the terms and conditions either of |
| that specified version or of any later version that has been |
| published (not as a draft) by the Free Software Foundation. If the |
| Document does not specify a version number of this License, you may |
| choose any version ever published (not as a draft) by the Free |
| Software Foundation. |
|
|
| A.1 ADDENDUM: How to Use This License For Your Documents |
| ======================================================== |
|
|
| To use this License in a document you have written, include a copy of |
| the License in the document and put the following copyright and license |
| notices just after the title page: |
|
|
| Copyright (C) YEAR YOUR NAME. |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.2 |
| or any later version published by the Free Software Foundation; |
| with no Invariant Sections, no Front-Cover Texts, and no Back-Cover |
| Texts. A copy of the license is included in the section entitled ``GNU |
| Free Documentation License''. |
|
|
| If you have Invariant Sections, Front-Cover Texts and Back-Cover |
| Texts, replace the “with...Texts.” line with this: |
|
|
| with the Invariant Sections being LIST THEIR TITLES, with |
| the Front-Cover Texts being LIST, and with the Back-Cover Texts |
| being LIST. |
|
|
| If you have Invariant Sections without Cover Texts, or some other |
| combination of the three, merge those two alternatives to suit the |
| situation. |
|
|
| If your document contains nontrivial examples of program code, we |
| recommend releasing these examples in parallel under your choice of free |
| software license, such as the GNU General Public License, to permit |
| their use in free software. |
|
|
| |
| File: mpfr.info, Node: Concept Index, Next: Function and Type Index, Prev: GNU Free Documentation License, Up: Top |
|
|
| Concept Index |
| |
|
|
| |