This is mpfr.info, produced by makeinfo version 6.1 from mpfr.texi.

This manual documents how to install and use the Multiple Precision
Floating-Point Reliable Library, version 3.1.4.

   Copyright 1991, 1993-2016 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.1.4.

   Copyright 1991, 1993-2016 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 and Type 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 that MPFR was built correctly.  If any test
     fails, information about this failure can be found in the
     ‘tests/test-suite.log’ file.  If you want the contents of this file
     to be automatically output in case of failure, you can set the
     ‘VERBOSE’ environment variable to 1 before running ‘make check’,
     for instance by typing:

     ‘VERBOSE=1 make check’

     In case of failure, you may want to check whether the problem is
     already known.  If not, please report this failure to the MPFR
     mailing-list ‘mpfr@inria.fr’.  For details, *Note Reporting Bugs::.

  5. ‘make install’

     This will copy the files ‘mpfr.h’ and ‘mpf2mpfr.h’ to the directory
     ‘/usr/local/include’, the library files (‘libmpfr.a’ and possibly
     others) to the directory ‘/usr/local/lib’, the file ‘mpfr.info’ to
     the directory ‘/usr/local/share/info’, and some other documentation
     files to the directory ‘/usr/local/share/doc/mpfr’ (or if you
     passed the ‘--prefix’ option to ‘configure’, using the prefix
     directory given as argument to ‘--prefix’ instead of ‘/usr/local’).

2.2 Other ‘make’ Targets
========================

There are some other useful make targets:

   • ‘mpfr.info’ or ‘info’

     Create or update an info version of the manual, in ‘mpfr.info’.

     This file is already provided in the MPFR archives.

   • ‘mpfr.pdf’ or ‘pdf’

     Create a PDF version of the manual, in ‘mpfr.pdf’.

   • ‘mpfr.dvi’ or ‘dvi’

     Create a DVI version of the manual, in ‘mpfr.dvi’.

   • ‘mpfr.ps’ or ‘ps’

     Create a Postscript version of the manual, in ‘mpfr.ps’.

   • ‘mpfr.html’ or ‘html’

     Create a HTML version of the manual, in several pages in the
     directory ‘doc/mpfr.html’; if you want only one output HTML file,
     then type ‘makeinfo --html --no-split mpfr.texi’ from the ‘doc’
     directory instead.

   • ‘clean’

     Delete all object files and archive files, but not the
     configuration files.

   • ‘distclean’

     Delete all generated files not included in the distribution.

   • ‘uninstall’

     Delete all files copied by ‘make install’.

2.3 Build Problems
==================

In case of problem, please read the ‘INSTALL’ file carefully before
reporting a bug, in particular section “In case of problem”.  Some
problems are due to bad configuration on the user side (not specific to
MPFR).  Problems are also mentioned in the FAQ
<http://www.mpfr.org/faq.html>.

   Please report problems to the MPFR mailing-list ‘mpfr@inria.fr’.
*Note Reporting Bugs::.  Some bug fixes are available on the MPFR 3.1.4
web page <http://www.mpfr.org/mpfr-3.1.4/>.

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.1.4 web page <http://www.mpfr.org/mpfr-3.1.4/> 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:
<https://sympa.inria.fr/sympa/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 you get a failure while
running ‘make’ or ‘make check’, please include the ‘config.log’ file in
your bug report, and in case of test failure, the ‘tests/test-suite.log’
file too.

   If your bug report is good, we will do our best to help you to get a
corrected version of the library; if the bug report is poor, we will not
do anything about it (aside of chiding you to send better bug reports).

   Send your bug report to the MPFR mailing-list ‘mpfr@inria.fr’.

   If you think something in this manual is unclear, or downright
incorrect, or if the language needs to be improved, please send a note
to the same address.


File: mpfr.info,  Node: MPFR Basics,  Next: MPFR Interface,  Prev: Reporting Bugs,  Up: Top

4 MPFR Basics
*************

* Menu:

* Headers and Libraries::
* Nomenclature and Types::
* MPFR Variable Conventions::
* Rounding Modes::
* Floating-Point Values on Special Numbers::
* Exceptions::
* Memory Handling::


File: mpfr.info,  Node: Headers and Libraries,  Next: Nomenclature and Types,  Prev: MPFR Basics,  Up: MPFR Basics

4.1 Headers and Libraries
=========================

All declarations needed to use MPFR are collected in the include file
‘mpfr.h’.  It is designed to work with both C and C++ compilers.  You
should include that file in any program using the MPFR library:

     #include <mpfr.h>

   Note however that prototypes for MPFR functions with ‘FILE *’
parameters are provided only if ‘<stdio.h>’ is included too (before
‘mpfr.h’):

     #include <stdio.h>
     #include <mpfr.h>

   Likewise ‘<stdarg.h>’ (or ‘<varargs.h>’) is required for prototypes
with ‘va_list’ parameters, such as ‘mpfr_vprintf’.

   And for any functions using ‘intmax_t’, you must include ‘<stdint.h>’
or ‘<inttypes.h>’ before ‘mpfr.h’, to allow ‘mpfr.h’ to define
prototypes for these functions.  Moreover, 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), ‘<stdio.h>’ and/or
‘<stdarg.h>’ (or ‘<varargs.h>’) should be included *before the first
inclusion* of ‘mpfr.h’ or ‘gmp.h’.  Alternatively, you can define
‘MPFR_USE_FILE’ (for MPFR I/O functions) and/or ‘MPFR_USE_VA_LIST’ (for
MPFR functions with ‘va_list’ parameters) anywhere before the last
inclusion of ‘mpfr.h’.  As a consequence, if your file is a public
header that includes ‘mpfr.h’, you need to use the latter method.

   When calling a MPFR macro, it is not allowed to have previously
defined a macro with the same name as some keywords (currently ‘do’,
‘while’ and ‘sizeof’).

   You can avoid the use of MPFR macros encapsulating functions by
defining the ‘MPFR_USE_NO_MACRO’ macro before ‘mpfr.h’ is included.  In
general this should not be necessary, but this can be useful when
debugging user code: with some macros, the compiler may emit spurious
warnings with some warning options, and macros can prevent some
prototype checking.

   All programs using MPFR must link against both ‘libmpfr’ and ‘libgmp’
libraries.  On a typical Unix-like system this can be done with ‘-lmpfr
-lgmp’ (in that order), for example:

     gcc myprogram.c -lmpfr -lgmp

   MPFR is built using Libtool and an application can use that to link
if desired, *note GNU Libtool: (libtool)Top.

   If MPFR has been installed to a non-standard location, then it may be
necessary to set up environment variables such as ‘C_INCLUDE_PATH’ and
‘LIBRARY_PATH’, or use ‘-I’ and ‘-L’ compiler options, in order to point
to the right directories.  For a shared library, it may also be
necessary to set up some sort of run-time library path (e.g.,
‘LD_LIBRARY_PATH’) on some systems.  Please read the ‘INSTALL’ file for
additional information.


File: mpfr.info,  Node: Nomenclature and Types,  Next: MPFR Variable Conventions,  Prev: Headers and Libraries,  Up: MPFR Basics

4.2 Nomenclature and Types
==========================

A “floating-point number”, or “float” for short, is an 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’.


File: mpfr.info,  Node: MPFR Variable Conventions,  Next: Rounding Modes,  Prev: Nomenclature and Types,  Up: MPFR Basics

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.


File: mpfr.info,  Node: Rounding Modes,  Next: Floating-Point Values on Special Numbers,  Prev: MPFR Variable Conventions,  Up: MPFR Basics

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.

   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.


File: mpfr.info,  Node: Floating-Point Values on Special Numbers,  Next: Exceptions,  Prev: Rounding Modes,  Up: MPFR Basics

4.5 Floating-Point Values on Special Numbers
============================================

This section specifies the floating-point values (of type ‘mpfr_t’)
returned by MPFR functions (where by “returned” we mean here the
modified value of the destination object, which should not be mixed with
the ternary return value of type ‘int’ of those functions).  For
functions returning several values (like ‘mpfr_sin_cos’), the rules
apply to each result separately.

   Functions can have one or several input arguments.  An input point is
a mapping from these input arguments to the set of the MPFR numbers.
When none of its components are NaN, an input point can also be seen as
a tuple in the extended real numbers (the set of the real numbers with
both infinities).

   When the input point is in the domain of the mathematical function,
the result is rounded as described in 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 possible.  If the limit is not defined (e.g.,
‘mpfr_sqrt’ and ‘mpfr_log’ on −0), the behavior is specified in the
description of the MPFR function, but must be consistent with the rule
from the above paragraph (e.g., ‘mpfr_log’ on ±0 gives −Inf).

   When the result is equal to 0, its sign is determined by considering
the limit as if the input point were not in the domain: If one
approaches 0 from above (resp. below), the result is +0 (resp. −0); for
example, ‘mpfr_sin’ on −0 gives −0 and ‘mpfr_acos’ on 1 gives +0 (in all
rounding modes).  In the other cases, the sign is specified in the
description of the MPFR function; for example ‘mpfr_max’ on −0 and +0
gives +0.

   When the input point is not in the closure of the domain of the
function, the result is NaN.  Example: ‘mpfr_sqrt’ on −17 gives NaN.

   When an input argument is NaN, the result is NaN, possibly except
when a partial function is constant on the finite floating-point
numbers; such a case is always explicitly specified in *note MPFR
Interface::.  Example: ‘mpfr_hypot’ on (NaN,0) gives NaN, but
‘mpfr_hypot’ on (NaN,+Inf) gives +Inf (as specified in *note Special
Functions::), since for any finite or infinite input X, ‘mpfr_hypot’ on
(X,+Inf) gives +Inf.


File: mpfr.info,  Node: Exceptions,  Next: Memory Handling,  Prev: Floating-Point Values on Special Numbers,  Up: MPFR Basics

4.6 Exceptions
==============

MPFR supports 6 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.

   • Divide-by-zero: An exact infinite result is obtained from finite
     inputs.

   • 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.


File: mpfr.info,  Node: Memory Handling,  Prev: Exceptions,  Up: MPFR Basics

4.7 Memory Handling
===================

MPFR functions may create caches, e.g., when computing constants such as
Pi, either because the user has called a function like ‘mpfr_const_pi’
directly or because such a function was called internally by the MPFR
library itself to compute some other function.

   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, TLS).  The
initial values of TLS data after a thread is created entirely depend on
the compiler and thread implementation (MPFR simply does a conventional
variable initialization, the variables being declared with an
implementation-defined TLS specifier).


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.

     Note: when MPFR is built with the ‘--enable-thread-safe’ configure
     option, the default precision is local to each thread.  *Note
     Memory Handling::, for more information.

 -- Function: mpfr_prec_t mpfr_get_default_prec (void)
     Return the current default MPFR precision in bits.  See the
     documentation of ‘mpfr_set_default_prec’.

   Here is an example on how to initialize floating-point variables:

     {
       mpfr_t x, y;
       mpfr_init (x);                /* 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.

     Warning!  You must not use this function if X was initialized with
     ‘MPFR_DECL_INIT’ or with ‘mpfr_custom_init_set’ (*note Custom
     Interface::).

 -- Function: mpfr_prec_t mpfr_get_prec (mpfr_t X)
     Return the precision of X, i.e., the number of bits used to store
     its significand.


File: mpfr.info,  Node: Assignment Functions,  Next: Combined Initialization and Assignment Functions,  Prev: Initialization Functions,  Up: MPFR Interface

5.2 Assignment Functions
========================

These functions assign new values to already initialized floats (*note
Initialization Functions::).

 -- Function: int mpfr_set (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND)
 -- Function: int mpfr_set_ui (mpfr_t ROP, unsigned long int OP,
          mpfr_rnd_t RND)
 -- Function: int mpfr_set_si (mpfr_t ROP, long int OP, mpfr_rnd_t RND)
 -- Function: int mpfr_set_uj (mpfr_t ROP, uintmax_t OP, mpfr_rnd_t RND)
 -- Function: int mpfr_set_sj (mpfr_t ROP, intmax_t OP, mpfr_rnd_t RND)
 -- Function: int mpfr_set_flt (mpfr_t ROP, float OP, mpfr_rnd_t RND)
 -- Function: int mpfr_set_d (mpfr_t ROP, double OP, mpfr_rnd_t RND)
 -- Function: int mpfr_set_ld (mpfr_t ROP, long double OP, mpfr_rnd_t
          RND)
 -- Function: int mpfr_set_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); to use ‘mpfr_set_decimal64’, one should
     define the macro ‘MPFR_WANT_DECIMAL_FLOATS’ before including
     ‘mpfr.h’.  ‘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
     (or decimal, for ‘mpfr_set_decimal64’) 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.

     The meaning of the return value differs from other MPFR functions:
     it is 0 if the entire string up to the final null character is a
     valid number in base BASE; otherwise it is −1, and ROP may have
     changed (users interested in the *note ternary value:: should use
     ‘mpfr_strtofr’ instead).

     Note: it is preferable to use ‘mpfr_strtofr’ if one wants to
     distinguish between an infinite ROP value coming from an infinite S
     or from an overflow.

 -- Function: int mpfr_strtofr (mpfr_t ROP, const char *NPTR, char
          **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 structures pointed to by X and Y.  In particular, the
     values are exchanged without rounding (this may be different from
     three ‘mpfr_set’ calls using a third auxiliary variable).

     Warning!  Since the precisions are exchanged, this will affect
     future assignments.  Moreover, since the significand pointers are
     also exchanged, you must not use this function if the allocation
     method used for X and/or Y does not permit it.  This is the case
     when X and/or Y were declared and initialized with
     ‘MPFR_DECL_INIT’, and possibly with ‘mpfr_custom_init_set’ (*note
     Custom Interface::).


File: mpfr.info,  Node: Combined Initialization and Assignment Functions,  Next: Conversion Functions,  Prev: Assignment Functions,  Up: MPFR Interface

5.3 Combined Initialization and Assignment Functions
====================================================

 -- Macro: int mpfr_init_set (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND)
 -- Macro: int mpfr_init_set_ui (mpfr_t ROP, unsigned long int OP,
          mpfr_rnd_t RND)
 -- Macro: int mpfr_init_set_si (mpfr_t ROP, long int OP, mpfr_rnd_t
          RND)
 -- Macro: int mpfr_init_set_d (mpfr_t ROP, double OP, mpfr_rnd_t RND)
 -- Macro: int mpfr_init_set_ld (mpfr_t ROP, long double OP, mpfr_rnd_t
          RND)
 -- Macro: int mpfr_init_set_z (mpfr_t ROP, mpz_t OP, mpfr_rnd_t RND)
 -- Macro: int mpfr_init_set_q (mpfr_t ROP, mpq_t OP, mpfr_rnd_t RND)
 -- Macro: int mpfr_init_set_f (mpfr_t ROP, mpf_t OP, mpfr_rnd_t RND)
     Initialize ROP and set its value from OP, rounded in the direction
     RND.  The precision of ROP will be taken from the active default
     precision, as set by ‘mpfr_set_default_prec’.

 -- Function: int mpfr_init_set_str (mpfr_t X, const char *S, int BASE,
          mpfr_rnd_t RND)
     Initialize X and set its value from the string S in base BASE,
     rounded in the direction RND.  See ‘mpfr_set_str’.


File: mpfr.info,  Node: Conversion Functions,  Next: 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: int mpfr_frexp (mpfr_exp_t *EXP, mpfr_t Y, mpfr_t X,
          mpfr_rnd_t RND)
     Set EXP (formally, the value pointed to by EXP) and Y such that
     0.5<=abs(Y)<1 and Y times 2 raised to EXP equals X rounded to the
     precision of Y, using the given rounding mode.  If X is zero, then
     Y is set to a zero of the same sign and EXP is set to 0.  If X is
     NaN or an infinity, then Y is set to the same value and EXP is
     undefined.

 -- Function: mpfr_exp_t mpfr_get_z_2exp (mpz_t ROP, mpfr_t OP)
     Put the scaled significand of OP (regarded as an integer, with the
     precision of OP) into ROP, and return the exponent EXP (which may
     be outside the current exponent range) such that OP exactly equals
     ROP times 2 raised to the power EXP.  If OP is zero, the minimal
     exponent ‘emin’ is returned.  If OP is NaN or an infinity, the
     _erange_ flag is set, ROP is set to 0, and the 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 an infinity, which do not
     exist in MPF.  If OP is NaN, then ROP is undefined.  If OP is +Inf
     (resp. −Inf), then ROP is set to the maximum (resp. minimum) value
     in the precision of the MPF number; if a future MPF version
     supports infinities, this behavior will be considered incorrect and
     will change (portable programs should assume that ROP is set either
     to this finite number or to an infinite number).  Note that since
     MPFR currently has the same exponent type as MPF (but not with the
     same radix), the range of values is much larger in MPF than in
     MPFR, so that an overflow or underflow is not possible.

 -- Function: 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;
     otherwise the function does nothing and immediately returns a null
     pointer.  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 type ‘mpfr_exp_t’ is large enough
     to hold the exponent in all cases.

     The generated string is a fraction, with an implicit radix point
     immediately to the left of the first digit.  For example, the
     number −3.1416 would be returned as "−31416" in the string and 1
     written at EXPPTR.  If RND is to nearest, and OP is exactly in the
     middle of two consecutive possible outputs, the one with an even
     significand is chosen, where both significands are considered with
     the exponent of OP.  Note that for an odd base, this may not
     correspond to an even last digit: for example with 2 digits in base
     7, (14) and a half is rounded to (15) which is 12 in decimal, (16)
     and a half is rounded to (20) which is 14 in decimal, and (26) and
     a half is rounded to (26) which is 20 in decimal.

     If N is zero, the number of digits of the significand is 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 (unless the base is invalid).  To free the returned
     string, you must use ‘mpfr_free_str’.

     If STR is not a null pointer, it should point to a block of storage
     large enough for the significand, 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.  The pointer to the string STR
     is returned (unless the base is invalid).

     Note: The NaN and inexact flags are currently not set when need be;
     this will be fixed in future versions.  Programmers should
     currently assume that whether the flags are set by this function is
     unspecified.

 -- 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
     (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.  The IEEE-754
     rules are used, in particular for signed zeros.  But for types
     having no signed zeros, 0 is considered unsigned (i.e., (+0) + 0 =
     (+0) and (−0) + 0 = (−0)).  The ‘mpfr_add_d’ function assumes that
     the radix of the ‘double’ type is a power of 2, with a precision at
     most that declared by the C implementation (macro
     ‘IEEE_DBL_MANT_DIG’, and if not defined 53 bits).

 -- Function: int mpfr_sub (mpfr_t ROP, mpfr_t OP1, mpfr_t OP2,
          mpfr_rnd_t RND)
 -- Function: int mpfr_ui_sub (mpfr_t ROP, unsigned long int OP1, mpfr_t
          OP2, mpfr_rnd_t RND)
 -- Function: int mpfr_sub_ui (mpfr_t ROP, mpfr_t OP1, unsigned long int
          OP2, mpfr_rnd_t RND)
 -- Function: int mpfr_si_sub (mpfr_t ROP, long int OP1, mpfr_t OP2,
          mpfr_rnd_t RND)
 -- Function: int mpfr_sub_si (mpfr_t ROP, mpfr_t OP1, long int OP2,
          mpfr_rnd_t RND)
 -- Function: int mpfr_d_sub (mpfr_t ROP, double OP1, mpfr_t OP2,
          mpfr_rnd_t RND)
 -- Function: int mpfr_sub_d (mpfr_t ROP, mpfr_t OP1, double OP2,
          mpfr_rnd_t RND)
 -- Function: int mpfr_z_sub (mpfr_t ROP, mpz_t OP1, mpfr_t OP2,
          mpfr_rnd_t RND)
 -- Function: int mpfr_sub_z (mpfr_t ROP, mpfr_t OP1, mpz_t OP2,
          mpfr_rnd_t RND)
 -- Function: int mpfr_sub_q (mpfr_t ROP, mpfr_t OP1, mpq_t OP2,
          mpfr_rnd_t RND)
     Set ROP to OP1 - OP2 rounded in the direction RND.  The IEEE-754
     rules are used, in particular for signed zeros.  But for types
     having no signed zeros, 0 is considered unsigned (i.e., (+0) − 0 =
     (+0), (−0) − 0 = (−0), 0 − (+0) = (−0) and 0 − (−0) = (+0)).  The
     same restrictions 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 zeros, 0 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 zeros, 0 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.  Warning!  Therefore the result on −0 is
     different from the one of the rSqrt function recommended by the
     IEEE 754-2008 standard (Section 9.2.1), which is −Inf instead of
     +Inf.

 -- 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 *note ternary value::, i.e., zero for an exact
return value, a positive value for a return value larger than the exact
result, and a negative value otherwise.

   Important note: in some domains, computing 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 +0 if OP is
     1 (in all rounding modes), for consistency with the ISO C99 and
     IEEE 754-2008 standards.  Set ROP to −Inf if OP is ±0 (i.e., the
     sign of the zero has no influence on the result).

 -- Function: int mpfr_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 (this definition for negative
     argument follows formula 5.1.2 from the Handbook of Mathematical
     Functions from Abramowitz and Stegun, a future version might use
     another definition).

 -- 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 OP is 1 or 2, set ROP to +0 (in
     all rounding modes).  When OP is an infinity or a nonpositive
     integer, set ROP to +Inf, following the general rules on special
     values.  When −2K−1 < OP < −2K, K being a nonnegative integer, set
     ROP to NaN.  See also ‘mpfr_lgamma’.

 -- Function: int mpfr_lgamma (mpfr_t ROP, int *SIGNP, mpfr_t OP,
          mpfr_rnd_t RND)
     Set ROP to the value of the logarithm of the absolute value of the
     Gamma function on OP, rounded in the direction RND.  The sign (1 or
     −1) of Gamma(OP) is returned in the object pointed to by SIGNP.
     When OP is 1 or 2, set ROP to +0 (in all rounding modes).  When OP
     is an infinity or a nonpositive 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.  Concerning special values (signed
     zeros, infinities, NaN), these functions behave like a
     multiplication followed by a separate addition or subtraction.
     That is, the fused operation matters only for rounding.

 -- Function: int mpfr_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 the ISO C99 (Section
     F.9.4.3) and IEEE 754-2008 (Section 9.2.1) standards: If X or Y is
     an infinity, then +Inf is returned in ROP, even if the other number
     is NaN.

 -- Function: int mpfr_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 (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 ‘d’, ‘i’, ‘o’, ‘u’, ‘x’, or
‘X’ conversion specifier applies to a ‘mpfr_prec_t’ argument.  It is
needed because the ‘mpfr_prec_t’ type does not necessarily correspond to
an ‘int’ or any fixed standard type.  The ‘precision’ 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 (with ties to even)
     ‘*’       rounding mode indicated by the
               ‘mpfr_rnd_t’ argument just before the
               corresponding ‘mpfr_t’ variable.

   The default rounding mode is rounding to nearest.  The following
three examples are equivalent:
     mpfr_t x;
     mpfr_init (x);
     ...
     mpfr_printf ("%.128Rf", x);
     mpfr_printf ("%.128RNf", x);
     mpfr_printf ("%.128R*f", MPFR_RNDN, x);

   Note that the rounding away from zero mode is specified with ‘Y’
because ISO C reserves the ‘A’ specifier for hexadecimal output (see
below).

   The output ‘conv’ specifiers allowed with ‘mpfr_t’ parameter are:

     ‘a’ ‘A’   hex float, C99 style
     ‘b’       binary output
     ‘e’ ‘E’   scientific format float
     ‘f’ ‘F’   fixed point float
     ‘g’ ‘G’   fixed 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.

     When OP is NaN, the NaN flag is set as usual.  In the other cases,
     the inexact flag is set when ROP differs from OP, following the ISO
     C99 rule for the ‘rint’ function.  If you want the behavior to be
     more like IEEE 754 / ISO TS 18661-1, i.e., the usual behavior where
     the round-to-integer function is regarded as any other mathematical
     function, you should use one the ‘mpfr_rint_*’ functions instead
     (however it is not possible to round to nearest with the even
     rounding rule yet).

     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.  Thus
     these round-to-integer functions behave more like the other
     mathematical functions, i.e., the returned result is the correct
     rounding of the exact result of the function in the real numbers.

     For example, ‘mpfr_rint_round’ with rounding to nearest and a
     precision of two bits rounds 6.5 to 7 (halfway cases away from
     zero), then 7 is rounded to 8 by the round-even rule, despite the
     fact that 6 is also representable on two bits, and is closer to 6.5
     than 8.

 -- Function: int mpfr_frac (mpfr_t ROP, mpfr_t OP, mpfr_rnd_t RND)
     Set ROP to the fractional part of OP, having the same sign as OP,
     rounded in the direction RND (unlike in ‘mpfr_rint’, RND affects
     only how the exact fractional part is rounded, not how the
     fractional part is generated).

 -- 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 */

     Warning!  You must not use this function if X was initialized with
     ‘MPFR_DECL_INIT’ or with ‘mpfr_custom_init_set’ (*note Custom
     Interface::).

 -- Function: int mpfr_can_round (mpfr_t B, mpfr_exp_t ERR, mpfr_rnd_t
          RND1, mpfr_rnd_t RND2, mpfr_prec_t PREC)
     Assuming B is an approximation of an unknown number X in the
     direction RND1 with error at most two to the power 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 *note 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).

     Note: for a given version of MPFR, the returned value of ROP and
     the new value of STATE (which controls further random values) do
     not depend on the machine word size.

 -- Function: int mpfr_urandom (mpfr_t ROP, gmp_randstate_t STATE,
          mpfr_rnd_t RND)
     Generate a uniformly distributed random float.  The floating-point
     number ROP can be seen as if a random real number is generated
     according to the continuous uniform distribution on the interval
     [0, 1] and then rounded in the direction RND.

     The second argument is a ‘gmp_randstate_t’ structure which should
     be created using the GMP ‘gmp_randinit’ function (see the GMP
     manual).

     Note: the note for ‘mpfr_urandomb’ holds too.  In addition, the
     exponent range and the rounding mode might have a side effect on
     the next random state.

 -- Function: int mpfr_grandom (mpfr_t ROP1, mpfr_t ROP2,
          gmp_randstate_t STATE, mpfr_rnd_t RND)
     Generate two random floats according to a standard normal gaussian
     distribution.  If ROP2 is a null pointer, then only one value is
     generated and stored in ROP1.

     The floating-point number ROP1 (and ROP2) can be seen as if a
     random real number were generated according to the standard normal
     gaussian distribution and then rounded in the direction RND.

     The third argument is a ‘gmp_randstate_t’ structure, which should
     be created using the GMP ‘gmp_randinit’ function (see the GMP
     manual).

     The combination of the ternary values is returned like with
     ‘mpfr_sin_cos’.  If ROP2 is a null pointer, the second ternary
     value is assumed to be 0 (note that the encoding of the only
     ternary value is not the same as the usual encoding for functions
     that return only one result).  Otherwise the ternary value of a
     random number is always non-zero.

     Note: the note for ‘mpfr_urandomb’ holds too.  In addition, the
     exponent range and the rounding mode might have a side effect on
     the next random state.

 -- 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.

 -- Function: int mpfr_buildopt_gmpinternals_p (void)
     Return a non-zero value if MPFR was compiled with GMP internals
     (that is, MPFR was built with either ‘--with-gmp-build’ or
     ‘--enable-gmp-internals’ configure option), return zero otherwise.

 -- Function: const char * mpfr_buildopt_tune_case (void)
     Return a string saying which thresholds file has been used at
     compile time.  This file is normally selected from the processor
     type.


File: mpfr.info,  Node: Exception Related Functions,  Next: 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 *note ternary value::.  For
     example, one performed ‘t = mpfr_log (x, u, rnd)’, and Y is the
     exact logarithm of U.  Thus T is negative if X is smaller than Y,
     positive if X is larger than Y, and zero if X equals Y.  This
     function modifies X if needed to be in the current range of
     acceptable values: It generates an underflow or an overflow if the
     exponent of X is outside the current allowed range; the value of T
     may be used to avoid a double rounding.  This function returns zero
     if the new value of X equals the exact one Y, a positive value if
     that new value is larger than Y, and a negative value if it is
     smaller than Y.  Note that unlike most functions, the new result X
     is compared to the (unknown) exact one Y, not the input value X,
     i.e., the ternary value is propagated.

     Note: If X is an infinity and T is different from zero (i.e., if
     the rounded result is an inexact infinity), then the overflow flag
     is set.  This is useful because ‘mpfr_check_range’ is typically
     called (at least in MPFR functions) after restoring the flags that
     could have been set due to internal computations.

 -- Function: int mpfr_subnormalize (mpfr_t X, int T, mpfr_rnd_t RND)
     This function rounds X emulating subnormal number arithmetic: if X
     is outside the subnormal exponent range, it just propagates the
     *note 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_divby0 (void)
 -- Function: void mpfr_clear_nanflag (void)
 -- Function: void mpfr_clear_inexflag (void)
 -- Function: void mpfr_clear_erangeflag (void)
     Clear the underflow, overflow, divide-by-zero, invalid, inexact and
     _erange_ flags.

 -- Function: void mpfr_set_underflow (void)
 -- Function: void mpfr_set_overflow (void)
 -- Function: void mpfr_set_divby0 (void)
 -- Function: void mpfr_set_nanflag (void)
 -- Function: void mpfr_set_inexflag (void)
 -- Function: void mpfr_set_erangeflag (void)
     Set the underflow, overflow, divide-by-zero, invalid, inexact and
     _erange_ flags.

 -- Function: void mpfr_clear_flags (void)
     Clear all global flags (underflow, overflow, divide-by-zero,
     invalid, inexact, _erange_).

 -- Function: int mpfr_underflow_p (void)
 -- Function: int mpfr_overflow_p (void)
 -- Function: int mpfr_divby0_p (void)
 -- Function: int mpfr_nanflag_p (void)
 -- Function: int mpfr_inexflag_p (void)
 -- Function: int mpfr_erangeflag_p (void)
     Return the corresponding (underflow, overflow, divide-by-zero,
     invalid, inexact, _erange_) flag, which is non-zero iff the flag is
     set.


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_buildopt_gmpinternals_p’ and ‘mpfr_buildopt_tune_case’ in
     MPFR 3.1.

   • ‘mpfr_clear_divby0’ in MPFR 3.1 (new divide-by-zero exception).

   • ‘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_divby0_p’ in MPFR 3.1 (new divide-by-zero exception).

   • ‘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_frexp’ in MPFR 3.1.

   • ‘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_grandom’ in MPFR 3.1.

   • ‘mpfr_j0’, ‘mpfr_j1’ and ‘mpfr_jn’ in MPFR 2.3.

   • ‘mpfr_lgamma’ in MPFR 2.3.

   • ‘mpfr_li2’ in MPFR 2.4.

   • ‘mpfr_min_prec’ in MPFR 3.0.

   • ‘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_divby0’ in MPFR 3.1 (new divide-by-zero exception).

   • ‘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.

   • ‘mpfr_z_sub’ in MPFR 3.1.


File: mpfr.info,  Node: Changed Functions,  Next: Removed Functions,  Prev: Added Functions,  Up: API Compatibility

6.3 Changed Functions
=====================

The following functions 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.1.  This was actually
     regarded as a bug fix.  The ‘mpfr_subnormalize’ implementation up
     to MPFR 3.0.0 did not change the flags.  In particular, it did not
     follow the generic rule concerning the inexact flag (and no special
     behavior was specified).  The case of the underflow flag was more a
     lack of specification.

   • ‘mpfr_urandom’ and ‘mpfr_urandomb’ changed in MPFR 3.1.  Their
     behavior no longer depends on the platform (assuming this is also
     true for GMP’s random generator, which is not the case between GMP
     4.1 and 4.2 if ‘gmp_randinit_default’ is used).  As a consequence,
     the returned values can be different between MPFR 3.1 and previous
     MPFR versions.  Note: as the reproducibility of these functions was
     not specified before MPFR 3.1, the MPFR 3.1 behavior is _not_
     regarded as backward incompatible with previous versions.


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.

   The divide-by-zero exception is new in MPFR 3.1.  However it should
not introduce incompatible changes for programs that strictly follow the
MPFR API since the exception can only be seen via new functions.

   As of MPFR 3.1, the ‘mpfr.h’ header can be included several times,
while still supporting optional functions (*note Headers and
Libraries::).


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’.  Sylvain Chevillard contributed the ‘mpfr_ai’
function.  David Daney contributed the hyperbolic and inverse hyperbolic
functions, the base-2 exponential, and the factorial function.  Alain
Delplanque contributed the new version of the ‘mpfr_get_str’ function.
Mathieu Dutour contributed the functions ‘mpfr_acos’, ‘mpfr_asin’ and
‘mpfr_atan’, and a previous version of ‘mpfr_gamma’.  Laurent Fousse
contributed the ‘mpfr_sum’ function.  Emmanuel Jeandel, from ENS-Lyon
too, contributed the generic hypergeometric code, as well as the
internal function ‘mpfr_exp3’, a first implementation of the sine and
cosine, and improved versions of ‘mpfr_const_log2’ and ‘mpfr_const_pi’.
Ludovic Meunier helped in the design of the ‘mpfr_erf’ code.  Jean-Luc
Rémy contributed the ‘mpfr_zeta’ code.  Fabrice Rouillier contributed
the ‘mpfr_xxx_z’ and ‘mpfr_xxx_q’ functions, and helped to the Microsoft
Windows porting.  Damien Stehlé contributed the ‘mpfr_get_ld_2exp’
function.

   We would like to thank Jean-Michel Muller and Joris van der Hoeven
for very fruitful discussions at the beginning of that project, Torbjörn
Granlund and Kevin Ryde for their help about design issues, and Nathalie
Revol for her careful reading of a previous version of this
documentation.  In particular Kevin Ryde did a tremendous job for the
portability of MPFR in 2002-2004.

   The development of the MPFR library would not have been possible
without the continuous support of INRIA, and of the LORIA (Nancy,
France) and LIP (Lyon, France) laboratories.  In particular the main
authors were or are members of the PolKA, Spaces, Cacao, Caramel and
Caramba project-teams at LORIA and of the Arénaire and AriC
project-teams at LIP.  This project was started during the Fiable
(reliable in French) action supported by INRIA, and continued during the
AOC action.  The development of MPFR was also supported by a grant
(202F0659 00 MPN 121) from the Conseil Régional de Lorraine in 2002,
from INRIA by an "associate engineer" grant (2003-2005), an "opération
de développement logiciel" grant (2007-2009), and the post-doctoral
grant of Sylvain Chevillard in 2009-2010.  The MPFR-MPC workshop in June
2012 was partly supported by the ERC grant ANTICS of Andreas Enge.


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 © 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 and Type Index,  Prev: GNU Free Documentation License,  Up: Top

Concept Index
*************

 [index ]
* Menu:

* Accuracy:                              MPFR Interface.       (line 25)
* Arithmetic functions:                  Basic Arithmetic Functions.
                                                               (line  3)
* Assignment functions:                  Assignment Functions. (line  3)
* Basic arithmetic functions:            Basic Arithmetic Functions.
                                                               (line  3)
* Combined initialization and assignment functions: Combined Initialization and Assignment Functions.
                                                               (line  3)
* Comparison functions:                  Comparison Functions. (line  3)
* Compatibility with MPF:                Compatibility with MPF.
                                                               (line  3)
* Conditions for copying MPFR:           Copying.              (line  6)
* Conversion functions:                  Conversion Functions. (line  3)
* Copying conditions:                    Copying.              (line  6)
* Custom interface:                      Custom Interface.     (line  3)
* Exception related functions:           Exception Related Functions.
                                                               (line  3)
* Float arithmetic functions:            Basic Arithmetic Functions.
                                                               (line  3)
* Float comparisons functions:           Comparison Functions. (line  3)
* Float functions:                       MPFR Interface.       (line  6)
* Float input and output functions:      Input and Output Functions.
                                                               (line  3)
* Float output functions:                Formatted Output Functions.
                                                               (line  3)
* Floating-point functions:              MPFR Interface.       (line  6)
* Floating-point number:                 Nomenclature and Types.
                                                               (line  6)
* GNU Free Documentation License:        GNU Free Documentation License.
                                                               (line  6)
* GNU Free Documentation License <1>:    GNU Free Documentation License.
                                                               (line  6)
* I/O functions:                         Input and Output Functions.
                                                               (line  3)
* I/O functions <1>:                     Formatted Output Functions.
                                                               (line  3)
* Initialization functions:              Initialization Functions.
                                                               (line  3)
* Input functions:                       Input and Output Functions.
                                                               (line  3)
* Installation:                          Installing MPFR.      (line  6)
* Integer related functions:             Integer Related Functions.
                                                               (line  3)
* Internals:                             Internals.            (line  3)
* intmax_t:                              Headers and Libraries.
                                                               (line 22)
* inttypes.h:                            Headers and Libraries.
                                                               (line 22)
* libmpfr:                               Headers and Libraries.
                                                               (line 50)
* Libraries:                             Headers and Libraries.
                                                               (line 50)
* Libtool:                               Headers and Libraries.
                                                               (line 56)
* Limb:                                  Internals.            (line  6)
* Linking:                               Headers and Libraries.
                                                               (line 50)
* Miscellaneous float functions:         Miscellaneous Functions.
                                                               (line  3)
* mpfr.h:                                Headers and Libraries.
                                                               (line  6)
* Output functions:                      Input and Output Functions.
                                                               (line  3)
* Output functions <1>:                  Formatted Output Functions.
                                                               (line  3)
* Precision:                             Nomenclature and Types.
                                                               (line 20)
* Precision <1>:                         MPFR Interface.       (line 17)
* Reporting bugs:                        Reporting Bugs.       (line  6)
* Rounding mode related functions:       Rounding Related Functions.
                                                               (line  3)
* Rounding Modes:                        Nomenclature and Types.
                                                               (line 34)
* Special functions:                     Special Functions.    (line  3)
* stdarg.h:                              Headers and Libraries.
                                                               (line 19)
* stdint.h:                              Headers and Libraries.
                                                               (line 22)
* stdio.h:                               Headers and Libraries.
                                                               (line 12)
* Ternary value:                         Rounding Modes.       (line 24)
* uintmax_t:                             Headers and Libraries.
                                                               (line 22)


File: mpfr.info,  Node: Function and Type Index,  Prev: Concept Index,  Up: Top

Function and Type Index
***********************

 [index ]
* Menu:

* mpfr_abs:                              Basic Arithmetic Functions.
                                                              (line 165)
* mpfr_acos:                             Special Functions.   (line  53)
* mpfr_acosh:                            Special Functions.   (line 117)
* mpfr_add:                              Basic Arithmetic Functions.
                                                              (line   6)
* mpfr_add_d:                            Basic Arithmetic Functions.
                                                              (line  12)
* mpfr_add_q:                            Basic Arithmetic Functions.
                                                              (line  16)
* mpfr_add_si:                           Basic Arithmetic Functions.
                                                              (line  10)
* mpfr_add_ui:                           Basic Arithmetic Functions.
                                                              (line   8)
* mpfr_add_z:                            Basic Arithmetic Functions.
                                                              (line  14)
* mpfr_agm:                              Special Functions.   (line 219)
* mpfr_ai:                               Special Functions.   (line 236)
* mpfr_asin:                             Special Functions.   (line  54)
* mpfr_asinh:                            Special Functions.   (line 118)
* mpfr_asprintf:                         Formatted Output Functions.
                                                              (line 193)
* mpfr_atan:                             Special Functions.   (line  55)
* mpfr_atan2:                            Special Functions.   (line  65)
* mpfr_atanh:                            Special Functions.   (line 119)
* mpfr_buildopt_decimal_p:               Miscellaneous Functions.
                                                              (line 162)
* mpfr_buildopt_gmpinternals_p:          Miscellaneous Functions.
                                                              (line 167)
* mpfr_buildopt_tls_p:                   Miscellaneous Functions.
                                                              (line 156)
* mpfr_buildopt_tune_case:               Miscellaneous Functions.
                                                              (line 172)
* mpfr_can_round:                        Rounding Related Functions.
                                                              (line  39)
* mpfr_cbrt:                             Basic Arithmetic Functions.
                                                              (line 113)
* mpfr_ceil:                             Integer Related Functions.
                                                              (line   7)
* mpfr_check_range:                      Exception Related Functions.
                                                              (line  37)
* mpfr_clear:                            Initialization Functions.
                                                              (line  30)
* mpfr_clears:                           Initialization Functions.
                                                              (line  35)
* mpfr_clear_divby0:                     Exception Related Functions.
                                                              (line 112)
* mpfr_clear_erangeflag:                 Exception Related Functions.
                                                              (line 115)
* mpfr_clear_flags:                      Exception Related Functions.
                                                              (line 128)
* mpfr_clear_inexflag:                   Exception Related Functions.
                                                              (line 114)
* mpfr_clear_nanflag:                    Exception Related Functions.
                                                              (line 113)
* mpfr_clear_overflow:                   Exception Related Functions.
                                                              (line 111)
* mpfr_clear_underflow:                  Exception Related Functions.
                                                              (line 110)
* mpfr_cmp:                              Comparison Functions.
                                                              (line   6)
* mpfr_cmpabs:                           Comparison Functions.
                                                              (line  34)
* mpfr_cmp_d:                            Comparison Functions.
                                                              (line   9)
* mpfr_cmp_f:                            Comparison Functions.
                                                              (line  13)
* mpfr_cmp_ld:                           Comparison Functions.
                                                              (line  10)
* mpfr_cmp_q:                            Comparison Functions.
                                                              (line  12)
* mpfr_cmp_si:                           Comparison Functions.
                                                              (line   8)
* mpfr_cmp_si_2exp:                      Comparison Functions.
                                                              (line  29)
* mpfr_cmp_ui:                           Comparison Functions.
                                                              (line   7)
* mpfr_cmp_ui_2exp:                      Comparison Functions.
                                                              (line  27)
* mpfr_cmp_z:                            Comparison Functions.
                                                              (line  11)
* mpfr_const_catalan:                    Special Functions.   (line 247)
* mpfr_const_euler:                      Special Functions.   (line 246)
* mpfr_const_log2:                       Special Functions.   (line 244)
* mpfr_const_pi:                         Special Functions.   (line 245)
* mpfr_copysign:                         Miscellaneous Functions.
                                                              (line 109)
* mpfr_cos:                              Special Functions.   (line  31)
* mpfr_cosh:                             Special Functions.   (line  97)
* mpfr_cot:                              Special Functions.   (line  49)
* mpfr_coth:                             Special Functions.   (line 113)
* mpfr_csc:                              Special Functions.   (line  48)
* mpfr_csch:                             Special Functions.   (line 112)
* mpfr_custom_get_exp:                   Custom Interface.    (line  75)
* mpfr_custom_get_kind:                  Custom Interface.    (line  65)
* mpfr_custom_get_significand:           Custom Interface.    (line  70)
* mpfr_custom_get_size:                  Custom Interface.    (line  37)
* mpfr_custom_init:                      Custom Interface.    (line  41)
* mpfr_custom_init_set:                  Custom Interface.    (line  48)
* mpfr_custom_move:                      Custom Interface.    (line  82)
* MPFR_DECL_INIT:                        Initialization Functions.
                                                              (line  74)
* mpfr_digamma:                          Special Functions.   (line 172)
* mpfr_dim:                              Basic Arithmetic Functions.
                                                              (line 171)
* mpfr_div:                              Basic Arithmetic Functions.
                                                              (line  74)
* mpfr_divby0_p:                         Exception Related Functions.
                                                              (line 134)
* mpfr_div_2exp:                         Compatibility with MPF.
                                                              (line  49)
* mpfr_div_2si:                          Basic Arithmetic Functions.
                                                              (line 186)
* mpfr_div_2ui:                          Basic Arithmetic Functions.
                                                              (line 184)
* mpfr_div_d:                            Basic Arithmetic Functions.
                                                              (line  86)
* mpfr_div_q:                            Basic Arithmetic Functions.
                                                              (line  90)
* mpfr_div_si:                           Basic Arithmetic Functions.
                                                              (line  82)
* mpfr_div_ui:                           Basic Arithmetic Functions.
                                                              (line  78)
* mpfr_div_z:                            Basic Arithmetic Functions.
                                                              (line  88)
* mpfr_d_div:                            Basic Arithmetic Functions.
                                                              (line  84)
* mpfr_d_sub:                            Basic Arithmetic Functions.
                                                              (line  36)
* mpfr_eint:                             Special Functions.   (line 135)
* mpfr_eq:                               Compatibility with MPF.
                                                              (line  28)
* mpfr_equal_p:                          Comparison Functions.
                                                              (line  59)
* mpfr_erangeflag_p:                     Exception Related Functions.
                                                              (line 137)
* mpfr_erf:                              Special Functions.   (line 183)
* mpfr_erfc:                             Special Functions.   (line 184)
* mpfr_exp:                              Special Functions.   (line  25)
* mpfr_exp10:                            Special Functions.   (line  27)
* mpfr_exp2:                             Special Functions.   (line  26)
* mpfr_expm1:                            Special Functions.   (line 131)
* mpfr_fac_ui:                           Special Functions.   (line 123)
* mpfr_fits_intmax_p:                    Conversion Functions.
                                                              (line 150)
* mpfr_fits_sint_p:                      Conversion Functions.
                                                              (line 146)
* mpfr_fits_slong_p:                     Conversion Functions.
                                                              (line 144)
* mpfr_fits_sshort_p:                    Conversion Functions.
                                                              (line 148)
* mpfr_fits_uintmax_p:                   Conversion Functions.
                                                              (line 149)
* mpfr_fits_uint_p:                      Conversion Functions.
                                                              (line 145)
* mpfr_fits_ulong_p:                     Conversion Functions.
                                                              (line 143)
* mpfr_fits_ushort_p:                    Conversion Functions.
                                                              (line 147)
* mpfr_floor:                            Integer Related Functions.
                                                              (line   8)
* mpfr_fma:                              Special Functions.   (line 209)
* mpfr_fmod:                             Integer Related Functions.
                                                              (line  92)
* mpfr_fms:                              Special Functions.   (line 211)
* mpfr_fprintf:                          Formatted Output Functions.
                                                              (line 157)
* mpfr_frac:                             Integer Related Functions.
                                                              (line  76)
* mpfr_free_cache:                       Special Functions.   (line 254)
* mpfr_free_str:                         Conversion Functions.
                                                              (line 137)
* mpfr_frexp:                            Conversion Functions.
                                                              (line  45)
* mpfr_gamma:                            Special Functions.   (line 150)
* mpfr_get_d:                            Conversion Functions.
                                                              (line   7)
* mpfr_get_decimal64:                    Conversion Functions.
                                                              (line   9)
* mpfr_get_default_prec:                 Initialization Functions.
                                                              (line 112)
* mpfr_get_default_rounding_mode:        Rounding Related Functions.
                                                              (line  10)
* mpfr_get_d_2exp:                       Conversion Functions.
                                                              (line  32)
* mpfr_get_emax:                         Exception Related Functions.
                                                              (line   7)
* mpfr_get_emax_max:                     Exception Related Functions.
                                                              (line  30)
* mpfr_get_emax_min:                     Exception Related Functions.
                                                              (line  29)
* mpfr_get_emin:                         Exception Related Functions.
                                                              (line   6)
* mpfr_get_emin_max:                     Exception Related Functions.
                                                              (line  28)
* mpfr_get_emin_min:                     Exception Related Functions.
                                                              (line  27)
* mpfr_get_exp:                          Miscellaneous Functions.
                                                              (line  88)
* mpfr_get_f:                            Conversion Functions.
                                                              (line  72)
* mpfr_get_flt:                          Conversion Functions.
                                                              (line   6)
* mpfr_get_ld:                           Conversion Functions.
                                                              (line   8)
* mpfr_get_ld_2exp:                      Conversion Functions.
                                                              (line  34)
* mpfr_get_patches:                      Miscellaneous Functions.
                                                              (line 147)
* mpfr_get_prec:                         Initialization Functions.
                                                              (line 149)
* mpfr_get_si:                           Conversion Functions.
                                                              (line  19)
* mpfr_get_sj:                           Conversion Functions.
                                                              (line  21)
* mpfr_get_str:                          Conversion Functions.
                                                              (line  85)
* mpfr_get_ui:                           Conversion Functions.
                                                              (line  20)
* mpfr_get_uj:                           Conversion Functions.
                                                              (line  22)
* mpfr_get_version:                      Miscellaneous Functions.
                                                              (line 116)
* mpfr_get_z:                            Conversion Functions.
                                                              (line  67)
* mpfr_get_z_2exp:                       Conversion Functions.
                                                              (line  54)
* mpfr_grandom:                          Miscellaneous Functions.
                                                              (line  63)
* mpfr_greaterequal_p:                   Comparison Functions.
                                                              (line  56)
* mpfr_greater_p:                        Comparison Functions.
                                                              (line  55)
* mpfr_hypot:                            Special Functions.   (line 227)
* mpfr_inexflag_p:                       Exception Related Functions.
                                                              (line 136)
* mpfr_inf_p:                            Comparison Functions.
                                                              (line  40)
* mpfr_init:                             Initialization Functions.
                                                              (line  53)
* mpfr_init2:                            Initialization Functions.
                                                              (line  10)
* mpfr_inits:                            Initialization Functions.
                                                              (line  62)
* mpfr_inits2:                           Initialization Functions.
                                                              (line  22)
* mpfr_init_set:                         Combined Initialization and Assignment Functions.
                                                              (line   6)
* mpfr_init_set_d:                       Combined Initialization and Assignment Functions.
                                                              (line  11)
* mpfr_init_set_f:                       Combined Initialization and Assignment Functions.
                                                              (line  16)
* mpfr_init_set_ld:                      Combined Initialization and Assignment Functions.
                                                              (line  12)
* mpfr_init_set_q:                       Combined Initialization and Assignment Functions.
                                                              (line  15)
* mpfr_init_set_si:                      Combined Initialization and Assignment Functions.
                                                              (line   9)
* mpfr_init_set_str:                     Combined Initialization and Assignment Functions.
                                                              (line  21)
* mpfr_init_set_ui:                      Combined Initialization and Assignment Functions.
                                                              (line   7)
* mpfr_init_set_z:                       Combined Initialization and Assignment Functions.
                                                              (line  14)
* mpfr_inp_str:                          Input and Output Functions.
                                                              (line  31)
* mpfr_integer_p:                        Integer Related Functions.
                                                              (line 119)
* mpfr_j0:                               Special Functions.   (line 188)
* mpfr_j1:                               Special Functions.   (line 189)
* mpfr_jn:                               Special Functions.   (line 190)
* mpfr_lessequal_p:                      Comparison Functions.
                                                              (line  58)
* mpfr_lessgreater_p:                    Comparison Functions.
                                                              (line  64)
* mpfr_less_p:                           Comparison Functions.
                                                              (line  57)
* mpfr_lgamma:                           Special Functions.   (line 162)
* mpfr_li2:                              Special Functions.   (line 145)
* mpfr_lngamma:                          Special Functions.   (line 154)
* mpfr_log:                              Special Functions.   (line  16)
* mpfr_log10:                            Special Functions.   (line  18)
* mpfr_log1p:                            Special Functions.   (line 127)
* mpfr_log2:                             Special Functions.   (line  17)
* mpfr_max:                              Miscellaneous Functions.
                                                              (line  22)
* mpfr_min:                              Miscellaneous Functions.
                                                              (line  20)
* mpfr_min_prec:                         Rounding Related Functions.
                                                              (line  64)
* mpfr_modf:                             Integer Related Functions.
                                                              (line  82)
* mpfr_mul:                              Basic Arithmetic Functions.
                                                              (line  53)
* mpfr_mul_2exp:                         Compatibility with MPF.
                                                              (line  47)
* mpfr_mul_2si:                          Basic Arithmetic Functions.
                                                              (line 179)
* mpfr_mul_2ui:                          Basic Arithmetic Functions.
                                                              (line 177)
* mpfr_mul_d:                            Basic Arithmetic Functions.
                                                              (line  59)
* mpfr_mul_q:                            Basic Arithmetic Functions.
                                                              (line  63)
* mpfr_mul_si:                           Basic Arithmetic Functions.
                                                              (line  57)
* mpfr_mul_ui:                           Basic Arithmetic Functions.
                                                              (line  55)
* mpfr_mul_z:                            Basic Arithmetic Functions.
                                                              (line  61)
* mpfr_nanflag_p:                        Exception Related Functions.
                                                              (line 135)
* mpfr_nan_p:                            Comparison Functions.
                                                              (line  39)
* mpfr_neg:                              Basic Arithmetic Functions.
                                                              (line 164)
* mpfr_nextabove:                        Miscellaneous Functions.
                                                              (line  15)
* mpfr_nextbelow:                        Miscellaneous Functions.
                                                              (line  16)
* mpfr_nexttoward:                       Miscellaneous Functions.
                                                              (line   6)
* mpfr_number_p:                         Comparison Functions.
                                                              (line  41)
* mpfr_out_str:                          Input and Output Functions.
                                                              (line  15)
* mpfr_overflow_p:                       Exception Related Functions.
                                                              (line 133)
* mpfr_pow:                              Basic Arithmetic Functions.
                                                              (line 121)
* mpfr_pow_si:                           Basic Arithmetic Functions.
                                                              (line 125)
* mpfr_pow_ui:                           Basic Arithmetic Functions.
                                                              (line 123)
* mpfr_pow_z:                            Basic Arithmetic Functions.
                                                              (line 127)
* mpfr_prec_round:                       Rounding Related Functions.
                                                              (line  13)
* mpfr_prec_t:                           Nomenclature and Types.
                                                              (line  20)
* mpfr_printf:                           Formatted Output Functions.
                                                              (line 164)
* mpfr_print_rnd_mode:                   Rounding Related Functions.
                                                              (line  71)
* mpfr_rec_sqrt:                         Basic Arithmetic Functions.
                                                              (line 105)
* mpfr_regular_p:                        Comparison Functions.
                                                              (line  43)
* mpfr_reldiff:                          Compatibility with MPF.
                                                              (line  39)
* mpfr_remainder:                        Integer Related Functions.
                                                              (line  94)
* mpfr_remquo:                           Integer Related Functions.
                                                              (line  96)
* mpfr_rint:                             Integer Related Functions.
                                                              (line   6)
* mpfr_rint_ceil:                        Integer Related Functions.
                                                              (line  46)
* mpfr_rint_floor:                       Integer Related Functions.
                                                              (line  47)
* mpfr_rint_round:                       Integer Related Functions.
                                                              (line  49)
* mpfr_rint_trunc:                       Integer Related Functions.
                                                              (line  51)
* mpfr_rnd_t:                            Nomenclature and Types.
                                                              (line  34)
* mpfr_root:                             Basic Arithmetic Functions.
                                                              (line 114)
* mpfr_round:                            Integer Related Functions.
                                                              (line   9)
* mpfr_sec:                              Special Functions.   (line  47)
* mpfr_sech:                             Special Functions.   (line 111)
* mpfr_set:                              Assignment Functions.
                                                              (line   9)
* mpfr_setsign:                          Miscellaneous Functions.
                                                              (line 103)
* mpfr_set_d:                            Assignment Functions.
                                                              (line  16)
* mpfr_set_decimal64:                    Assignment Functions.
                                                              (line  19)
* mpfr_set_default_prec:                 Initialization Functions.
                                                              (line 100)
* mpfr_set_default_rounding_mode:        Rounding Related Functions.
                                                              (line   6)
* mpfr_set_divby0:                       Exception Related Functions.
                                                              (line 121)
* mpfr_set_emax:                         Exception Related Functions.
                                                              (line  16)
* mpfr_set_emin:                         Exception Related Functions.
                                                              (line  15)
* mpfr_set_erangeflag:                   Exception Related Functions.
                                                              (line 124)
* mpfr_set_exp:                          Miscellaneous Functions.
                                                              (line  93)
* mpfr_set_f:                            Assignment Functions.
                                                              (line  23)
* mpfr_set_flt:                          Assignment Functions.
                                                              (line  15)
* mpfr_set_inexflag:                     Exception Related Functions.
                                                              (line 123)
* mpfr_set_inf:                          Assignment Functions.
                                                              (line 143)
* mpfr_set_ld:                           Assignment Functions.
                                                              (line  17)
* mpfr_set_nan:                          Assignment Functions.
                                                              (line 142)
* mpfr_set_nanflag:                      Exception Related Functions.
                                                              (line 122)
* mpfr_set_overflow:                     Exception Related Functions.
                                                              (line 120)
* mpfr_set_prec:                         Initialization Functions.
                                                              (line 135)
* mpfr_set_prec_raw:                     Compatibility with MPF.
                                                              (line  22)
* mpfr_set_q:                            Assignment Functions.
                                                              (line  22)
* mpfr_set_si:                           Assignment Functions.
                                                              (line  12)
* mpfr_set_si_2exp:                      Assignment Functions.
                                                              (line  50)
* mpfr_set_sj:                           Assignment Functions.
                                                              (line  14)
* mpfr_set_sj_2exp:                      Assignment Functions.
                                                              (line  54)
* mpfr_set_str:                          Assignment Functions.
                                                              (line  62)
* mpfr_set_ui:                           Assignment Functions.
                                                              (line  10)
* mpfr_set_ui_2exp:                      Assignment Functions.
                                                              (line  48)
* mpfr_set_uj:                           Assignment Functions.
                                                              (line  13)
* mpfr_set_uj_2exp:                      Assignment Functions.
                                                              (line  52)
* mpfr_set_underflow:                    Exception Related Functions.
                                                              (line 119)
* mpfr_set_z:                            Assignment Functions.
                                                              (line  21)
* mpfr_set_zero:                         Assignment Functions.
                                                              (line 144)
* mpfr_set_z_2exp:                       Assignment Functions.
                                                              (line  56)
* mpfr_sgn:                              Comparison Functions.
                                                              (line  49)
* mpfr_signbit:                          Miscellaneous Functions.
                                                              (line  99)
* mpfr_sin:                              Special Functions.   (line  32)
* mpfr_sinh:                             Special Functions.   (line  98)
* mpfr_sinh_cosh:                        Special Functions.   (line 103)
* mpfr_sin_cos:                          Special Functions.   (line  37)
* mpfr_si_div:                           Basic Arithmetic Functions.
                                                              (line  80)
* mpfr_si_sub:                           Basic Arithmetic Functions.
                                                              (line  32)
* mpfr_snprintf:                         Formatted Output Functions.
                                                              (line 180)
* mpfr_sprintf:                          Formatted Output Functions.
                                                              (line 170)
* mpfr_sqr:                              Basic Arithmetic Functions.
                                                              (line  71)
* mpfr_sqrt:                             Basic Arithmetic Functions.
                                                              (line  98)
* mpfr_sqrt_ui:                          Basic Arithmetic Functions.
                                                              (line  99)
* mpfr_strtofr:                          Assignment Functions.
                                                              (line  80)
* mpfr_sub:                              Basic Arithmetic Functions.
                                                              (line  26)
* mpfr_subnormalize:                     Exception Related Functions.
                                                              (line  60)
* mpfr_sub_d:                            Basic Arithmetic Functions.
                                                              (line  38)
* mpfr_sub_q:                            Basic Arithmetic Functions.
                                                              (line  44)
* mpfr_sub_si:                           Basic Arithmetic Functions.
                                                              (line  34)
* mpfr_sub_ui:                           Basic Arithmetic Functions.
                                                              (line  30)
* mpfr_sub_z:                            Basic Arithmetic Functions.
                                                              (line  42)
* mpfr_sum:                              Special Functions.   (line 262)
* mpfr_swap:                             Assignment Functions.
                                                              (line 150)
* mpfr_t:                                Nomenclature and Types.
                                                              (line   6)
* mpfr_tan:                              Special Functions.   (line  33)
* mpfr_tanh:                             Special Functions.   (line  99)
* mpfr_trunc:                            Integer Related Functions.
                                                              (line  10)
* mpfr_ui_div:                           Basic Arithmetic Functions.
                                                              (line  76)
* mpfr_ui_pow:                           Basic Arithmetic Functions.
                                                              (line 131)
* mpfr_ui_pow_ui:                        Basic Arithmetic Functions.
                                                              (line 129)
* mpfr_ui_sub:                           Basic Arithmetic Functions.
                                                              (line  28)
* mpfr_underflow_p:                      Exception Related Functions.
                                                              (line 132)
* mpfr_unordered_p:                      Comparison Functions.
                                                              (line  69)
* mpfr_urandom:                          Miscellaneous Functions.
                                                              (line  48)
* mpfr_urandomb:                         Miscellaneous Functions.
                                                              (line  29)
* mpfr_vasprintf:                        Formatted Output Functions.
                                                              (line 194)
* MPFR_VERSION:                          Miscellaneous Functions.
                                                              (line 119)
* MPFR_VERSION_MAJOR:                    Miscellaneous Functions.
                                                              (line 120)
* MPFR_VERSION_MINOR:                    Miscellaneous Functions.
                                                              (line 121)
* MPFR_VERSION_NUM:                      Miscellaneous Functions.
                                                              (line 139)
* MPFR_VERSION_PATCHLEVEL:               Miscellaneous Functions.
                                                              (line 122)
* MPFR_VERSION_STRING:                   Miscellaneous Functions.
                                                              (line 123)
* mpfr_vfprintf:                         Formatted Output Functions.
                                                              (line 158)
* mpfr_vprintf:                          Formatted Output Functions.
                                                              (line 165)
* mpfr_vsnprintf:                        Formatted Output Functions.
                                                              (line 182)
* mpfr_vsprintf:                         Formatted Output Functions.
                                                              (line 171)
* mpfr_y0:                               Special Functions.   (line 199)
* mpfr_y1:                               Special Functions.   (line 200)
* mpfr_yn:                               Special Functions.   (line 201)
* mpfr_zero_p:                           Comparison Functions.
                                                              (line  42)
* mpfr_zeta:                             Special Functions.   (line 177)
* mpfr_zeta_ui:                          Special Functions.   (line 178)
* mpfr_z_sub:                            Basic Arithmetic Functions.
                                                              (line  40)



Tag Table:
Node: Top775
Node: Copying2007
Node: Introduction to MPFR3770
Node: Installing MPFR5884
Node: Reporting Bugs11328
Node: MPFR Basics13359
Node: Headers and Libraries13675
Node: Nomenclature and Types16829
Node: MPFR Variable Conventions18892
Node: Rounding Modes20436
Ref: ternary value21566
Node: Floating-Point Values on Special Numbers23552
Node: Exceptions26812
Node: Memory Handling29989
Node: MPFR Interface31135
Node: Initialization Functions33249
Node: Assignment Functions40564
Node: Combined Initialization and Assignment Functions49920
Node: Conversion Functions51221
Node: Basic Arithmetic Functions60283
Node: Comparison Functions69785
Node: Special Functions73273
Node: Input and Output Functions87874
Node: Formatted Output Functions89846
Node: Integer Related Functions99633
Node: Rounding Related Functions106254
Node: Miscellaneous Functions110091
Node: Exception Related Functions118774
Node: Compatibility with MPF125592
Node: Custom Interface128334
Node: Internals132733
Node: API Compatibility134277
Node: Type and Macro Changes136207
Node: Added Functions139056
Node: Changed Functions142344
Node: Removed Functions146758
Node: Other Changes147186
Node: Contributors148789
Node: References151442
Node: GNU Free Documentation License153196
Node: Concept Index175789
Node: Function and Type Index181854

End Tag Table


Local Variables:
coding: utf-8
End:
