efee5258bc
The MPFR library is a C library for multiple-precision floating-point computations with exact rounding (also called correct rounding). It is based on the GMP multiple-precision library and should replace the MPF class in further releases of GMP. GCC >= 4.2 requires MPFR.
4060 lines
199 KiB
Plaintext
4060 lines
199 KiB
Plaintext
This is mpfr.info, produced by makeinfo version 4.13 from mpfr.texi.
|
||
|
||
This manual documents how to install and use the Multiple Precision
|
||
Floating-Point Reliable Library, version 3.0.1.
|
||
|
||
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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
|
||
* mpfr: (mpfr). Multiple Precision Floating-Point Reliable Library.
|
||
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 3.0.1.
|
||
|
||
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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::.
|
||
|
||
|
||
* Menu:
|
||
|
||
* Copying:: MPFR Copying Conditions (LGPL).
|
||
* Introduction to MPFR:: Brief introduction to GNU MPFR.
|
||
* Installing MPFR:: How to configure and compile the MPFR library.
|
||
* Reporting Bugs:: How to usefully report bugs.
|
||
* MPFR Basics:: What every MPFR user should now.
|
||
* MPFR Interface:: MPFR functions and macros.
|
||
* API Compatibility:: API compatibility with previous MPFR versions.
|
||
* Contributors::
|
||
* References::
|
||
* GNU Free Documentation License::
|
||
* Concept Index::
|
||
* Function Index::
|
||
|
||
|
||
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);
|
||
|
||
* 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.
|
||
|
||
In particular, with a precision of 53 bits, MPFR is able to exactly
|
||
reproduce all computations with double-precision machine floating-point
|
||
numbers (e.g., `double' type in C, with a C implementation that
|
||
rigorously follows Annex F of the ISO C99 standard and `FP_CONTRACT'
|
||
pragma set to `OFF') on the four arithmetic operations and the square
|
||
root, except the default exponent range is much wider and subnormal
|
||
numbers are not implemented (but can be emulated).
|
||
|
||
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 4.1 or
|
||
higher) on your computer. You need a C compiler, preferably GCC,
|
||
but any reasonable compiler should work. 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 setup 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 MPFR was built correctly. If you get error
|
||
messages, please report this to `mpfr@loria.fr'. (*Note Reporting
|
||
Bugs::, for information on what to include in useful bug reports.)
|
||
|
||
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 `mpfr.html'; if you want only one output HTML file, then
|
||
type `makeinfo --html --no-split mpfr.texi' 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
|
||
`http://www.mpfr.org/faq.html'.
|
||
|
||
Please report problems to `mpfr@loria.fr'. *Note Reporting Bugs::.
|
||
Some bug fixes are available on the MPFR 3.0.1 web page
|
||
`http://www.mpfr.org/mpfr-3.0.1/'.
|
||
|
||
2.4 Getting the Latest Version of MPFR
|
||
======================================
|
||
|
||
The latest version of MPFR is available from
|
||
`ftp://ftp.gnu.org/gnu/mpfr/' or `http://www.mpfr.org/'.
|
||
|
||
|
||
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 3.0.1 web page `http://www.mpfr.org/mpfr-3.0.1/' and the
|
||
FAQ `http://www.mpfr.org/faq.html': perhaps this bug is already known,
|
||
in which case you may find there a workaround for it. You might also
|
||
look in the archives of the MPFR mailing-list:
|
||
`http://websympa.loria.fr/wwsympa/arc/mpfr'. Otherwise, please
|
||
investigate and report it. We have made this library available to you,
|
||
and it is not to ask too much from you, to ask you to report the bugs
|
||
that you find.
|
||
|
||
There are a few things you should think about when you put your bug
|
||
report together.
|
||
|
||
You have to send us a test case that makes it possible for us to
|
||
reproduce the bug, 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're using
|
||
GCC, `gcc -v'. Also, include the output from `uname -a' and the MPFR
|
||
version (the GMP version may be useful 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: `mpfr@loria.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
|
||
*************
|
||
|
||
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, users of C++ compilers
|
||
under some platforms 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), the aforementioned
|
||
standard headers should be included *before* the first inclusion of
|
||
`mpfr.h' or `gmp.h'. For the time being, this problem is not avoidable
|
||
in MPFR without a change in GMP.
|
||
|
||
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.info)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.
|
||
|
||
4.2 Nomenclature and Types
|
||
==========================
|
||
|
||
A "floating-point number", or "float" for short, is an arbitrary
|
||
precision significand (also called mantissa) with a limited precision
|
||
exponent. The C data type for such objects is `mpfr_t' (internally
|
||
defined as a one-element array of a structure, and `mpfr_ptr' is the C
|
||
data type representing a pointer to this structure). A floating-point
|
||
number can have three special values: Not-a-Number (NaN) or plus or
|
||
minus Infinity. NaN represents an uninitialized object, the result of
|
||
an invalid operation (like 0 divided by 0), or a value that cannot be
|
||
determined (like +Infinity minus +Infinity). Moreover, like in the IEEE
|
||
754 standard, zero is signed, i.e., there are both +0 and -0; the
|
||
behavior is the same as in the IEEE 754 standard and it is generalized
|
||
to the other functions supported by MPFR. Unless documented otherwise,
|
||
the sign bit of a NaN is unspecified.
|
||
|
||
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 2.
|
||
|
||
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. Moreover, you
|
||
may reach some memory limit on your platform, in which case the program
|
||
may abort, crash or have undefined behavior (depending on your C
|
||
implementation).
|
||
|
||
The "rounding mode" specifies the way to round the result of a
|
||
floating-point operation, in case the exact result can not be
|
||
represented exactly in the destination significand; the corresponding C
|
||
data type is `mpfr_rnd_t'.
|
||
|
||
4.3 MPFR Variable Conventions
|
||
=============================
|
||
|
||
Before you can assign to an MPFR variable, you need to initialize it by
|
||
calling one of the special initialization functions. When you're 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.
|
||
|
||
4.4 Rounding Modes
|
||
==================
|
||
|
||
The following five rounding modes are supported:
|
||
|
||
* `MPFR_RNDN': round to nearest (roundTiesToEven in IEEE 754-2008),
|
||
|
||
* `MPFR_RNDZ': round toward zero (roundTowardZero in IEEE 754-2008),
|
||
|
||
* `MPFR_RNDU': round toward plus infinity (roundTowardPositive in
|
||
IEEE 754-2008),
|
||
|
||
* `MPFR_RNDD': round toward minus infinity (roundTowardNegative in
|
||
IEEE 754-2008),
|
||
|
||
* `MPFR_RNDA': round away from zero (experimental).
|
||
|
||
The `round to nearest' mode works as in the IEEE 754 standard: in
|
||
case the number to be rounded lies exactly in the middle of two
|
||
representable numbers, it is rounded to the one with the least
|
||
significant bit set to zero. For example, the number 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).
|
||
|
||
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 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.
|
||
|
||
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 Section "Rounding Modes" (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 the limit is not defined (e.g., `mpfr_log' on
|
||
-0), the behavior is specified in the description of the MPFR function.
|
||
|
||
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. 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 Special
|
||
Functions::), since for any finite input X, `mpfr_hypot' on (X,+Inf)
|
||
gives +Inf.
|
||
|
||
4.6 Exceptions
|
||
==============
|
||
|
||
MPFR supports 5 exception types:
|
||
|
||
* 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 plus 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: 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.
|
||
|
||
* NaN: A NaN exception occurs when the result of a function is NaN.
|
||
|
||
* Inexact: An inexact exception occurs when the result of a function
|
||
cannot be represented exactly and must be rounded.
|
||
|
||
* Range error: 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).
|
||
|
||
|
||
MPFR has a global flag for each exception, which can be cleared, set
|
||
or tested by functions described in *note Exception Related Functions::.
|
||
|
||
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.
|
||
|
||
|
||
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.
|
||
|
||
At any time, the user can free the various caches with
|
||
`mpfr_free_cache'. It is strongly advised to do that before terminating
|
||
a thread, or before exiting when using tools like `valgrind' (to avoid
|
||
memory leaks being reported).
|
||
|
||
MPFR internal data such as flags, the exponent range, the default
|
||
precision and rounding mode, and caches (i.e., data that are not
|
||
accessed via parameters) are either global (if MPFR has not been
|
||
compiled as thread safe) or per-thread (thread local storage).
|
||
|
||
|
||
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 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 by
|
||
any MPFR function or macro, whether or not there is an error.
|
||
|
||
* Menu:
|
||
|
||
* Initialization Functions::
|
||
* Assignment Functions::
|
||
* Combined Initialization and Assignment Functions::
|
||
* Conversion Functions::
|
||
* Basic Arithmetic Functions::
|
||
* Comparison Functions::
|
||
* Special Functions::
|
||
* Input and Output Functions::
|
||
* Formatted Output Functions::
|
||
* Integer Related Functions::
|
||
* Rounding Related Functions::
|
||
* Miscellaneous Functions::
|
||
* Exception Related Functions::
|
||
* Compatibility with MPF::
|
||
* Custom Interface::
|
||
* Internals::
|
||
|
||
|
||
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 which has already been
|
||
initialized, use `mpfr_set_prec'. 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 C89). 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 C89
|
||
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.
|
||
|
||
-- Function: mpfr_prec_t mpfr_get_default_prec (void)
|
||
Return the current default MPFR precision in bits.
|
||
|
||
Here is an example on how to initialize floating-point variables:
|
||
|
||
{
|
||
mpfr_t x, y;
|
||
mpfr_init (x); /* use default precision */
|
||
mpfr_init2 (y, 256); /* precision _exactly_ 256 bits */
|
||
...
|
||
/* When the program is about to exit, do ... */
|
||
mpfr_clear (x);
|
||
mpfr_clear (y);
|
||
mpfr_free_cache (); /* free the cache for constants like pi */
|
||
}
|
||
|
||
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)
|
||
Reset 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.
|
||
|
||
-- 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_decimal64 (mpfr_t ROP, _Decimal64 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.
|
||
If the system does not support the IEEE 754 standard,
|
||
`mpfr_set_flt', `mpfr_set_d', `mpfr_set_ld' and
|
||
`mpfr_set_decimal64' might not preserve the signed zeros. The
|
||
`mpfr_set_decimal64' function is built only with the configure
|
||
option `--enable-decimal-float', which also requires
|
||
`--with-gmp-build', and when the compiler or system provides the
|
||
`_Decimal64' data type (recent versions of GCC support this data
|
||
type). `mpfr_set_q' might fail if the numerator (or the
|
||
denominator) can not be represented as a `mpfr_t'.
|
||
|
||
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' or
|
||
`mpfr_set_decimal64'. Otherwise the floating-point constant will
|
||
be first converted into a reduced-precision (e.g., 53-bit) binary
|
||
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 the valid string formats. Contrary to
|
||
`mpfr_strtofr', `mpfr_set_str' requires the _whole_ string to
|
||
represent a valid floating-point number. This function returns 0
|
||
if the entire string up to the final null character is a valid
|
||
number in base BASE; otherwise it returns -1, and ROP may have
|
||
changed. Note: it is preferable to use `mpfr_set_str' 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
|
||
**ENDPTR, int BASE, mpfr_rnd_t RND)
|
||
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, 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 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 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. A `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
|
||
plus infinity or plus zero iff SIGN is nonnegative; in
|
||
`mpfr_set_nan', the sign bit of the result is unspecified.
|
||
|
||
-- Function: void mpfr_swap (mpfr_t X, mpfr_t Y)
|
||
Swap the values X and Y efficiently. Warning: the precisions are
|
||
exchanged too; in case the precisions are different, `mpfr_swap'
|
||
is thus not equivalent to three `mpfr_set' calls using a third
|
||
auxiliary variable.
|
||
|
||
|
||
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: Basic 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: _Decimal64 mpfr_get_decimal64 (mpfr_t OP, mpfr_rnd_t RND)
|
||
Convert OP to a `float' (respectively `double', `long double' or
|
||
`_Decimal64'), using the rounding mode RND. If OP is NaN, some
|
||
fixed NaN (either quiet or signaling) or the result of 0.0/0.0 is
|
||
returned. 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_decimal64' function is built only under some conditions:
|
||
see the documentation of `mpfr_set_decimal64'.
|
||
|
||
-- Function: long mpfr_get_si (mpfr_t OP, mpfr_rnd_t RND)
|
||
-- Function: unsigned long 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', an `unsigned long', an `intmax_t' or an
|
||
`uintmax_t' (respectively) after rounding it 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. 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: 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 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.
|
||
|
||
-- 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 Inf, which do not exist in
|
||
MPF.
|
||
|
||
-- Function: char * mpfr_get_str (char *STR, mpfr_exp_t *EXPPTR, int
|
||
B, size_t N, mpfr_t OP, mpfr_rnd_t RND)
|
||
Convert OP to a string of digits in base B, with rounding in the
|
||
direction RND, where N is either zero (see below) or the number of
|
||
significant digits output in the string; in the latter case, N
|
||
must be greater or equal to 2. The base may vary from 2 to 62. If
|
||
the input number is an ordinary number, the exponent is written
|
||
through the pointer EXPPTR (for input 0, the current minimal
|
||
exponent is written).
|
||
|
||
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 chosen
|
||
large enough so that re-reading the printed value with the same
|
||
precision, assuming both output and input use rounding to nearest,
|
||
will recover the original value of OP. More precisely, in most
|
||
cases, the chosen precision of STR is the minimal precision m
|
||
depending only on P = PREC(OP) and B that satisfies the above
|
||
property, i.e., m = 1 + ceil(P*log(2)/log(B)), with P replaced by
|
||
P-1 if B is a power of 2, but in some very rare cases, it might be
|
||
m+1 (the smallest case for bases up to 62 is when P equals
|
||
186564318007 for bases 7 and 49).
|
||
|
||
If STR is a null pointer, space for the significand is allocated
|
||
using the current allocation function, and a pointer to the string
|
||
is returned. 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, i.e., at least `max(N + 2, 7)'.
|
||
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.
|
||
|
||
A pointer to the string is returned, unless there is an error, in
|
||
which case a null pointer is returned.
|
||
|
||
-- Function: void mpfr_free_str (char *STR)
|
||
Free a string allocated by `mpfr_get_str' using the current
|
||
unallocation function. The block is assumed to be `strlen(STR)+1'
|
||
bytes. For more information about how it is done: *note Custom
|
||
Allocation: (gmp.info)Custom Allocation.
|
||
|
||
-- 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', `long', `unsigned int', `int',
|
||
`unsigned short', `short', `uintmax_t', `intmax_t', when rounded
|
||
to an integer in the direction RND.
|
||
|
||
|
||
File: mpfr.info, Node: Basic Arithmetic Functions, Next: Comparison Functions, Prev: Conversion Functions, Up: MPFR Interface
|
||
|
||
5.5 Basic 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. For types
|
||
having no signed zero, it 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_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. For types
|
||
having no signed zero, it is considered unsigned (i.e., (+0) - 0 =
|
||
(+0), (-0) - 0 = (-0), 0 - (+0) = (-0) and 0 - (-0) = (+0)). The
|
||
same restrictions than 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 zero, it is considered
|
||
positive). The same restrictions than for `mpfr_add_d' apply to
|
||
`mpfr_mul_d'.
|
||
|
||
-- 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 zero, it is considered positive). The same
|
||
restrictions than 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). 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.
|
||
|
||
-- Function: int mpfr_cbrt (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND)
|
||
-- Function: int mpfr_root (mpfr_t ROP, mpfr_t OP, unsigned long int
|
||
K, mpfr_rnd_t RND)
|
||
Set ROP to the cubic root (resp. the Kth root) of OP rounded in
|
||
the direction RND. For K odd (resp. even) and OP negative
|
||
(including -Inf), set ROP to a negative number (resp. NaN). The
|
||
Kth root of -0 is defined to be -0, whatever the parity of K.
|
||
|
||
-- Function: int mpfr_pow (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_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.
|
||
Special values are handled as described in the ISO C99 and IEEE
|
||
754-2008 standards for the `pow' function:
|
||
* `pow(±0, Y)' returns plus or minus infinity for Y a negative
|
||
odd integer.
|
||
|
||
* `pow(±0, Y)' returns plus infinity for Y negative and not an
|
||
odd integer.
|
||
|
||
* `pow(±0, Y)' returns plus or minus zero for Y a positive odd
|
||
integer.
|
||
|
||
* `pow(±0, Y)' returns plus zero 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 plus infinity for 0 < abs(x) < 1, and
|
||
plus zero for abs(x) > 1.
|
||
|
||
* `pow(X, +Inf)' returns plus zero for 0 < abs(x) < 1, and plus
|
||
infinity for abs(x) > 1.
|
||
|
||
* `pow(-Inf, Y)' returns minus zero for Y a negative odd
|
||
integer.
|
||
|
||
* `pow(-Inf, Y)' returns plus zero for Y negative and not an
|
||
odd integer.
|
||
|
||
* `pow(-Inf, Y)' returns minus infinity for Y a positive odd
|
||
integer.
|
||
|
||
* `pow(-Inf, Y)' returns plus infinity for Y positive and not
|
||
an odd integer.
|
||
|
||
* `pow(+Inf, Y)' returns plus zero for Y negative, and plus
|
||
infinity for Y positive.
|
||
|
||
-- 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.
|
||
|
||
-- 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.
|
||
|
||
|
||
File: mpfr.info, Node: Comparison Functions, Next: Special Functions, Prev: Basic 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)
|
||
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.
|
||
|
||
|
||
File: mpfr.info, Node: Special Functions, Next: Input and Output Functions, Prev: Comparison Functions, Up: MPFR Interface
|
||
|
||
5.7 Special Functions
|
||
=====================
|
||
|
||
All those functions, except explicitly stated (for example
|
||
`mpfr_sin_cos'), return a ternary value as defined in Section "Rounding
|
||
Modes", 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 special functions (either
|
||
with correct or incorrect rounding) is expensive, even for small
|
||
precision, for example the trigonometric and Bessel functions for large
|
||
argument.
|
||
|
||
-- Function: int mpfr_log (mpfr_t ROP, mpfr_t 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 -Inf if OP
|
||
is -0 (i.e., the sign of the zero has no influence on the result).
|
||
|
||
-- 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_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_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_atan2 (mpfr_t ROP, mpfr_t Y, mpfr_t X,
|
||
mpfr_rnd_t RND)
|
||
Set ROP to the arc-tangent2 of Y and X, rounded in the direction
|
||
RND: if `x > 0', `atan2(y, x) = atan (y/x)'; if `x < 0', `atan2(y,
|
||
x) = sign(y)*(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.
|
||
|
||
`atan2(y, 0)' does not raise any floating-point exception.
|
||
Special values are handled as described in the ISO C99 and IEEE
|
||
754-2008 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_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_log1p (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND)
|
||
Set ROP to the logarithm of one plus OP, rounded in the direction
|
||
RND.
|
||
|
||
-- Function: int mpfr_expm1 (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND)
|
||
Set ROP to the exponential of OP followed by a subtraction by one,
|
||
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. For positive OP, the exponential integral is the
|
||
sum of Euler's constant, of the logarithm of OP, and of the sum
|
||
for k from 1 to infinity of OP to the power k, divided by k and
|
||
factorial(k). For negative OP, ROP is set to NaN.
|
||
|
||
-- 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)
|
||
Set ROP to the value of the Gamma function on OP, rounded in the
|
||
direction RND. When OP is a negative integer, ROP is set to NaN.
|
||
|
||
-- 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 -2K-1 <= OP <= -2K, K being a
|
||
non-negative integer, ROP is set 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 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_zeta (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND)
|
||
-- Function: int mpfr_zeta_ui (mpfr_t ROP, unsigned long 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 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 plus or minus 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 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_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.
|
||
|
||
-- 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, set
|
||
ROP to NaN.
|
||
|
||
-- 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 Section F.9.4.3 of the
|
||
ISO C99 and IEEE 754-2008 standards: If X or Y is an infinity,
|
||
then +Inf is returned in ROP, even if the other number is 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'.
|
||
|
||
-- Function: void mpfr_free_cache (void)
|
||
Free various caches used by MPFR internally, in particular the
|
||
caches used by the functions computing constants
|
||
(`mpfr_const_log2', `mpfr_const_pi', `mpfr_const_euler' and
|
||
`mpfr_const_catalan'). You should call this function before
|
||
terminating a thread, even if you did not call these functions
|
||
directly (they could have been called internally).
|
||
|
||
-- Function: int mpfr_sum (mpfr_t ROP, mpfr_ptr const TAB[], unsigned
|
||
long int N, mpfr_rnd_t RND)
|
||
Set ROP to the sum of all elements of TAB, whose size is N,
|
||
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
|
||
the returned `int' value is zero, ROP is guaranteed to be the
|
||
exact sum; otherwise ROP might be smaller than, equal to, or
|
||
larger than the exact sum (in accordance to the rounding mode).
|
||
However, `mpfr_sum' does guarantee the result is correctly rounded.
|
||
|
||
|
||
File: mpfr.info, Node: Input and Output Functions, Next: Formatted Output Functions, Prev: Special 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 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.
|
||
|
||
-- 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 string of digits in base BASE,
|
||
rounded in the direction RND. The base may vary from 2 to 62.
|
||
Print N significant digits exactly, or if N is 0, enough digits so
|
||
that OP can be read back exactly (see `mpfr_get_str').
|
||
|
||
In addition to the significant digits, a decimal point (defined by
|
||
the current locale) at the right of the first digit and a trailing
|
||
exponent in base 10, in the form `eNNN', are printed. If BASE is
|
||
greater than 10, `@' will be used instead of `e' as exponent
|
||
delimiter.
|
||
|
||
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.
|
||
|
||
This function reads a word (defined as a sequence of characters
|
||
between whitespace) 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, or if an error occurred, return 0.
|
||
|
||
|
||
File: mpfr.info, Node: Formatted Output Functions, Next: Integer 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 `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).
|
||
`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' 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 Formatted Output Strings:
|
||
(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'.
|
||
|
||
The `P' type specifies that a following `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
|
||
`unsigned int' or any fixed standard type. The `precision' field
|
||
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 %Pu 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 plus infinity
|
||
`D' round toward minus infinity
|
||
`Y' round away from zero
|
||
`Z' round toward zero
|
||
`N' round to nearest
|
||
`*' 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 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. Special
|
||
values are always displayed as `nan', `-inf', and `inf' for `a', `b',
|
||
`e', `f', and `g' specifiers and `NAN', `-INF', and `INF' for `A', `E',
|
||
`F', and `G' specifiers.
|
||
|
||
If the `precision' field is not empty, the `mpfr_t' number is
|
||
rounded to the given precision in the direction specified by the
|
||
rounding mode. If the precision is zero with rounding to nearest mode
|
||
and one of the following `conv' 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' field is empty (as in `%Re' or `%.RE') with
|
||
`conv' specifier `e' and `E', the number is displayed with enough
|
||
digits so that it can be read back exactly, assuming that the input and
|
||
output variables have the same precision and that the input and output
|
||
rounding modes are both rounding to nearest (as for `mpfr_get_str').
|
||
The default precision for an empty `precision' field with `conv'
|
||
specifiers `f', `F', `g', and `G' is 6.
|
||
|
||
5.9.3 Functions
|
||
---------------
|
||
|
||
For all the following functions, if the number of characters which
|
||
ought to be written appears to exceed the maximum limit 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 (in POSIX system
|
||
only) `errno' is set to `EOVERFLOW'.
|
||
|
||
-- 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
|
||
*TEMPLATE, ...)
|
||
-- Function: int mpfr_vsnprintf (char *BUF, size_t N, 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. If N is zero, nothing is written and BUF may be a
|
||
null pointer, otherwise, the N-1 first characters are written in
|
||
BUF and the N-th is a null character. Return the number of
|
||
characters that would have been written had N be 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 current allocation function. 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.
|
||
|
||
|
||
File: mpfr.info, Node: Integer 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_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,
|
||
`mpfr_ceil' rounds to the next higher or equal representable
|
||
integer, `mpfr_floor' to the next lower or equal representable
|
||
integer, `mpfr_round' to the nearest representable integer,
|
||
rounding halfway cases away from zero (as in the roundTiesToAway
|
||
mode of IEEE 754-2008), and `mpfr_trunc' to the next representable
|
||
integer toward zero.
|
||
|
||
The returned 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 returned 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.
|
||
|
||
Note that `mpfr_round' is different from `mpfr_rint' called with
|
||
the rounding to nearest mode (where halfway cases are rounded to
|
||
an even integer or significand). Note also 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_trunc (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t
|
||
RND)
|
||
Set ROP to OP rounded to an integer. `mpfr_rint_ceil' rounds 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, and `mpfr_rint_trunc' to
|
||
the next integer toward zero. If the result is not representable,
|
||
it is rounded in the direction RND. The returned 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. 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).
|
||
|
||
-- 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_remainder (mpfr_t R, mpfr_t X, mpfr_t Y,
|
||
mpfr_rnd_t RND)
|
||
-- Function: int mpfr_remquo (mpfr_t R, long* 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', 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_remquo' stores the low significant bits from
|
||
the quotient N in *Q (more precisely the number of bits in a
|
||
`long' minus one), with the sign of X divided by Y (except if
|
||
those low bits are all zero, in which case zero is returned).
|
||
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 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 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. 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); /* round a to 2n bits */
|
||
mpfr_mul (t, t, x, MPFR_RNDN); /* t is correct to 2n bits */
|
||
mpfr_ui_sub (t, 1, t, MPFR_RNDN); /* high n bits cancel with 1 */
|
||
mpfr_prec_round (t, n, MPFR_RNDN); /* t is correct to n bits */
|
||
mpfr_mul (t, t, x, MPFR_RNDN); /* t is correct to n bits */
|
||
mpfr_prec_round (x, 2 * n, MPFR_RNDN); /* exact */
|
||
mpfr_add (x, x, t, MPFR_RNDN); /* x is correct to 2n bits */
|
||
|
||
-- 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 E(b)-ERR where
|
||
E(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,
|
||
and 0 otherwise (including for NaN and Inf). This function *does
|
||
not modify* its arguments.
|
||
|
||
If RND1 is `MPFR_RNDN', then the sign of the error is unknown, but
|
||
its absolute value is the same, so that the possible range is
|
||
twice as large as with a directed rounding for RND1.
|
||
|
||
Note: if one wants to also determine the correct ternary value
|
||
when rounding B to precision PREC with rounding mode RND, a useful
|
||
trick is the following: if (mpfr_can_round (b, err, MPFR_RNDN, MPFR_RNDZ, prec + (rnd == MPFR_RNDN)))
|
||
...
|
||
Indeed, if RND 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.
|
||
|
||
-- 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. (Warning:
|
||
the returned value can be less than `MPFR_PREC_MIN'.)
|
||
|
||
The function name is subject to change.
|
||
|
||
-- Function: const char * mpfr_print_rnd_mode (mpfr_rnd_t RND)
|
||
Return a string ("MPFR_RNDD", "MPFR_RNDU", "MPFR_RNDN",
|
||
"MPFR_RNDZ", "MPFR_RNDA") corresponding to the rounding mode RND,
|
||
or a null pointer if RND is an invalid rounding mode.
|
||
|
||
|
||
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. 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 or
|
||
overflow is generated.
|
||
|
||
-- Function: void mpfr_nextabove (mpfr_t X)
|
||
-- Function: void mpfr_nextbelow (mpfr_t X)
|
||
Equivalent to `mpfr_nexttoward' where Y is plus infinity (resp.
|
||
minus infinity).
|
||
|
||
-- 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).
|
||
|
||
-- 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).
|
||
|
||
-- 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).
|
||
|
||
-- 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). 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 if E is in the current exponent range, and
|
||
return 0 (even if X is not a non-zero ordinary number); otherwise,
|
||
return a non-zero value. The significand is assumed to be in
|
||
[1/2,1).
|
||
|
||
-- 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_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.
|
||
|
||
|
||
File: mpfr.info, Node: Exception Related Functions, Next: Compatibility with MPF, 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.
|
||
If the user changes the exponent range, it is her/his
|
||
responsibility to check that all current floating-point variables
|
||
are in the new allowed range (for example using
|
||
`mpfr_check_range'), otherwise the subsequent behavior will be
|
||
undefined, in the sense of the ISO C standard.
|
||
|
||
-- 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 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, it just propagates the
|
||
ternary value T; otherwise, 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.
|
||
|
||
`PREC(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 (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.
|
||
|
||
This is an example of how to emulate binary double IEEE 754
|
||
arithmetic (binary64 in IEEE 754-2008) 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); /* new ternary value */
|
||
|
||
mpfr_clear (xa); mpfr_clear (xb);
|
||
}
|
||
|
||
Warning: this emulates a double IEEE 754 arithmetic with correct
|
||
rounding in the subnormal range, which may not be the case for your
|
||
hardware.
|
||
|
||
-- Function: void mpfr_clear_underflow (void)
|
||
-- Function: void mpfr_clear_overflow (void)
|
||
-- Function: void mpfr_clear_nanflag (void)
|
||
-- Function: void mpfr_clear_inexflag (void)
|
||
-- Function: void mpfr_clear_erangeflag (void)
|
||
Clear the underflow, overflow, invalid, inexact and _erange_ flags.
|
||
|
||
-- Function: void mpfr_set_underflow (void)
|
||
-- Function: void mpfr_set_overflow (void)
|
||
-- Function: void mpfr_set_nanflag (void)
|
||
-- Function: void mpfr_set_inexflag (void)
|
||
-- Function: void mpfr_set_erangeflag (void)
|
||
Set the underflow, overflow, invalid, inexact and _erange_ flags.
|
||
|
||
-- Function: void mpfr_clear_flags (void)
|
||
Clear all global flags (underflow, overflow, invalid, inexact,
|
||
_erange_).
|
||
|
||
-- Function: int mpfr_underflow_p (void)
|
||
-- Function: int mpfr_overflow_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, invalid, inexact,
|
||
_erange_) flag, which is non-zero iff the flag is set.
|
||
|
||
|
||
File: mpfr.info, Node: Compatibility with MPF, Next: Custom Interface, Prev: Exception Related Functions, Up: MPFR Interface
|
||
|
||
5.14 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>
|
||
any program written for MPF can be compiled directly with MPFR without
|
||
any changes (except the `gmp_printf' functions will not work for
|
||
arguments of type `mpfr_t'). All operations are then performed with
|
||
the default MPFR rounding mode, which can be reset with
|
||
`mpfr_set_default_rounding_mode'.
|
||
|
||
Warning: the `mpf_init' and `mpf_init2' functions initialize to
|
||
zero, whereas the corresponding MPFR functions initialize to NaN: this
|
||
is useful to detect uninitialized values, but is slightly incompatible
|
||
with MPF.
|
||
|
||
-- 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.15 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.
|
||
|
||
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
|
||
sign `sign(kind)';
|
||
|
||
* if `ABS(kind) == MPFR_ZERO_KIND', X is set to the zero of
|
||
sign `sign(kind)';
|
||
|
||
* if `ABS(kind) == MPFR_REGULAR_KIND', X is set to a regular
|
||
number: `x = sign(kind)*significand*2^exp'.
|
||
In all cases, it uses SIGNIFICAND directly for further computing
|
||
involving X. It will 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. The return value for NaN, Infinity or zero is unspecified
|
||
but does not produce any trap. 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.16 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: Contributors, 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.
|
||
|
||
* Menu:
|
||
|
||
* Type and Macro Changes::
|
||
* Added Functions::
|
||
* Changed Functions::
|
||
* Removed Functions::
|
||
* 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).
|
||
|
||
|
||
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 that were added after
|
||
MPFR 2.2, and in which MPFR version.
|
||
|
||
* `mpfr_add_d' in MPFR 2.4.
|
||
|
||
* `mpfr_ai' in MPFR 3.0 (incomplete, experimental).
|
||
|
||
* `mpfr_asprintf' in MPFR 2.4.
|
||
|
||
* `mpfr_buildopt_decimal_p' and `mpfr_buildopt_tls_p' in MPFR 3.0.
|
||
|
||
* `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_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_div_d' in MPFR 2.4.
|
||
|
||
* `mpfr_fmod' in MPFR 2.4.
|
||
|
||
* `mpfr_fms' in MPFR 2.3.
|
||
|
||
* `mpfr_fprintf' in MPFR 2.4.
|
||
|
||
* `mpfr_get_flt' in MPFR 3.0.
|
||
|
||
* `mpfr_get_patches' in MPFR 2.3.
|
||
|
||
* `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_j0', `mpfr_j1' and `mpfr_jn' in MPFR 2.3.
|
||
|
||
* `mpfr_lgamma' in MPFR 2.3.
|
||
|
||
* `mpfr_li2' in MPFR 2.4.
|
||
|
||
* `mpfr_modf' in MPFR 2.4.
|
||
|
||
* `mpfr_mul_d' in MPFR 2.4.
|
||
|
||
* `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_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_snprintf' and `mpfr_sprintf' in MPFR 2.4.
|
||
|
||
* `mpfr_sub_d' in MPFR 2.4.
|
||
|
||
* `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.
|
||
|
||
|
||
|
||
File: mpfr.info, Node: Changed Functions, Next: Removed Functions, Prev: Added Functions, Up: API Compatibility
|
||
|
||
6.3 Changed Functions
|
||
=====================
|
||
|
||
The following functions 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.
|
||
|
||
* `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_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_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_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.0.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.
|
||
|
||
|
||
|
||
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.)
|
||
|
||
|
||
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.
|
||
|
||
|
||
|
||
File: mpfr.info, Node: Contributors, Next: References, Prev: API Compatibility, 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'. 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'.
|
||
Mathieu Dutour contributed the functions `mpfr_atan' and `mpfr_asin',
|
||
and a previous version of `mpfr_gamma'; David Daney contributed the
|
||
hyperbolic and inverse hyperbolic functions, the base-2 exponential,
|
||
and the factorial function. Fabrice Rouillier contributed the
|
||
`mpfr_xxx_z' and `mpfr_xxx_q' functions, and helped to the Microsoft
|
||
Windows porting. Jean-Luc Rémy contributed the `mpfr_zeta' code.
|
||
Ludovic Meunier helped in the design of the `mpfr_erf' code. Damien
|
||
Stehlé contributed the `mpfr_get_ld_2exp' function. Sylvain Chevillard
|
||
contributed the `mpfr_ai' function.
|
||
|
||
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 and Caramel
|
||
project-teams at LORIA and of the Arénaire project-team 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.
|
||
|
||
|
||
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 (to appear), also available from the
|
||
authors' web pages.
|
||
|
||
* 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, `http://doi.acm.org/10.1145/1236463.1236468'.
|
||
|
||
* Torbjörn Granlund, "GNU MP: The GNU Multiple Precision Arithmetic
|
||
Library", version 5.0.1, 2010, `http://gmplib.org'.
|
||
|
||
* IEEE standard for binary floating-point arithmetic, Technical
|
||
Report ANSI-IEEE Standard 754-1985, New York, 1985. Approved
|
||
March 21, 1985: IEEE Standards Board; approved July 26, 1985:
|
||
American National Standards Institute, 18 pages.
|
||
|
||
* IEEE Standard for Floating-Point Arithmetic, ANSI-IEEE Standard
|
||
754-2008, 2008. Revision of ANSI-IEEE Standard 754-1985, approved
|
||
June 12, 2008: IEEE Standards Board, 70 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, 2nd edition, 2006.
|
||
|
||
* 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 (C) 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
|
||
`http://www.gnu.org/copyleft/'.
|
||
|
||
Each version of the License is given a distinguishing version
|
||
number. If the Document specifies that a particular numbered
|
||
version of this License "or any later version" applies to it, you
|
||
have the option of following the terms and conditions either of
|
||
that specified version or of any later version that has been
|
||
published (not as a draft) by the Free Software Foundation. If
|
||
the Document does not specify a version number of this License,
|
||
you may choose any version ever published (not as a draft) by the
|
||
Free Software Foundation.
|
||
|
||
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 Index, Prev: GNU Free Documentation License, Up: Top
|
||
|
||
Concept Index
|
||
*************
|
||
|
||
|