ff4ff35918
Red Bear OS is a full fork. All sources must be available from git clone with zero network access. Removed gitignore rules that excluded fetched source trees under recipes/*/source/, local/recipes/kde/*/source/, local/recipes/qt/*/source/, and vendor source trees. Build artifacts (target/, build/, source.tar, *.o, *.so) remain excluded. 127291 files added — kernel, relibc, base, bootloader, pkgar, all KDE/Qt frameworks, mesa, wayland, DRM drivers, and every other recipe source.
4965 lines
230 KiB
Plaintext
4965 lines
230 KiB
Plaintext
\input texinfo @c -*-texinfo-*-
|
|
@c %**start of header
|
|
@setfilename mpfr.info
|
|
@documentencoding UTF-8
|
|
@c Note that the 5 occurrences of the version string in this file
|
|
@c should be updated by the tools/update-version script.
|
|
@set VERSION 4.2.2
|
|
@set UPDATED-MONTH March 2025
|
|
@settitle GNU MPFR @value{VERSION}
|
|
@synindex tp fn
|
|
@iftex
|
|
@afourpaper
|
|
@end iftex
|
|
@c %**end of header
|
|
|
|
@c Note: avoid using non-ASCII characters directly when possible,
|
|
@c as the "info" utility cannot currently handle them.
|
|
@c https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=212549
|
|
|
|
@c Warning! If a macro is used with @iftex, it must also be defined for
|
|
@c info at least (e.g. with @ifnottex) in order to avoid a failure with
|
|
@c makeinfo 5.2 (there is no such problem with makeinfo 6.5).
|
|
|
|
@copying
|
|
This manual documents how to install and use the Multiple Precision
|
|
Floating-Point Reliable Library, version @value{VERSION}.
|
|
|
|
Copyright 1991, 1993-2025 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.3 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 @ref{GNU Free Documentation License}.
|
|
@end copying
|
|
|
|
@dircategory Software libraries
|
|
@direntry
|
|
* mpfr: (mpfr). Multiple Precision Floating-Point Reliable Library.
|
|
@end direntry
|
|
|
|
@c html <meta name=description content="...">
|
|
@documentdescription
|
|
How to install and use GNU MPFR, a library for reliable multiple precision
|
|
floating-point arithmetic, version @value{VERSION}.
|
|
@end documentdescription
|
|
|
|
@c smallbook
|
|
@finalout
|
|
@setchapternewpage on
|
|
|
|
@ifnottex
|
|
@node Top, Copying, (dir), (dir)
|
|
@top GNU MPFR
|
|
@end ifnottex
|
|
|
|
@iftex
|
|
@titlepage
|
|
@title GNU MPFR
|
|
@subtitle The Multiple Precision Floating-Point Reliable Library
|
|
@subtitle Edition @value{VERSION}
|
|
@subtitle @value{UPDATED-MONTH}
|
|
|
|
@author The MPFR team
|
|
@email{mpfr@@inria.fr}
|
|
|
|
@c Include the Distribution inside the titlepage so
|
|
@c that headings are turned off.
|
|
|
|
@tex
|
|
\global\parindent=0pt
|
|
\global\parskip=8pt
|
|
\global\baselineskip=13pt
|
|
@end tex
|
|
|
|
@page
|
|
@vskip 0pt plus 1filll
|
|
@end iftex
|
|
|
|
@insertcopying
|
|
@ifnottex
|
|
@sp 1
|
|
@end ifnottex
|
|
|
|
@iftex
|
|
@end titlepage
|
|
@headings double
|
|
@end iftex
|
|
|
|
@c Don't bother with contents for html, the menus seem adequate.
|
|
@ifnothtml
|
|
@contents
|
|
@end ifnothtml
|
|
|
|
@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.
|
|
* MPFR and the IEEE 754 Standard::
|
|
* Contributors::
|
|
* References::
|
|
* GNU Free Documentation License::
|
|
* Concept Index::
|
|
* Function and Type Index::
|
|
@end menu
|
|
|
|
|
|
@c @m{T,N} is $T$ for the TeX output, otherwise just N (for Info/HTML),
|
|
@c where N is expected to be human-readable text. This is an easy way to
|
|
@c give different forms for math in TeX and Info/HTML.
|
|
@c Commas in N or T don't work, but @comma{} can be used instead.
|
|
@c \, works in Info but not in TeX.
|
|
@c For simple math, one may have T = N, in which case @mm or @tm (macros
|
|
@c defined below) should be used instead of @m.
|
|
@c Line breaks should not be disabled for the TeX output T (the concept of
|
|
@c penalty is used instead). For N, @w can be used, possibly on a part of
|
|
@c the text.
|
|
@c Warning! For TeX, the use of some Texinfo macros (even empty macros) may
|
|
@c give incorrect output (e.g., incorrect spacing with empty macros).
|
|
@c Note: This macro came from GMP's gmp.texi, where it was added in 2000-10
|
|
@c (see "hg diff -c3083"). This macro expanded to $T$ in TeX, otherwise
|
|
@c to @math{N}, thus for Info and HTML output (though HTML was not mentioned
|
|
@c in the change and potentially not considered at that time). However, for
|
|
@c Info output, the use of @math is ignored by Texinfo (thus useless), and
|
|
@c the HTML output is enclosed by <em> (generally rendered in italics),
|
|
@c which was unexpected since N is just human-readable text, without any
|
|
@c reason to use emphasis (note that @math{...} formatting could be changed
|
|
@c via the HTML_MATH variable, but anyway, its use would have been incorrect
|
|
@c because it expects $...$ TeX syntax, instead of human-readable text as
|
|
@c used in the GMP/MPFR manuals, and @math{...} did not handle @var{...}
|
|
@c correctly).
|
|
@c See discussions:
|
|
@c https://lists.gnu.org/archive/html/bug-texinfo/2022-10/msg00045.html
|
|
@c https://lists.gnu.org/archive/html/bug-texinfo/2022-10/msg00078.html
|
|
@iftex
|
|
@macro m {T,N}
|
|
@tex$\T\$@end tex
|
|
@end macro
|
|
@end iftex
|
|
@ifnottex
|
|
@macro m {T,N}
|
|
\N\
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c @mm{T} is @m{T,T}. It should be used for math symbols (+, <, >) outside
|
|
@c of @m, @tm, @code or similar (but do not use it for the "+" in "C++").
|
|
@c Indeed, for TeX output, there are 2 kinds of "+" rendering: one in math
|
|
@c mode and one in text mode; for consistency and better look, the one in
|
|
@c math mode should be used for what looks like math, i.e. what could be
|
|
@c in a math expression. Ditto for other symbols like < and >, but this is
|
|
@c not needed for @minus{}, as this builtin macro does already that.
|
|
@c Note: @tm{T}, defined below, could also be used, but @mm{T} is simpler
|
|
@c for a single character (no need to disable line breaks).
|
|
@macro mm {T}
|
|
@m{\T\,\T\}
|
|
@end macro
|
|
|
|
@c @tm{T} is $T$ for the TeX output, otherwise @w{T} in order to disable
|
|
@c line breaks. Use this for simple math expressions.
|
|
@macro tm {T}
|
|
@m{\T\,@w{\T\}}
|
|
@end macro
|
|
|
|
@c Usage: @GMPabs{x}
|
|
@c Give either |x| in tex, or abs(x) in info or html.
|
|
@c The \ensuremath is needed because the OT1 encoding is used, where
|
|
@c the pipe character corresponds to a wide dash:
|
|
@c https://tex.stackexchange.com/a/1775/58921
|
|
@tex
|
|
\gdef\GMPabs#1{\ensuremath{|#1|}}
|
|
@end tex
|
|
@ifnottex
|
|
@macro GMPabs {X}
|
|
@abs{}(\X\)
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c Usage: @GMPtimes{}
|
|
@c Give either \times or the word "times".
|
|
@tex
|
|
\gdef\GMPtimes{\times}
|
|
@end tex
|
|
@ifnottex
|
|
@macro GMPtimes
|
|
times
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c New math operators.
|
|
@c @abs{}, @atan{}, @sign{}, @EXP{} and @PREC{} can be used in both tex
|
|
@c and info.
|
|
@c
|
|
@c Note: In the definitions below, let's use \mathop rather than
|
|
@c \operatorname, which is not available. And the #1 is necessary
|
|
@c to avoid a spacing issue:
|
|
@c https://lists.gnu.org/archive/html/bug-texinfo/2022-11/msg00033.html
|
|
@c The consequence is that if \abs, etc. is used in TeX, one still needs
|
|
@c the {}; so it is preferable to use the Texinfo syntax. Unfortunately,
|
|
@c the consequence of the Texinfo behavior is that it is not possible to
|
|
@c use the macros associated with the pre-existing math operators, like
|
|
@c @sin{}, because in the pre-existing TeX definition, there is no #1
|
|
@c (if a pre-existing operator like "sin" is needed, we have to use our
|
|
@c own macro name, like @mysin, as the redefinition of pre-existing TeX
|
|
@c commands is discouraged).
|
|
@c
|
|
@c Warning! If new math operators are added, they must not consist of a
|
|
@c single character, otherwise it is shifted downward. A workaround is to
|
|
@c add an empty hbox, e.g. \mathop{\rm F\hbox{}} instead of \mathop{\rm F}.
|
|
@c Idea inspired by <https://tex.stackexchange.com/a/284370/58921>.
|
|
@tex
|
|
\gdef\abs#1{\mathop{\rm abs}}
|
|
\gdef\atan#1{\mathop{\rm atan}}
|
|
\gdef\max#1{\mathop{\rm max}}
|
|
\gdef\sign#1{\mathop{\rm sign}}
|
|
\gdef\EXP#1{\mathop{\rm EXP}}
|
|
\gdef\PREC#1{\mathop{\rm PREC}}
|
|
@end tex
|
|
@ifnottex
|
|
@macro abs
|
|
abs
|
|
@end macro
|
|
@macro atan
|
|
atan
|
|
@end macro
|
|
@macro max
|
|
max
|
|
@end macro
|
|
@macro sign
|
|
sign
|
|
@end macro
|
|
@macro EXP
|
|
EXP
|
|
@end macro
|
|
@macro PREC
|
|
PREC
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c @times{} made available as a "*" in info and html (already works in tex).
|
|
@ifnottex
|
|
@macro times
|
|
*
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c Math operators already available in tex, made available in info too.
|
|
@c For example @log{} can be used in both tex and info.
|
|
@ifnottex
|
|
@macro le
|
|
<=
|
|
@end macro
|
|
@macro ge
|
|
>=
|
|
@end macro
|
|
@macro ne
|
|
<>
|
|
@end macro
|
|
@macro log
|
|
log
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c @pom{} definition
|
|
@tex
|
|
\gdef\pom{\ifmmode\pm\else$\pm$\fi}
|
|
@end tex
|
|
@ifnottex
|
|
@macro pom
|
|
±
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c Hack for TeX output (PDF).
|
|
@c
|
|
@c With texinfo.tex 2022-11-13.08, in TeX output (PDF), the "[]" in
|
|
@c function prototypes via @deftypefun (for mpfr_sum and mpfr_dot)
|
|
@c is not rendered in a monospaced font and appears as a rectangle:
|
|
@c https://lists.gnu.org/archive/html/bug-texinfo/2022-11/msg00156.html
|
|
@c
|
|
@c The suggestion to use @t{[]} makes the HTML output inconsistent
|
|
@c and ugly. Thus this should be done only for TeX output thanks to
|
|
@c the following macro.
|
|
@iftex
|
|
@macro fptt {T}
|
|
@tt{\T\}
|
|
@end macro
|
|
@end iftex
|
|
@ifnottex
|
|
@macro fptt {T}
|
|
\T\
|
|
@end macro
|
|
@end ifnottex
|
|
|
|
@c The following macro have been copied from gmp.texi
|
|
@c
|
|
@c Usage: @MPFRpxreftop{info,title}
|
|
@c
|
|
@c Like @pxref{}, but designed for a reference to the top of a document, not
|
|
@c a particular section.
|
|
@c
|
|
@c The texinfo manual recommends putting a likely section name in references
|
|
@c like this, eg. "Introduction", but it seems better to just give the title.
|
|
@c
|
|
@iftex
|
|
@macro MPFRpxreftop{info,title}
|
|
see @cite{\title\}.
|
|
@end macro
|
|
@end iftex
|
|
@ifhtml
|
|
@macro MPFRpxreftop{info,title}
|
|
see @cite{\title\}.
|
|
@end macro
|
|
@end ifhtml
|
|
@ifnottex
|
|
@ifnothtml
|
|
@macro MPFRpxreftop{info,title}
|
|
@pxref{Top,\title\,\title\,\info\,\title\}
|
|
@end macro
|
|
@end ifnothtml
|
|
@end ifnottex
|
|
|
|
@node Copying, Introduction to MPFR, Top, Top
|
|
@comment node-name, next, previous, up
|
|
@unnumbered MPFR Copying Conditions
|
|
@cindex Copying conditions
|
|
@cindex Conditions for copying MPFR
|
|
|
|
The GNU MPFR library (or MPFR for short)
|
|
is @dfn{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.@.
|
|
|
|
@node Introduction to MPFR, Installing MPFR, Copying, Top
|
|
@comment node-name, next, previous, up
|
|
@chapter 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:
|
|
|
|
@itemize @bullet
|
|
|
|
@item the MPFR code is portable, i.e., the result of any operation
|
|
does not depend on the machine word size
|
|
@code{mp_bits_per_limb} (64 on most current processors), possibly
|
|
except in faithful rounding.
|
|
It does not depend either on the machine rounding mode or rounding precision;
|
|
|
|
@item the precision in bits can be set @emph{exactly} to any valid value
|
|
for each variable (including very small precision);
|
|
|
|
@item MPFR provides the four rounding modes from the IEEE@tie{}754-1985
|
|
standard, plus away-from-zero, as well as for basic operations as for other
|
|
mathematical functions. Faithful rounding (partially supported) is provided
|
|
too, but the results may no longer be reproducible.
|
|
|
|
@end itemize
|
|
|
|
In particular, MPFR follows the specification of the IEEE@tie{}754 standard,
|
|
currently IEEE@tie{}754-2019 (which will be referred to as IEEE@tie{}754
|
|
in this manual), with some minor differences, such as: there is a single
|
|
NaN, the default exponent range is much wider, and subnormal numbers are
|
|
not implemented (but the exponent range can be reduced to any interval,
|
|
and subnormals can be emulated). For instance, computations in the
|
|
binary64 format (a.k.a.@: double precision) can be reproduced by using
|
|
a precision of 53 bits.
|
|
|
|
This version of MPFR is released under the GNU Lesser General Public
|
|
License, version 3 or any later version.
|
|
It is permitted to link MPFR to most non-free programs, as long as when
|
|
distributing them the MPFR source code and a means to re-link with a
|
|
modified MPFR library is provided.
|
|
|
|
@section How to Use This Manual
|
|
|
|
Everyone should read @ref{MPFR Basics}. If you need to install the library
|
|
yourself, you need to read @ref{Installing MPFR}, too.
|
|
To use the library you will need to refer to @ref{MPFR Interface}.
|
|
|
|
The rest of the manual can be used for later reference, although it is
|
|
probably a good idea to glance through it.
|
|
|
|
@node Installing MPFR, Reporting Bugs, Introduction to MPFR, Top
|
|
@comment node-name, next, previous, up
|
|
@chapter Installing MPFR
|
|
@cindex Installation
|
|
|
|
The MPFR library is already installed on some GNU/Linux distributions,
|
|
but the development files necessary to the compilation such as
|
|
@file{mpfr.h} are not always present. To check that MPFR is fully
|
|
installed on your computer, you can check the presence of the file
|
|
@file{mpfr.h} in @file{/usr/include}, or try to compile a small program
|
|
having @code{#include <mpfr.h>} (since @file{mpfr.h} may be installed
|
|
somewhere else). For instance, you can try to compile:
|
|
|
|
@need 400
|
|
@example
|
|
#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;
|
|
@}
|
|
@end example
|
|
|
|
@noindent
|
|
with
|
|
|
|
@example
|
|
cc -o version version.c -lmpfr -lgmp
|
|
@end example
|
|
|
|
@noindent
|
|
and if you get errors whose first line looks like
|
|
|
|
@example
|
|
version.c:2:19: error: mpfr.h: No such file or directory
|
|
@end example
|
|
|
|
@noindent
|
|
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.
|
|
|
|
@section How to Install
|
|
|
|
Here are the steps needed to install the library on Unix systems
|
|
(more details are provided in the @file{INSTALL} file):
|
|
|
|
@enumerate
|
|
|
|
@item
|
|
To build MPFR, you first have to install GNU MP (version 5.0.0 or higher)
|
|
on your computer.
|
|
You need a C compiler, preferably GCC, but any reasonable compiler should
|
|
work (C++ compilers should work too, under the condition that they do not
|
|
break type punning via union). And you need the standard Unix @samp{make}
|
|
command, plus some other standard Unix utility commands.
|
|
|
|
Then, in the MPFR build directory, type the following commands.
|
|
|
|
@item
|
|
@samp{./configure}
|
|
|
|
This will prepare the build and set up the options according to your system.
|
|
You can give options to specify the install directories (instead of
|
|
the default @file{/usr/local}), threading support, and so on. See
|
|
the @file{INSTALL} file and/or the output of @samp{./configure --help}
|
|
for more information, in particular if you get error messages.
|
|
|
|
@item
|
|
@samp{make}
|
|
|
|
This will compile MPFR, and create a library archive file @file{libmpfr.a}.
|
|
On most platforms, a dynamic library will be produced too.
|
|
|
|
@item
|
|
@samp{make check}
|
|
|
|
This will make sure that MPFR was built correctly.
|
|
If any test fails, information about this failure can be found in the
|
|
@file{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 @samp{VERBOSE}
|
|
environment variable to 1 before running @samp{make check}, for instance
|
|
by typing:
|
|
|
|
@samp{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
|
|
@samp{mpfr@@inria.fr}. For details, see @ref{Reporting Bugs}.
|
|
|
|
@item
|
|
@samp{make install}
|
|
|
|
This will copy the files @file{mpfr.h} and @file{mpf2mpfr.h} to the directory
|
|
@file{/usr/local/include}, the library files (@file{libmpfr.a} and possibly
|
|
others) to the directory @file{/usr/local/lib}, the file @file{mpfr.info}
|
|
to the directory @file{/usr/local/share/info}, and some other documentation
|
|
files to the directory @file{/usr/local/share/doc/mpfr} (or if you passed the
|
|
@samp{--prefix} option to @file{configure}, using the prefix directory given
|
|
as argument to @samp{--prefix} instead of @file{/usr/local}).
|
|
|
|
@end enumerate
|
|
|
|
@section Other `make' Targets
|
|
|
|
There are some other useful make targets:
|
|
|
|
@itemize @bullet
|
|
|
|
@item
|
|
@samp{mpfr.info} or @samp{info}
|
|
|
|
Create or update an info version of the manual, in @file{mpfr.info}.
|
|
|
|
This file is already provided in the MPFR archives.
|
|
|
|
@item
|
|
@samp{mpfr.pdf} or @samp{pdf}
|
|
|
|
Create a PDF version of the manual, in @file{mpfr.pdf}.
|
|
|
|
@item
|
|
@samp{mpfr.dvi} or @samp{dvi}
|
|
|
|
Create a DVI version of the manual, in @file{mpfr.dvi}.
|
|
|
|
@item
|
|
@samp{mpfr.ps} or @samp{ps}
|
|
|
|
Create a PostScript version of the manual, in @file{mpfr.ps}.
|
|
|
|
@item
|
|
@samp{mpfr.html} or @samp{html}
|
|
|
|
Create a HTML version of the manual, in several pages in the directory
|
|
@file{doc/mpfr.html}; if you want only one output HTML file, then type
|
|
@samp{makeinfo --html --no-split mpfr.texi} from the @samp{doc} directory
|
|
instead.
|
|
|
|
@item
|
|
@samp{clean}
|
|
|
|
Delete all object files and archive files, but not the configuration files.
|
|
|
|
@item
|
|
@samp{distclean}
|
|
|
|
Delete all generated files not included in the distribution.
|
|
|
|
@item
|
|
@samp{uninstall}
|
|
|
|
Delete all files copied by @samp{make install}.
|
|
|
|
@end itemize
|
|
|
|
|
|
@section Build Problems
|
|
|
|
In case of problem, please read the @file{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
|
|
@url{https://www.mpfr.org/faq.html}.
|
|
|
|
@comment Warning! Do not split "MPFR ... @url{...}" across several lines
|
|
@comment as this needs to be updated with update-version.
|
|
Please report problems to the MPFR mailing-list @samp{mpfr@@inria.fr}.
|
|
@xref{Reporting Bugs}.
|
|
Some bug fixes are available on the
|
|
MPFR@tie{}4.2.2 web page @url{https://www.mpfr.org/mpfr-4.2.2/}.
|
|
|
|
@section Getting the Latest Version of MPFR
|
|
|
|
The latest version of MPFR is available from
|
|
@url{https://ftp.gnu.org/gnu/mpfr/} or @url{https://www.mpfr.org/}.
|
|
|
|
@node Reporting Bugs, MPFR Basics, Installing MPFR, Top
|
|
@comment node-name, next, previous, up
|
|
@chapter Reporting Bugs
|
|
@cindex Reporting bugs
|
|
|
|
@comment Warning! Do not split "MPFR ... @url{...}" across several lines
|
|
@comment as this needs to be updated with update-version.
|
|
If you think you have found a bug in the MPFR library, first have a look
|
|
on the MPFR@tie{}4.2.2 web page @url{https://www.mpfr.org/mpfr-4.2.2/}
|
|
and the FAQ @url{https://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:
|
|
@url{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 @samp{cc -V} on some machines, or, if you are using GCC,
|
|
@samp{gcc -v}. Also, include the output from @samp{uname -a} and the MPFR
|
|
version (the GMP version may be useful too).
|
|
If you get a failure while running @samp{make} or @samp{make check}, please
|
|
include the @file{config.log} file in your bug report, and in case of test
|
|
failure, the @file{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 @samp{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.
|
|
|
|
@node MPFR Basics, MPFR Interface, Reporting Bugs, Top
|
|
@comment node-name, next, previous, up
|
|
@chapter MPFR Basics
|
|
|
|
@menu
|
|
* Headers and Libraries::
|
|
* Nomenclature and Types::
|
|
* MPFR Variable Conventions::
|
|
* Rounding::
|
|
* Floating-Point Values on Special Numbers::
|
|
* Exceptions::
|
|
* Memory Handling::
|
|
* Getting the Best Efficiency Out of MPFR::
|
|
@end menu
|
|
|
|
@node Headers and Libraries, Nomenclature and Types, MPFR Basics, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section Headers and Libraries
|
|
|
|
@cindex @file{mpfr.h}
|
|
All declarations needed to use MPFR are collected in the include file
|
|
@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:
|
|
|
|
@example
|
|
#include <mpfr.h>
|
|
@end example
|
|
|
|
@cindex @code{stdio.h}
|
|
Note, however, that prototypes for MPFR functions with @code{FILE *} parameters
|
|
are provided only if @code{<stdio.h>} is included too (before @file{mpfr.h}):
|
|
|
|
@need 300
|
|
@example
|
|
#include <stdio.h>
|
|
#include <mpfr.h>
|
|
@end example
|
|
|
|
@cindex @code{stdarg.h}
|
|
Likewise @code{<stdarg.h>} (or @code{<varargs.h>}) is required for prototypes
|
|
with @code{va_list} parameters, such as @code{mpfr_vprintf}.
|
|
|
|
@cindex @code{stdint.h}
|
|
@cindex @code{inttypes.h}
|
|
@cindex @code{intmax_t}
|
|
@cindex @code{uintmax_t}
|
|
And for any functions using @code{intmax_t}, you must include
|
|
@code{<stdint.h>} or @code{<inttypes.h>} before @file{mpfr.h}, to
|
|
allow @file{mpfr.h} to define prototypes for these functions.
|
|
Moreover, under some platforms (in particular with C++ compilers),
|
|
users may need to define
|
|
@code{MPFR_USE_INTMAX_T} (and should do it for portability) before
|
|
@file{mpfr.h} has been included; of course, it is possible to do that
|
|
on the command line, e.g., with @code{-DMPFR_USE_INTMAX_T}.
|
|
|
|
Note: If @file{mpfr.h} and/or @file{gmp.h} (used by @file{mpfr.h})
|
|
are included several times (possibly from another header file),
|
|
@code{<stdio.h>} and/or @code{<stdarg.h>} (or @code{<varargs.h>})
|
|
should be included @strong{before the first inclusion} of
|
|
@file{mpfr.h} or @file{gmp.h}. Alternatively, you can define
|
|
@code{MPFR_USE_FILE} (for MPFR I/O functions) and/or
|
|
@code{MPFR_USE_VA_LIST} (for MPFR functions with @code{va_list}
|
|
parameters) anywhere before the last inclusion of @file{mpfr.h}.
|
|
As a consequence, if your file is a public header that includes
|
|
@file{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 @code{do},
|
|
@code{while} and @code{sizeof}).
|
|
|
|
You can avoid the use of MPFR macros encapsulating functions by defining
|
|
the @code{MPFR_USE_NO_MACRO} macro before @file{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.
|
|
|
|
@cindex Libraries
|
|
@cindex Linking
|
|
@cindex @code{libmpfr}
|
|
All programs using MPFR must link against both @file{libmpfr} and
|
|
@file{libgmp} libraries. On a typical Unix-like system this can be
|
|
done with @samp{-lmpfr -lgmp} (in that order), for example:
|
|
|
|
@example
|
|
gcc myprogram.c -lmpfr -lgmp
|
|
@end example
|
|
|
|
@cindex Libtool
|
|
MPFR is built using Libtool and an application can use that to link if
|
|
desired, @MPFRpxreftop{libtool, GNU Libtool}
|
|
@c Note: the .info extension has been added to avoid the following bug:
|
|
@c https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=484740
|
|
@c which occurs when reading the info file from the build directory:
|
|
@c info ./mpfr or info -f ./mpfr.info
|
|
@c Due to a poor design, the "info" utility will not find the correct
|
|
@c libtool info file if the .info extension is not provided, because of
|
|
@c the "libtool" script in MPFR's directory!
|
|
|
|
If MPFR has been installed to a non-standard location, then it may be
|
|
necessary to set up environment variables such as @samp{C_INCLUDE_PATH}
|
|
and @samp{LIBRARY_PATH}, or use @samp{-I} and @samp{-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.,
|
|
@samp{LD_LIBRARY_PATH}) on some systems. Please read the @file{INSTALL}
|
|
file for additional information.
|
|
|
|
Alternatively, it is possible to use @samp{pkg-config} (a file
|
|
@samp{mpfr.pc} is provided as of MPFR@tie{}4.0):
|
|
|
|
@example
|
|
cc myprogram.c $(pkg-config --cflags --libs mpfr)
|
|
@end example
|
|
|
|
Note that the @samp{MPFR_} and @samp{mpfr_} prefixes are reserved for MPFR@.
|
|
As a general rule, in order to avoid clashes, software using MPFR (directly
|
|
or indirectly) and system headers/libraries should not define macros and
|
|
symbols using these prefixes.
|
|
@c Concerning system headers/libraries: those that may be used by MPFR.
|
|
|
|
@node Nomenclature and Types, MPFR Variable Conventions, Headers and Libraries, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section Nomenclature and Types
|
|
|
|
@cindex Floating-point number
|
|
@cindex Regular number
|
|
@tindex @code{mpfr_t}
|
|
@tindex @code{mpfr_ptr}
|
|
@tindex @code{mpfr_srcptr}
|
|
A @dfn{floating-point number}, or @dfn{float} for short, is an object
|
|
representing a radix-2 floating-point number consisting of a sign,
|
|
an arbitrary-precision normalized significand (also called mantissa),
|
|
and an exponent (an integer in some given range); these are called
|
|
@dfn{regular numbers}. By convention, the radix point of the significand
|
|
is just before the first digit (which is always 1 due to normalization),
|
|
like in the C language, but unlike in IEEE@tie{}754 (thus, for a given
|
|
number, the exponent values in MPFR and in IEEE@tie{}754 differ by 1).
|
|
|
|
Like in the IEEE@tie{}754 standard, a floating-point number can also
|
|
have three kinds of special values: a signed zero (@mm{+}0 or @minus{}0),
|
|
a signed infinity (@mm{+}Inf or @minus{}Inf), and Not-a-Number (NaN)@. NaN
|
|
can represent the default value of a floating-point object and the
|
|
result of some operations for which no other results would make sense,
|
|
such as 0 divided by 0 or @mm{+}Inf minus @mm{+}Inf; unless
|
|
documented otherwise, the sign bit of a NaN is unspecified.
|
|
Note that contrary to IEEE@tie{}754, MPFR has a single kind of NaN and
|
|
does not have subnormals.
|
|
Other than that, the behavior is very similar to IEEE@tie{}754, but there
|
|
are some minor differences.
|
|
|
|
The C data type for such objects is @code{mpfr_t}, internally defined
|
|
as a one-element array of a structure (so that when passed as an
|
|
argument to a function, it is the pointer that is actually passed),
|
|
and @code{mpfr_ptr} is the C data type representing a pointer to this
|
|
structure; @code{mpfr_srcptr} is like @code{mpfr_ptr}, but the structure
|
|
is read-only (i.e., const qualified).
|
|
|
|
@cindex Precision
|
|
@tindex @code{mpfr_prec_t}
|
|
The @dfn{precision} is the number of bits used to represent the significand
|
|
of a floating-point number;
|
|
the corresponding C data type is @code{mpfr_prec_t}.
|
|
The precision can be any integer between @code{MPFR_PREC_MIN} and
|
|
@code{MPFR_PREC_MAX}. In the current implementation, @code{MPFR_PREC_MIN}
|
|
is equal to 1.
|
|
|
|
Warning! MPFR needs to increase the precision internally, in order to
|
|
provide accurate results (and in particular, correct rounding). Do not
|
|
attempt to set the precision to any value near @code{MPFR_PREC_MAX},
|
|
otherwise MPFR will abort due to an assertion failure. However, in practice,
|
|
the real limitation will probably be the available memory on your platform,
|
|
and in case of lack of memory, the program may abort, crash or have
|
|
undefined behavior (depending on your C implementation).
|
|
|
|
@cindex Exponent
|
|
@tindex @code{mpfr_exp_t}
|
|
An @dfn{exponent} is a component of a regular floating-point number.
|
|
Its C data type is @code{mpfr_exp_t}. Valid exponents are restricted
|
|
to a subset of this type, and the exponent range can be changed globally
|
|
as described in @ref{Exception Related Functions}. Special values do not
|
|
have an exponent.
|
|
|
|
@cindex Rounding
|
|
@tindex @code{mpfr_rnd_t}
|
|
The @dfn{rounding mode} specifies the way to round the result of a
|
|
floating-point operation, in case the exact result cannot be represented
|
|
exactly in the destination (@pxref{Rounding}).
|
|
The corresponding C data type is @code{mpfr_rnd_t}.
|
|
|
|
@cindex Group of flags
|
|
@tindex @code{mpfr_flags_t}
|
|
MPFR has a global (or per-thread) flag for each supported exception and
|
|
provides operations on flags (@ref{Exceptions}). This C data type is used
|
|
to represent a group of flags (or a mask).
|
|
|
|
@cindex binary128
|
|
@cindex float128
|
|
@tindex @code{_Float128}
|
|
@tindex @code{__float128}
|
|
@tindex @code{mpfr_float128}
|
|
MPFR can be built with binary128 support (a.k.a.@: float128) for some
|
|
conversion functions if the @samp{_Float128} type (from ISO C23) or
|
|
the @samp{__float128} type (a common extension) is available. This is
|
|
automatically detected, but the @samp{--enable-float128} configure option
|
|
can also be used to ensure this support. For this support, MPFR uses a
|
|
@code{mpfr_float128} macro, which needs to be defined as a supported type
|
|
for the binary128 format, typically @samp{_Float128} or @samp{__float128},
|
|
depending on the compiler and the system used to compile the user code.
|
|
Before including @file{mpfr.h}, the user needs to do the following (in
|
|
any order): define the @code{MPFR_WANT_FLOAT128} macro and define the
|
|
@code{mpfr_float128} macro as the actual float128 type; @file{mpfr.h} will
|
|
define @code{mpfr_float128} as @samp{_Float128} by default, but mainly for
|
|
compatibility with software written for MPFR@tie{}4.1.x and 4.2.0, where
|
|
the prototypes used @samp{_Float128}.
|
|
|
|
@node MPFR Variable Conventions, Rounding, Nomenclature and Types, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section MPFR Variable Conventions
|
|
|
|
Before you can assign to a MPFR variable, you need to initialize it by calling
|
|
one of the special initialization functions. When you are done with a
|
|
variable, you need to clear it out, using one of the functions for that
|
|
purpose.
|
|
A variable should only be initialized once, or at least cleared out between
|
|
each initialization. After a variable has been initialized, it may be
|
|
assigned to any number of times.
|
|
For efficiency reasons, avoid to initialize and clear out a variable in loops.
|
|
Instead, initialize it before entering the loop, and clear it out after the
|
|
loop has exited.
|
|
You do not need to be concerned about allocating additional space for MPFR
|
|
variables, since any variable has a significand of fixed size.
|
|
Hence unless you change its precision, or clear and reinitialize it,
|
|
a floating-point variable will have the same allocated space during all its
|
|
life.
|
|
|
|
As a general rule, all MPFR functions expect output arguments before input
|
|
arguments. This notation is based on an analogy with the assignment operator.
|
|
MPFR allows you to use the same variable for both input and output in the same
|
|
expression. For example, the main function for floating-point multiplication,
|
|
@code{mpfr_mul}, can be used like this: @code{mpfr_mul (x, x, x, rnd)}.
|
|
This computes the square of @var{x} with rounding mode @code{rnd}
|
|
and puts the result back in @var{x}.
|
|
|
|
@node Rounding, Floating-Point Values on Special Numbers, MPFR Variable Conventions, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section Rounding
|
|
|
|
The following rounding modes are supported:
|
|
|
|
@itemize @bullet
|
|
|
|
@item @code{MPFR_RNDN}: round to nearest, with the even rounding rule
|
|
(roundTiesToEven in IEEE@tie{}754); see details below.
|
|
|
|
@item @code{MPFR_RNDD}: round toward negative infinity
|
|
(roundTowardNegative in IEEE@tie{}754).
|
|
|
|
@item @code{MPFR_RNDU}: round toward positive infinity
|
|
(roundTowardPositive in IEEE@tie{}754).
|
|
|
|
@item @code{MPFR_RNDZ}: round toward zero
|
|
(roundTowardZero in IEEE@tie{}754).
|
|
|
|
@item @code{MPFR_RNDA}: round away from zero.
|
|
|
|
@item @code{MPFR_RNDF}: faithful rounding. This feature is currently
|
|
experimental. Specific support for this rounding mode has been added
|
|
to some functions, such as the basic operations (addition, subtraction,
|
|
multiplication, square, division, square root) or when explicitly
|
|
documented. It might also work with other functions, as it is possible that
|
|
they do not need modification in their code; even though a correct behavior
|
|
is not guaranteed yet (corrections were done when failures occurred in the
|
|
test suite, but almost nothing has been checked manually), failures should
|
|
be regarded as bugs and reported, so that they can be fixed.
|
|
|
|
@end itemize
|
|
|
|
Note that, in particular for a result equal to zero, the sign is preserved
|
|
by the rounding operation.
|
|
|
|
@c Note: Because since 2008, IEEE 754 has 2 rounding attributes to nearest,
|
|
@c we must avoid the confusion by being explicit that one uses the even
|
|
@c rounding rule. Moreover, functions that convert a MPFR number to a
|
|
@c string of digits can output in a radix other than 2; in particular
|
|
@c because we do not always recall the rounding rule, we need to be general
|
|
@c enough here.
|
|
The @code{MPFR_RNDN} mode works like roundTiesToEven from the
|
|
IEEE@tie{}754 standard: in case the number to be rounded lies exactly
|
|
in the middle between two consecutive representable numbers, it is
|
|
rounded to the one with an even significand; in radix 2, this means
|
|
that the least significant bit is 0. For example, the number 2.5,
|
|
which is represented by (10.1) in binary, is rounded to @tm{(10.0) = 2}
|
|
with a precision of two bits, and not to @tm{(11.0) = 3}.
|
|
This rule avoids the @dfn{drift} phenomenon mentioned by Knuth in volume 2
|
|
of The Art of Computer Programming (Section@tie{}4.2.2).
|
|
|
|
Note: In particular for a 1-digit precision (in radix 2 or other radices,
|
|
as in conversions to a string of digits), one considers the significands
|
|
associated with the exponent of the number to be rounded. For instance,
|
|
to round the number 95 in radix 10 with a 1-digit precision, one considers
|
|
its truncated 1-digit integer significand 9 and the following integer 10
|
|
(since these are consecutive integers, exactly one of them is even).
|
|
10 is the even significand, so that 95 will be rounded to 100, not to 90.
|
|
|
|
@c VL: There exist multiple equivalent definitions. I tried to give the
|
|
@c most intuitive ones, with the important requirement of being closest
|
|
@c to the input, and to make the definitions similar to each other. For
|
|
@c MPFR_RNDZ and MPFR_RNDA, the use of the absolute value allows one to
|
|
@c emphasize on the "sign symmetry" (there is no ambiguity on the sign
|
|
@c of the result due to the "closest to x" requirement, except for the
|
|
@c sign of 0, but see the note above).
|
|
For the @dfn{directed rounding modes}, a number @var{x} is rounded to
|
|
the number @var{y} that is the closest to @var{x} such that
|
|
@itemize @bullet
|
|
@item @code{MPFR_RNDD}:
|
|
@var{y} is less than or equal to @var{x};
|
|
@item @code{MPFR_RNDU}:
|
|
@var{y} is greater than or equal to @var{x};
|
|
@item @code{MPFR_RNDZ}:
|
|
@GMPabs{@var{y}} is less than or equal to @GMPabs{@var{x}};
|
|
@item @code{MPFR_RNDA}:
|
|
@GMPabs{@var{y}} is greater than or equal to @GMPabs{@var{x}}.
|
|
@end itemize
|
|
|
|
The @code{MPFR_RNDF} mode works as follows: the computed value is either
|
|
that corresponding to @code{MPFR_RNDD} or that corresponding to
|
|
@code{MPFR_RNDU}.
|
|
In particular when those values are identical,
|
|
i.e., when the result of the corresponding operation is exactly
|
|
representable, that exact result is returned.
|
|
Thus, the computed result can take at most two possible values, and
|
|
in absence of underflow/overflow, the corresponding error is strictly
|
|
less than one ulp (unit in the last place) of that result and of the
|
|
exact result.
|
|
For @code{MPFR_RNDF}, the ternary value (defined below) and the inexact flag
|
|
(defined later, as with the other flags) are unspecified, the divide-by-zero
|
|
flag is as with other roundings, and the underflow and overflow flags match
|
|
what would be obtained in the case the computed value is the same as with
|
|
@code{MPFR_RNDD} or @code{MPFR_RNDU}.
|
|
The results may not be reproducible.
|
|
@c Or should one guarantee reproducibility under some condition?
|
|
@c But this may be non-obvious if the caches may have an influence.
|
|
|
|
@anchor{ternary value}@cindex Ternary value
|
|
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 @code{int}, called the
|
|
@dfn{ternary value}. The value stored in the destination variable is
|
|
correctly rounded, i.e., MPFR behaves as if it computed the result with
|
|
an infinite precision, then rounded it to the precision of this variable.
|
|
The input variables are regarded as exact (in particular, their precision
|
|
does not affect the result).
|
|
|
|
As a consequence, in case of a non-zero real rounded result, the error
|
|
on the result is less than or equal to 1/2 ulp (unit in the last place) of
|
|
that result in the rounding to nearest mode, and less than 1 ulp of that
|
|
result in the directed rounding modes (a ulp is the weight of the least
|
|
significant represented bit of the result after rounding).
|
|
@c Since subnormals are not supported, we must take into account the ulp of
|
|
@c the rounded result, not the one of the exact result, for full generality.
|
|
|
|
Unless documented otherwise, functions returning an @code{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 @code{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 @code{int}.
|
|
|
|
Unless documented otherwise, functions returning as result the value @code{1}
|
|
(or any other value specified in this manual)
|
|
for special cases (like @code{acos(0)}) yield an overflow or
|
|
an underflow if that value is not representable in the current exponent range.
|
|
|
|
@node Floating-Point Values on Special Numbers, Exceptions, Rounding, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section Floating-Point Values on Special Numbers
|
|
|
|
This section specifies the floating-point values (of type @code{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 @code{int} of those functions).
|
|
For functions returning several values (like
|
|
@code{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 @ref{Rounding} (but see
|
|
below for the specification of the sign of an exact zero). Otherwise
|
|
the general rules from this section apply unless stated otherwise in
|
|
the description of the MPFR function (@ref{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: @code{mpfr_hypot} on (@mm{+}Inf,0) gives @mm{+}Inf. But
|
|
@code{mpfr_pow} cannot be defined on (1,@mm{+}Inf) using this rule, as
|
|
one can find sequences (@m{x_n,@var{x}_@var{n}},@m{y_n,@var{y}_@var{n}})
|
|
such that @m{x_n,@var{x}_@var{n}} goes to 1, @m{y_n,@var{y}_@var{n}} goes
|
|
to @mm{+}Inf and @m{(x_n)^{y_n},@var{x}_@var{n} to the @var{y}_@var{n}}
|
|
goes to any positive value when @var{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 @mm{+}0 (resp.@: @minus{}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.,
|
|
@code{mpfr_sqrt} and @code{mpfr_log} on @minus{}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., @code{mpfr_log} on @pom{}0
|
|
gives @minus{}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 @mm{+}0 (resp.@: @minus{}0);
|
|
for example, @code{mpfr_sin} on @minus{}0 gives @minus{}0 and
|
|
@code{mpfr_acos} on 1 gives @mm{+}0 (in all rounding modes).
|
|
In the other cases, the sign is specified in the description of the MPFR
|
|
function; for example @code{mpfr_max} on @minus{}0 and @mm{+}0 gives @mm{+}0.
|
|
|
|
When the input point is not in the closure of the domain of the function,
|
|
the result is NaN@. Example: @code{mpfr_sqrt} on @minus{}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 @ref{MPFR Interface}.
|
|
@c Said otherwise, if such a case is not specified, this is a bug, thus
|
|
@c we may change the returned value after documenting it without having
|
|
@c to change the libtool interface number (this would have more drawbacks
|
|
@c that advantages in practice), like for any bug fix.
|
|
Example: @code{mpfr_hypot} on (NaN,0) gives NaN, but @code{mpfr_hypot}
|
|
on (NaN,@mm{+}Inf) gives @mm{+}Inf (as specified in
|
|
@ref{Transcendental Functions}), since for any finite or infinite
|
|
input @var{x}, @code{mpfr_hypot} on (@var{x},@mm{+}Inf) gives @mm{+}Inf.
|
|
|
|
MPFR also tries to follow the specifications of the IEEE@tie{}754 standard
|
|
on special values (IEEE@tie{}754 agree with the above rules in most cases).
|
|
Any difference with IEEE@tie{}754 that is not explicitly mentioned, other
|
|
than those due to the single NaN, is unintended and might be regarded as a
|
|
bug. See also @ref{MPFR and the IEEE 754 Standard}.
|
|
|
|
@node Exceptions, Memory Handling, Floating-Point Values on Special Numbers, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section Exceptions
|
|
|
|
MPFR defines a global (or per-thread) flag for each supported exception.
|
|
A macro evaluating to a power of two is associated with each flag and
|
|
exception, in order to be able to specify a group of flags (or a mask)
|
|
by OR'ing such macros.
|
|
|
|
Flags can be cleared (lowered), set (raised), and tested by functions
|
|
described in @ref{Exception Related Functions}.
|
|
|
|
The supported exceptions are listed below. The macro associated with
|
|
each exception is in parentheses.
|
|
|
|
@itemize @bullet
|
|
|
|
@item Underflow (@code{MPFR_FLAGS_UNDERFLOW}):
|
|
An underflow occurs when the exact result of a function is a non-zero
|
|
real number and the result obtained after the rounding, assuming an
|
|
unbounded exponent range (for the rounding), has an exponent smaller
|
|
than the minimum value of the current exponent range. (In the round-to-nearest
|
|
mode, the halfway case is rounded toward zero.)
|
|
|
|
Note: This is not the single possible definition of the underflow. MPFR chooses
|
|
to consider the underflow @emph{after} rounding. The underflow before rounding
|
|
can also be defined. For instance, consider a function that has the
|
|
exact result @m{7 \times 2^{e-4}, 7 multiplied by two to the power
|
|
@w{@var{e} @minus{} 4}}, where @var{e} is the smallest exponent
|
|
(for a significand between 1/2 and 1),
|
|
with a 2-bit target precision and rounding toward positive infinity.
|
|
The exact result has the exponent @tm{@var{e} @minus{} 1}. With the
|
|
underflow before rounding, such a function call would yield an underflow, as
|
|
@tm{@var{e} @minus{} 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 @m{0.5 \times 2^e, 0.5 times 2 to @var{e}}, which is
|
|
representable in the current exponent range. As a consequence, this will
|
|
not yield an underflow in MPFR@.
|
|
|
|
@item Overflow (@code{MPFR_FLAGS_OVERFLOW}):
|
|
An overflow occurs when the exact result of a function is a non-zero
|
|
real number and the result obtained after the rounding, assuming an
|
|
unbounded exponent range (for the rounding), has an exponent larger
|
|
than the maximum value of the current exponent range. In the round-to-nearest
|
|
mode, the result is infinite.
|
|
Note: unlike the underflow case, there is only one possible definition of
|
|
overflow here.
|
|
|
|
@item Divide-by-zero (@code{MPFR_FLAGS_DIVBY0}):
|
|
An exact infinite result is obtained from finite inputs.
|
|
|
|
@item NaN (@code{MPFR_FLAGS_NAN}):
|
|
A NaN exception occurs when the result of a function is NaN@.
|
|
@c NaN is defined above. So, we don't say anything more.
|
|
|
|
@item Inexact (@code{MPFR_FLAGS_INEXACT}):
|
|
An inexact exception occurs when the result of a function cannot be
|
|
represented exactly and must be rounded.
|
|
|
|
@item Range error (@code{MPFR_FLAGS_ERANGE}):
|
|
A range exception occurs when a function that does not return a MPFR
|
|
number (such as comparisons and conversions to an integer) has an
|
|
invalid result (e.g., an argument is NaN in @code{mpfr_cmp}, or a
|
|
conversion to an integer cannot be represented in the target type).
|
|
|
|
@end itemize
|
|
|
|
Moreover, the group consisting of all the flags is represented by
|
|
the @code{MPFR_FLAGS_ALL} macro (if new flags are added in future
|
|
MPFR versions, they will be added to this macro too).
|
|
|
|
Differences with the ISO C99 standard:
|
|
|
|
@itemize @bullet
|
|
|
|
@item 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 @mm{+} NaN), as if all NaNs were signaling.
|
|
|
|
@item An invalid exception in C corresponds to either a NaN exception or
|
|
a range error in MPFR@.
|
|
|
|
@end itemize
|
|
|
|
@node Memory Handling, Getting the Best Efficiency Out of MPFR, Exceptions, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section Memory Handling
|
|
|
|
MPFR functions may create caches, e.g., when computing constants such
|
|
as @m{\pi,Pi}, either because the user has called a function like
|
|
@code{mpfr_const_pi} directly or because such a function was called
|
|
internally by the MPFR library itself to compute some other function.
|
|
When more precision is needed, the value is automatically recomputed;
|
|
a minimum of 10% increase of the precision is guaranteed to avoid too
|
|
many recomputations.
|
|
|
|
MPFR functions may also create thread-local pools for internal use
|
|
to avoid the cost of memory allocation. The pools can be freed with
|
|
@code{mpfr_free_pool} (but with a default MPFR build, they should not
|
|
take much memory, as the allocation size is limited).
|
|
|
|
At any time, the user can free various caches and pools with
|
|
@code{mpfr_free_cache} and @code{mpfr_free_cache2}. It is strongly advised
|
|
to free thread-local caches before terminating a thread, and all caches
|
|
before exiting when using tools like @samp{valgrind} (to avoid memory leaks
|
|
being reported).
|
|
|
|
MPFR allocates its memory either on the stack (for temporary memory only)
|
|
or with the same allocator as the one configured for GMP:
|
|
@ifinfo
|
|
@pxref{Custom Allocation,,, gmp.info,GNU MP}.
|
|
@end ifinfo
|
|
@ifnotinfo
|
|
see Section ``Custom Allocation'' in @cite{GNU MP}.
|
|
@end ifnotinfo
|
|
This means that the application must make sure that data allocated with the
|
|
current allocator will not be reallocated or freed with a new allocator.
|
|
So, in practice, if an application needs to change the allocator with
|
|
@code{mp_set_memory_functions}, it should first free all data allocated
|
|
with the current allocator: for its own data, with @code{mpfr_clear},
|
|
etc.; for the caches and pools, with @code{mpfr_mp_memory_cleanup} in
|
|
all threads where MPFR is potentially used. This function is currently
|
|
equivalent to @code{mpfr_free_cache}, but @code{mpfr_mp_memory_cleanup}
|
|
is the recommended way in case the allocation method changes in the future
|
|
(for instance, one may choose to allocate the caches for floating-point
|
|
constants with @code{malloc} to avoid freeing them if the allocator
|
|
changes). Developers should also be aware that MPFR may also be used
|
|
indirectly by libraries, so that libraries based on MPFR should provide
|
|
a clean-up function calling @code{mpfr_mp_memory_cleanup} and/or warn
|
|
their users about this issue.
|
|
|
|
@c This is important for shared caches.
|
|
Note: For multithreaded applications, the allocator must be valid in
|
|
all threads where MPFR may be used; data allocated in one thread may
|
|
be reallocated and/or freed in some other thread.
|
|
|
|
MPFR internal data such as flags, the exponent range, the default precision,
|
|
and the default rounding mode are either global (if MPFR has not been
|
|
compiled as thread safe) or per-thread (thread-local storage, TLS)@.
|
|
The initial values of TLS data after a thread is created entirely
|
|
depend on the compiler and thread implementation (MPFR simply does
|
|
a conventional variable initialization, the variables being declared
|
|
with an implementation-defined TLS specifier).
|
|
@c References to TLS specification or documentation can be given here.
|
|
@c Concerning some thread implementations under Unix, POSIX specifies
|
|
@c the thread interface only; TLS variables (with the __thread specifier)
|
|
@c is just a GCC extension. There is currently no clear documentation
|
|
@c about TLS variable initialization.
|
|
|
|
Writers of libraries using MPFR should be aware that the application and/or
|
|
another library used by the application may also use MPFR, so that changing
|
|
the exponent range, the default precision, or the default rounding mode may
|
|
have an effect on this other use of MPFR since these data are not duplicated
|
|
(unless they are in a different thread). Therefore any such value changed in
|
|
a library function should be restored before the function returns (unless
|
|
the purpose of the function is to do such a change). Writers of software
|
|
using MPFR should also be careful when changing such a value if they use
|
|
a library using MPFR (directly or indirectly), in order to make sure that
|
|
such a change is compatible with the library.
|
|
|
|
@node Getting the Best Efficiency Out of MPFR, , Memory Handling, MPFR Basics
|
|
@comment node-name, next, previous, up
|
|
@section Getting the Best Efficiency Out of MPFR
|
|
|
|
Here are a few hints to get the best efficiency out of MPFR:
|
|
|
|
@itemize @bullet
|
|
|
|
@item you should avoid allocating and clearing variables. Reuse variables
|
|
whenever possible, allocate or clear outside of loops, pass
|
|
temporary variables to subroutines instead of allocating them inside
|
|
the subroutines;
|
|
|
|
@item use @code{mpfr_swap} instead of @code{mpfr_set} whenever possible.
|
|
This will avoid copying the significands;
|
|
|
|
@item avoid using MPFR from C++, or make sure your C++ interface does not
|
|
perform unnecessary allocations or copies. Slowdowns of up to a
|
|
factor 15 have been observed on some applications with a C++ interface;
|
|
|
|
@item MPFR functions work in-place: to compute @code{a = a + b} you don't
|
|
need an auxiliary variable, you can directly write
|
|
@code{mpfr_add (a, a, b, ...)}.
|
|
|
|
@end itemize
|
|
|
|
@node MPFR Interface, API Compatibility, MPFR Basics, Top
|
|
@comment node-name, next, previous, up
|
|
@chapter MPFR Interface
|
|
@cindex Floating-point functions
|
|
|
|
The floating-point functions expect arguments of type @code{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 @code{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).
|
|
|
|
@cindex Precision
|
|
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@tie{}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.
|
|
|
|
@cindex Accuracy
|
|
MPFR @emph{does not keep track} of the accuracy of a computation. This is
|
|
left to the user or to a higher layer (for example, the MPFI library for
|
|
interval arithmetic). As a consequence, if two variables are used to store
|
|
only a few significant bits, and their product is stored in a variable with a
|
|
large precision, then MPFR will still compute the result with full precision.
|
|
|
|
The value of the standard C macro @code{errno} may be set to non-zero after
|
|
calling any MPFR function or macro, whether or not there is an error. Except
|
|
when documented, MPFR will not set @code{errno}, but functions called by the
|
|
MPFR code (libc functions, memory allocator, etc.) may do so.
|
|
|
|
@menu
|
|
* Initialization Functions::
|
|
* Assignment Functions::
|
|
* Combined Initialization and Assignment Functions::
|
|
* Conversion Functions::
|
|
* Arithmetic Functions::
|
|
* Comparison Functions::
|
|
* Transcendental Functions::
|
|
* Input and Output Functions::
|
|
* Formatted Output Functions::
|
|
* Integer and Remainder Related Functions::
|
|
* Rounding-Related Functions::
|
|
* Miscellaneous Functions::
|
|
* Exception Related Functions::
|
|
* Memory Handling Functions::
|
|
* Compatibility with MPF::
|
|
* Custom Interface::
|
|
* Internals::
|
|
@end menu
|
|
|
|
@node Initialization Functions, Assignment Functions, MPFR Interface, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Initialization functions
|
|
@section Initialization Functions
|
|
|
|
An @code{mpfr_t} object must be initialized before storing the first value in
|
|
it. The functions @code{mpfr_init} and @code{mpfr_init2} are used for that
|
|
purpose.
|
|
|
|
@deftypefun void mpfr_init2 (mpfr_t @var{x}, mpfr_prec_t @var{prec})
|
|
Initialize @var{x}, set its precision to be @strong{exactly}
|
|
@var{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 @code{mpfr_clear}, between initializations.
|
|
To change the precision of a variable that has already been initialized,
|
|
use @code{mpfr_set_prec} or @code{mpfr_prec_round}; note that if the
|
|
precision is decreased, the unused memory will not be freed, so that
|
|
it may be wise to choose a large enough initial precision in order to
|
|
avoid reallocations.
|
|
The precision @var{prec} must be an integer between @code{MPFR_PREC_MIN} and
|
|
@code{MPFR_PREC_MAX} (otherwise the behavior is undefined).
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_inits2 (mpfr_prec_t @var{prec}, mpfr_t @var{x}, ...)
|
|
Initialize all the @code{mpfr_t} variables of the given variable
|
|
argument @code{va_list}, set their precision to be @strong{exactly}
|
|
@var{prec} bits and their value to NaN@.
|
|
See @code{mpfr_init2} for more details.
|
|
The @code{va_list} is assumed to be composed only of type @code{mpfr_t}
|
|
(or equivalently @code{mpfr_ptr}).
|
|
It begins from @var{x}, and ends when it encounters a null pointer (whose
|
|
type must also be @code{mpfr_ptr}).
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_clear (mpfr_t @var{x})
|
|
Free the space occupied by the significand of
|
|
@var{x}. Make sure to call this function for all
|
|
@code{mpfr_t} variables when you are done with them.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_clears (mpfr_t @var{x}, ...)
|
|
Free the space occupied by all the @code{mpfr_t} variables of the given
|
|
@code{va_list}. See @code{mpfr_clear} for more details.
|
|
The @code{va_list} is assumed to be composed only of type @code{mpfr_t}
|
|
(or equivalently @code{mpfr_ptr}).
|
|
It begins from @var{x}, and ends when it encounters a null pointer (whose
|
|
type must also be @code{mpfr_ptr}).
|
|
@end deftypefun
|
|
|
|
Here is an example of how to use multiple initialization functions
|
|
(since @code{NULL} is not necessarily defined in this context, we use
|
|
@code{(mpfr_ptr) 0} instead, but @code{(mpfr_ptr) NULL} is also correct).
|
|
|
|
@need 400
|
|
@example
|
|
@{
|
|
mpfr_t x, y, z, t;
|
|
mpfr_inits2 (256, x, y, z, t, (mpfr_ptr) 0);
|
|
@dots{}
|
|
mpfr_clears (x, y, z, t, (mpfr_ptr) 0);
|
|
@}
|
|
@end example
|
|
|
|
@deftypefun void mpfr_init (mpfr_t @var{x})
|
|
Initialize @var{x}, set its precision to the default precision,
|
|
and set its value to NaN@.
|
|
The default precision can be changed by a call to @code{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 @code{mpfr_init2}.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_inits (mpfr_t @var{x}, ...)
|
|
Initialize all the @code{mpfr_t} variables of the given @code{va_list},
|
|
set their precision to the default precision and their value to NaN@.
|
|
See @code{mpfr_init} for more details.
|
|
The @code{va_list} is assumed to be composed only of type @code{mpfr_t}
|
|
(or equivalently @code{mpfr_ptr}).
|
|
It begins from @var{x}, and ends when it encounters a null pointer (whose
|
|
type must also be @code{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 @code{mpfr_inits2}.
|
|
@end deftypefun
|
|
|
|
@defmac MPFR_DECL_INIT (@var{name}, @var{prec})
|
|
This macro declares @var{name} as an automatic variable of type @code{mpfr_t},
|
|
initializes it and sets its precision to be @strong{exactly} @var{prec} bits
|
|
and its value to NaN@. @var{name} must be a valid identifier.
|
|
You must use this macro in the declaration section.
|
|
This macro is much faster than using @code{mpfr_init2} but has some
|
|
drawbacks:
|
|
|
|
@itemize @bullet
|
|
|
|
@item You @strong{must not} call @code{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).
|
|
|
|
@item You @strong{cannot} change their precision.
|
|
|
|
@item You @strong{should not} create variables with huge precision with this
|
|
macro.
|
|
|
|
@item Your compiler must support @samp{Non-Constant Initializers} (standard
|
|
in C++ and ISO C99) and @samp{Token Pasting}
|
|
(standard in ISO C90). If @var{prec} is not a constant expression, your
|
|
compiler must support @samp{variable-length automatic arrays} (standard
|
|
in ISO C99). GCC 2.95.3 and above supports all these features.
|
|
If you compile your program with GCC in C90 mode and with @samp{-pedantic},
|
|
you may want to define the @code{MPFR_USE_EXTENSION} macro to avoid warnings
|
|
due to the @code{MPFR_DECL_INIT} implementation.
|
|
|
|
@end itemize
|
|
@end defmac
|
|
|
|
@deftypefun void mpfr_set_default_prec (mpfr_prec_t @var{prec})
|
|
Set the default precision to be @strong{exactly} @var{prec} bits, where
|
|
@var{prec} can be any integer between @code{MPFR_PREC_MIN} and
|
|
@code{MPFR_PREC_MAX}.
|
|
The
|
|
precision of a variable means the number of bits used to store its significand.
|
|
All
|
|
subsequent calls to @code{mpfr_init} or @code{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 @samp{--enable-thread-safe} configure option,
|
|
the default precision is local to each thread. @xref{Memory Handling}, for
|
|
more information.
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_prec_t mpfr_get_default_prec (void)
|
|
Return the current default MPFR precision in bits.
|
|
See the documentation of @code{mpfr_set_default_prec}.
|
|
@end deftypefun
|
|
|
|
@need 2000
|
|
Here is an example on how to initialize floating-point variables:
|
|
|
|
@example
|
|
@{
|
|
mpfr_t x, y;
|
|
mpfr_init (x); /* use default precision */
|
|
mpfr_init2 (y, 256); /* precision @emph{exactly} 256 bits */
|
|
@dots{}
|
|
/* When the program is about to exit, do ... */
|
|
mpfr_clear (x);
|
|
mpfr_clear (y);
|
|
mpfr_free_cache (); /* free the cache for constants like pi */
|
|
@}
|
|
@end example
|
|
|
|
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.
|
|
|
|
@deftypefun void mpfr_set_prec (mpfr_t @var{x}, mpfr_prec_t @var{prec})
|
|
Set the precision of @var{x} to be @strong{exactly} @var{prec} bits,
|
|
and set its value to NaN@.
|
|
The previous value stored in @var{x} is lost. It is equivalent to
|
|
a call to @code{mpfr_clear(@var{x})} followed by a call to
|
|
@code{mpfr_init2(@var{x}, @var{prec})}, but more efficient as no allocation
|
|
is done in case the current allocated space for the significand of @var{x}
|
|
is enough.
|
|
The precision @var{prec} can be any integer between @code{MPFR_PREC_MIN} and
|
|
@code{MPFR_PREC_MAX}.
|
|
In case you want to keep the previous value stored in @var{x},
|
|
use @code{mpfr_prec_round} instead.
|
|
|
|
Warning! You must not use this function if @var{x} was initialized
|
|
with @code{MPFR_DECL_INIT} or with @code{mpfr_custom_init_set}
|
|
(@pxref{Custom Interface}).
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_prec_t mpfr_get_prec (mpfr_t @var{x})
|
|
Return the precision of @var{x}, i.e., the
|
|
number of bits used to store its significand.
|
|
@end deftypefun
|
|
|
|
@node Assignment Functions, Combined Initialization and Assignment Functions, Initialization Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Assignment functions
|
|
@section Assignment Functions
|
|
|
|
These functions assign new values to already initialized floats
|
|
(@pxref{Initialization Functions}).
|
|
|
|
@deftypefun int mpfr_set (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_si (mpfr_t @var{rop}, long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_uj (mpfr_t @var{rop}, uintmax_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_sj (mpfr_t @var{rop}, intmax_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_flt (mpfr_t @var{rop}, float @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_d (mpfr_t @var{rop}, double @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_ld (mpfr_t @var{rop}, long double @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_float128 (mpfr_t @var{rop}, mpfr_float128 @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_decimal64 (mpfr_t @var{rop}, _Decimal64 @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_decimal128 (mpfr_t @var{rop}, _Decimal128 @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_z (mpfr_t @var{rop}, mpz_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_q (mpfr_t @var{rop}, mpq_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_f (mpfr_t @var{rop}, mpf_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set the value of @var{rop} from @var{op}, rounded
|
|
toward the given direction @var{rnd}.
|
|
Note that the input 0 is converted to @mm{+}0 by @code{mpfr_set_ui},
|
|
@code{mpfr_set_si}, @code{mpfr_set_uj}, @code{mpfr_set_sj},
|
|
@code{mpfr_set_z}, @code{mpfr_set_q} and
|
|
@code{mpfr_set_f}, regardless of the rounding mode.
|
|
To use the @code{mpfr_set_float128} function, see @ref{Nomenclature and Types}.
|
|
If the system does not support the IEEE@tie{}754 standard,
|
|
@code{mpfr_set_flt}, @code{mpfr_set_d}, @code{mpfr_set_ld},
|
|
@code{mpfr_set_decimal64} and @code{mpfr_set_decimal128}
|
|
might not preserve the signed zeros
|
|
(and in any case they don't preserve the sign bit of NaN)@.
|
|
The @code{mpfr_set_decimal64} and @code{mpfr_set_decimal128}
|
|
functions are built only with the configure
|
|
option @samp{--enable-decimal-float}, and when the compiler or
|
|
system provides the @samp{_Decimal64} and @samp{_Decimal128} data type;
|
|
to use those functions, one should define the macro
|
|
@code{MPFR_WANT_DECIMAL_FLOATS} before including @file{mpfr.h}.
|
|
@code{mpfr_set_q} might fail if the numerator (or the
|
|
denominator) cannot be represented as a @code{mpfr_t}.
|
|
|
|
For @code{mpfr_set}, the sign of a NaN is propagated in order to mimic the
|
|
IEEE@tie{}754 @code{copy} operation. But contrary to IEEE@tie{}754, the
|
|
NaN flag is set as usual.
|
|
|
|
Note: If you want to store a floating-point constant to a @code{mpfr_t},
|
|
you should use @code{mpfr_set_str} (or one of the MPFR constant functions,
|
|
such as @code{mpfr_const_pi} for @m{\pi,Pi}) instead of
|
|
@code{mpfr_set_flt}, @code{mpfr_set_d},
|
|
@code{mpfr_set_ld}, @code{mpfr_set_decimal64} or
|
|
@code{mpfr_set_decimal128}.
|
|
Otherwise the floating-point constant will be first
|
|
converted into a reduced-precision (e.g., 53-bit) binary
|
|
(or decimal, for @code{mpfr_set_decimal64} and @code{mpfr_set_decimal128})
|
|
number before MPFR can work with it.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_set_ui_2exp (mpfr_t @var{rop}, unsigned long int @var{op}, mpfr_exp_t @var{e}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_si_2exp (mpfr_t @var{rop}, long int @var{op}, mpfr_exp_t @var{e}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_uj_2exp (mpfr_t @var{rop}, uintmax_t @var{op}, intmax_t @var{e}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_sj_2exp (mpfr_t @var{rop}, intmax_t @var{op}, intmax_t @var{e}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_set_z_2exp (mpfr_t @var{rop}, mpz_t @var{op}, mpfr_exp_t @var{e}, mpfr_rnd_t @var{rnd})
|
|
Set the value of @var{rop} from @m{@var{op} \times 2^e, @var{op} multiplied by
|
|
two to the power @var{e}}, rounded toward the given direction @var{rnd}.
|
|
Note that the input 0 is converted to @mm{+}0.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_set_str (mpfr_t @var{rop}, const char *@var{s}, int @var{base}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the string @var{s} in base @var{base},
|
|
rounded in the direction @var{rnd}.
|
|
See the documentation of @code{mpfr_strtofr} for a detailed description
|
|
of @var{base} (with its special value 0) and the valid string formats.
|
|
Contrary to @code{mpfr_strtofr}, @code{mpfr_set_str} requires the
|
|
@emph{whole} string to represent a valid floating-point number.
|
|
@c Additionally, special values
|
|
@c @samp{@@NaN@@}, @samp{@@Inf@@}, @samp{+@@Inf@@} and @samp{-@@Inf@@},
|
|
@c all case insensitive, without leading whitespace and possibly followed by
|
|
@c other characters, are accepted too (it may change).
|
|
|
|
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 @var{base}; otherwise it is @minus{}1, and
|
|
@var{rop} may have changed (users interested in the @ref{ternary value}
|
|
should use @code{mpfr_strtofr} instead).
|
|
|
|
Note: it is preferable to use @code{mpfr_strtofr} if one wants to distinguish
|
|
between an infinite @var{rop} value coming from an infinite @var{s} or from
|
|
an overflow.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_strtofr (mpfr_t @var{rop}, const char *@var{nptr}, char **@var{endptr}, int @var{base}, mpfr_rnd_t @var{rnd})
|
|
Read a floating-point number from a string @var{nptr} in base @var{base},
|
|
rounded in the direction @var{rnd}; @var{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 @var{nptr} starts with valid data, the
|
|
result is stored in @var{rop} and @code{*@var{endptr}} points to the
|
|
character just after the valid data (if @var{endptr} is not a null pointer);
|
|
otherwise @var{rop} is set to zero (for consistency with @code{strtod})
|
|
and the value of @var{nptr} is stored
|
|
in the location referenced by @var{endptr} (if @var{endptr} is not a null
|
|
pointer). The usual ternary value is returned.
|
|
|
|
Parsing follows the standard C @code{strtod} function with some extensions.
|
|
After optional leading whitespace, one has a subject sequence consisting of an
|
|
optional sign (@samp{+} or @samp{-}), and either numeric data or special
|
|
data. The subject sequence is defined as the longest initial subsequence of
|
|
the input string, starting with the first non-whitespace character, that is of
|
|
the expected form.
|
|
|
|
The form of numeric data is a non-empty sequence of significand digits with
|
|
an optional decimal-point character, and an optional exponent consisting of
|
|
an exponent prefix followed by an optional sign and a non-empty sequence of
|
|
decimal digits. A significand digit is either a decimal digit or a Latin
|
|
letter (62 possible characters), with @samp{A} = 10, @samp{B} = 11, @dots{},
|
|
@samp{Z} = 35; case is ignored in bases less than or equal to 36, in bases
|
|
larger than 36, @samp{a} = 36, @samp{b} = 37, @dots{}, @samp{z} = 61.
|
|
The value of a significand digit must be strictly less than the base. The
|
|
decimal-point character can be either the one defined by the current locale
|
|
or the period (the first one is accepted for consistency with the C standard
|
|
and the practice, the second one is accepted to allow the programmer to
|
|
provide MPFR numbers from strings in a way that does not depend on the
|
|
current locale).
|
|
The exponent prefix can be @samp{e} or @samp{E} for bases up to 10, or
|
|
@samp{@@} in any base; it indicates a multiplication by a power of the
|
|
base. In bases 2 and 16, the exponent prefix can also be @samp{p} or @samp{P},
|
|
in which case the exponent, called @emph{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 @samp{1p2} represents 4 whereas
|
|
@samp{1@@2} represents 256. The value of an exponent is always written in
|
|
base 10.
|
|
|
|
If the argument @var{base} is 0, then the base is automatically detected
|
|
as follows. If the significand starts with @samp{0b} or @samp{0B}, base 2
|
|
is assumed. If the significand starts with @samp{0x} or @samp{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 @samp{0b}, @samp{0B}, @samp{0x} or @samp{0X}
|
|
is not followed by a binary/hexadecimal digit, then the subject sequence
|
|
stops at the character @samp{0}, thus 0 is read.
|
|
|
|
Special data (for infinities and NaN) can be @samp{@@inf@@} or
|
|
@samp{@@nan@@(n-char-sequence-opt)}, and if @tm{@var{base} @le{} 16},
|
|
it can also be @samp{infinity}, @samp{inf}, @samp{nan} or
|
|
@samp{nan(n-char-sequence-opt)}, all case insensitive with the rules of
|
|
the C locale.
|
|
An @samp{n-char-sequence-opt} is a possibly empty string containing only digits,
|
|
Latin letters and the underscore (0, 1, 2, @dots{}, 9, a, b, @dots{}, z,
|
|
A, B, @dots{}, Z, _). Note: one has an optional sign for all data, even
|
|
NaN@.
|
|
For example, @samp{-@@nAn@@(This_Is_Not_17)} is a valid representation for NaN
|
|
in base 17.
|
|
|
|
@c Note about the "case insensitive with the rules of the C locale":
|
|
@c The reason is that in Turkish locales on some systems, the uppercase
|
|
@c version of "i" is an "I" with a dot above, and the lowercase version
|
|
@c of "I" is a dotless "i". We do not follow these rules here.
|
|
@c See README.dev for additional information.
|
|
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_set_nan (mpfr_t @var{x})
|
|
@deftypefunx void mpfr_set_inf (mpfr_t @var{x}, int @var{sign})
|
|
@deftypefunx void mpfr_set_zero (mpfr_t @var{x}, int @var{sign})
|
|
Set the variable @var{x} to NaN (Not-a-Number), infinity or zero respectively.
|
|
In @code{mpfr_set_inf} or @code{mpfr_set_zero}, @var{x} is set to positive
|
|
infinity (@mm{+}Inf) or positive zero (@mm{+}0) iff @var{sign} is non-negative;
|
|
in @code{mpfr_set_nan}, the sign bit of the result is unspecified.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_swap (mpfr_t @var{x}, mpfr_t @var{y})
|
|
Swap the structures pointed to by @var{x} and @var{y}. In particular,
|
|
the values are exchanged without rounding (this may be different from
|
|
three @code{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 @var{x}
|
|
and/or @var{y} does not permit it. This is the case when @var{x} and/or
|
|
@var{y} were declared and initialized with @code{MPFR_DECL_INIT}, and
|
|
possibly with @code{mpfr_custom_init_set} (@pxref{Custom Interface}).
|
|
@end deftypefun
|
|
|
|
@node Combined Initialization and Assignment Functions, Conversion Functions, Assignment Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Combined initialization and assignment functions
|
|
@section Combined Initialization and Assignment Functions
|
|
|
|
@deftypefn Macro int mpfr_init_set (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefnx Macro int mpfr_init_set_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefnx Macro int mpfr_init_set_si (mpfr_t @var{rop}, long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefnx Macro int mpfr_init_set_d (mpfr_t @var{rop}, double @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefnx Macro int mpfr_init_set_ld (mpfr_t @var{rop}, long double @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefnx Macro int mpfr_init_set_z (mpfr_t @var{rop}, mpz_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefnx Macro int mpfr_init_set_q (mpfr_t @var{rop}, mpq_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefnx Macro int mpfr_init_set_f (mpfr_t @var{rop}, mpf_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Initialize @var{rop} and set its value from @var{op}, rounded in the direction
|
|
@var{rnd}.
|
|
The precision of @var{rop} will be taken from the active default precision,
|
|
as set by @code{mpfr_set_default_prec}.
|
|
@end deftypefn
|
|
|
|
@deftypefun int mpfr_init_set_str (mpfr_t @var{x}, const char *@var{s}, int @var{base}, mpfr_rnd_t @var{rnd})
|
|
Initialize @var{x} and set its value from
|
|
the string @var{s} in base @var{base},
|
|
rounded in the direction @var{rnd}.
|
|
See @code{mpfr_set_str}.
|
|
@end deftypefun
|
|
|
|
@node Conversion Functions, Arithmetic Functions, Combined Initialization and Assignment Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Conversion functions
|
|
@section Conversion Functions
|
|
|
|
@deftypefun float mpfr_get_flt (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx double mpfr_get_d (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx {long double} mpfr_get_ld (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx {mpfr_float128} mpfr_get_float128 (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx _Decimal64 mpfr_get_decimal64 (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx _Decimal128 mpfr_get_decimal128 (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Convert @var{op} to a @code{float} (respectively @code{double},
|
|
@code{long double}, @code{_Decimal64}, or @code{_Decimal128})
|
|
using the rounding mode @var{rnd}.
|
|
If @var{op} is NaN, some NaN (either quiet or signaling) or the result
|
|
of 0.0/0.0 is returned (the sign bit is not preserved).
|
|
If @var{op} is @pom{}Inf, an infinity of the same
|
|
sign or the result of @pom{}1.0/0.0 is returned. If @var{op} is zero, these
|
|
functions return a zero, trying to preserve its sign, if possible.
|
|
The @code{mpfr_get_float128}, @code{mpfr_get_decimal64} and
|
|
@code{mpfr_get_decimal128} functions are built
|
|
only under some conditions: see the documentation of @code{mpfr_set_float128},
|
|
@code{mpfr_set_decimal64} and @code{mpfr_set_decimal128} respectively.
|
|
@end deftypefun
|
|
|
|
@deftypefun {long int} mpfr_get_si (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx {unsigned long int} mpfr_get_ui (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx intmax_t mpfr_get_sj (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx uintmax_t mpfr_get_uj (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Convert @var{op} to a @code{long int}, an @code{unsigned long int},
|
|
an @code{intmax_t} or an @code{uintmax_t} (respectively) after rounding
|
|
it to an integer with respect to @var{rnd}.
|
|
If @var{op} is NaN, 0 is returned and the @emph{erange} flag is set.
|
|
If @var{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 @emph{erange} flag is set too.
|
|
When there is no such range error, if the return value differs from
|
|
@var{op}, i.e., if @var{op} is not an integer, the inexact flag is set.
|
|
@c For the flag specification, we simply followed the historical behavior.
|
|
@c See <https://sympa.inria.fr/sympa/arc/mpfr/2015-07/msg00010.html>.
|
|
@c In summary, this was a consequence of the use of mpfr_rint in case of
|
|
@c no range error. IEEE 754 specifies two kinds of operations: with
|
|
@c inexact flag either affected or not. Here this is the former kind of
|
|
@c operations. The easiest way to get the latter kind of operations is to
|
|
@c save the status of the inexact flag just before the call and restore it
|
|
@c just after (but in user code, there may be other possibilities); this
|
|
@c can be done with mpfr_inexflag_p and mpfr_set_inexflag (knowing that
|
|
@c the inexact flag can only be set, never cleared). A more readable way
|
|
@c with MPFR 4.0+ is to use mpfr_flags_test or mpfr_flags_save to save
|
|
@c the status of the inexact flag, and mpfr_flags_restore to restore it.
|
|
@c The mpfr_get_z function follows the same specification.
|
|
See also @code{mpfr_fits_slong_p}, @code{mpfr_fits_ulong_p},
|
|
@code{mpfr_fits_intmax_p} and @code{mpfr_fits_uintmax_p}.
|
|
@end deftypefun
|
|
|
|
@deftypefun double mpfr_get_d_2exp (long *@var{exp}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx {long double} mpfr_get_ld_2exp (long *@var{exp}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Return @var{d} and set @var{exp}
|
|
(formally, the value pointed to by @var{exp})
|
|
such that @tm{0.5 @le{} @GMPabs{@var{d}} < 1}
|
|
and @m{@var{d}\times 2^{@var{exp}}, @var{d} times 2 raised to @var{exp}} equals
|
|
@var{op} rounded to double (resp.@: long double)
|
|
precision, using the given rounding mode.
|
|
@comment See ISO C standard, frexp function.
|
|
If @var{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
|
|
@var{exp} is set to 0.
|
|
If @var{op} is NaN or an infinity, then the corresponding double precision
|
|
(resp.@: long-double precision)
|
|
value is returned, and @var{exp} is undefined.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_frexp (mpfr_exp_t *@var{exp}, mpfr_t @var{y}, mpfr_t @var{x}, mpfr_rnd_t @var{rnd})
|
|
Set @var{exp}
|
|
(formally, the value pointed to by @var{exp}) and @var{y}
|
|
such that @tm{0.5 @le{} @GMPabs{@var{y}} < 1}
|
|
and @m{@var{y}\times 2^{@var{exp}}, @var{y} times 2 raised to @var{exp}} equals
|
|
@var{x} rounded to the precision of @var{y}, using the given rounding mode.
|
|
@comment See ISO C standard, frexp function.
|
|
If @var{x} is zero, then @var{y} is set to a zero of the same sign and
|
|
@var{exp} is set to 0.
|
|
If @var{x} is NaN or an infinity, then @var{y} is set to the same value
|
|
and @var{exp} is undefined.
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_exp_t mpfr_get_z_2exp (mpz_t @var{rop}, mpfr_t @var{op})
|
|
Put the scaled significand of @var{op} (regarded as an integer, with the
|
|
precision of @var{op}) into @var{rop}, and return the exponent @var{exp}
|
|
(which may be outside the current exponent range) such that @var{op}
|
|
exactly equals @m{@var{rop} \times 2^{@var{exp}},@var{rop} times 2 raised
|
|
to the power @var{exp}}.
|
|
If @var{op} is zero, the minimal exponent @var{emin} is returned.
|
|
If @var{op} is NaN or an infinity, the @emph{erange} flag is set, @var{rop}
|
|
is set to 0, and the minimal exponent @var{emin} is returned.
|
|
The returned exponent may be less than the minimal exponent @var{emin}
|
|
of MPFR numbers in the current exponent range; in case the exponent is
|
|
not representable in the @code{mpfr_exp_t} type, the @emph{erange} flag
|
|
is set and the minimal value of the @code{mpfr_exp_t} type is returned.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_get_z (mpz_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Convert @var{op} to a @code{mpz_t}, after rounding it with respect to
|
|
@var{rnd}. If @var{op} is NaN or an infinity, the @emph{erange} flag is
|
|
set, @var{rop} is set to 0, and 0 is returned. Otherwise the return
|
|
value is zero when @var{rop} is equal to @var{op} (i.e., when @var{op}
|
|
is an integer), positive when it is greater than @var{op}, and negative
|
|
when it is smaller than @var{op}; moreover, if @var{rop} differs from
|
|
@var{op}, i.e., if @var{op} is not an integer, the inexact flag is set.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_get_q (mpq_t @var{rop}, mpfr_t @var{op})
|
|
Convert @var{op} to a @code{mpq_t}.
|
|
If @var{op} is NaN or an infinity, the @emph{erange} flag is
|
|
set and @var{rop} is set to 0. Otherwise the conversion is always exact.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_get_f (mpf_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Convert @var{op} to a @code{mpf_t}, after rounding it with respect to
|
|
@var{rnd}.
|
|
The @emph{erange} flag is set if @var{op} is NaN or an infinity, which
|
|
do not exist in MPF@. If @var{op} is NaN, then @var{rop} is undefined.
|
|
If @var{op} is @mm{+}Inf (resp.@: @minus{}Inf), then @var{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 @var{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.
|
|
@end deftypefun
|
|
|
|
@anchor{mpfr_get_str_ndigits}
|
|
@deftypefun {size_t} mpfr_get_str_ndigits (int @var{b}, mpfr_prec_t @var{p})
|
|
Return the minimal integer @tm{m} such that any number
|
|
of @var{p} bits, when output with @tm{m} digits in radix @var{b} with
|
|
rounding to nearest, can be recovered exactly when read again,
|
|
still with rounding to nearest.
|
|
More precisely, we have
|
|
@m{m = 1 + \left\lceil @var{p} {\log 2 \over \log @var{b}} \right\rceil,
|
|
m = 1 + ceil(@var{p} times log(2)/log(@var{b}))},
|
|
with @var{p} replaced by @tm{@var{p} @minus{} 1} if @var{b} is a power of 2.
|
|
|
|
The argument @var{b} must be in the range 2 to 62; this is the range of bases
|
|
supported by the @code{mpfr_get_str} function. Note that contrary to the base
|
|
argument of this function, negative values are not accepted.
|
|
@end deftypefun
|
|
|
|
@anchor{mpfr_get_str}
|
|
@deftypefun {char *} mpfr_get_str (char *@var{str}, mpfr_exp_t *@var{expptr}, int @var{base}, size_t @var{n}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Convert @var{op} to a string of digits in base @GMPabs{@var{base}},
|
|
with rounding in the direction @var{rnd}, where @var{n} is either zero
|
|
(see below) or the number of significant digits output in the string.
|
|
The argument @var{base} may vary from 2 to 62 or from @minus{}2 to @minus{}36;
|
|
otherwise the function does nothing and immediately returns a null pointer.
|
|
|
|
For @var{base} in the range 2 to 36, digits and lower-case letters are used;
|
|
for @minus{}2 to @minus{}36, digits and upper-case letters are used; for
|
|
37 to 62, digits, upper-case letters, and lower-case letters, in that
|
|
significance order, are used. Warning! This implies that for
|
|
@tm{@var{base} > 10}, the successor of the digit 9 depends on @var{base}.
|
|
This choice has been done for compatibility with GMP's @code{mpf_get_str}
|
|
function. Users who wish a more consistent behavior should write a simple
|
|
wrapper.
|
|
|
|
If the input is NaN, then the returned string is @samp{@@NaN@@} and the
|
|
NaN flag is set. If the input is @mm{+}Inf (resp.@: @minus{}Inf), then the
|
|
returned string is @samp{@@Inf@@} (resp.@: @samp{-@@Inf@@}).
|
|
|
|
If the input number is a finite number, the exponent is written through
|
|
the pointer @var{expptr} (for input 0, the current minimal exponent is
|
|
written); the type @code{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 @minus{}3.1416 would
|
|
be returned as @samp{-31416} in the string and 1 written at @var{expptr}.
|
|
If @var{rnd} is to nearest, and @var{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 @var{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,
|
|
@c The following example duplicates (16) and a half
|
|
@c (36) and a half is rounded to (40) which is 28 in decimal,
|
|
and (26) and a half is rounded to (26), which is 20 in decimal.
|
|
|
|
If @var{n} is zero, the number of digits of the significand is taken as
|
|
@code{mpfr_get_str_ndigits (@var{base}, @var{p})}, where @var{p} is the
|
|
precision of @var{op} (@pxref{mpfr_get_str_ndigits}).
|
|
|
|
If @var{str} is a null pointer, space for the significand is allocated using
|
|
the allocation function (@pxref{Memory Handling}) and a pointer to the string
|
|
is returned (unless the base is invalid).
|
|
To free the returned string, you must use @code{mpfr_free_str}.
|
|
|
|
If @var{str} is not a null pointer, it should point to a block of storage
|
|
large enough for the significand. A safe block size (sufficient for any value)
|
|
is @tm{@max{}(@var{n} + 2@comma{} 7)} if @var{n} is not zero; if @var{n} is
|
|
zero, replace it by @code{mpfr_get_str_ndigits (@var{base}, @var{p})}, where
|
|
@var{p} is the precision of @var{op}, as mentioned above.
|
|
The extra two bytes are
|
|
for a possible minus sign, and for the terminating null character, and the
|
|
value 7 accounts for @samp{-@@Inf@@} plus the terminating null character.
|
|
The pointer to the string @var{str} is returned (unless the base is invalid).
|
|
|
|
Like in usual functions, the inexact flag is set iff the result is inexact.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_free_str (char *@var{str})
|
|
Free a string allocated by @code{mpfr_get_str} using the unallocation
|
|
function (@pxref{Memory Handling}).
|
|
The block is assumed to be @code{strlen(@var{str})+1} bytes.
|
|
|
|
Note: It is allowed to modify the string allocated by @code{mpfr_get_str};
|
|
but when @code{mpfr_free_str} is called, its length must be the same as
|
|
the original one (unless it is guaranteed that the unallocation function
|
|
ignores its size parameter).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_fits_ulong_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fits_slong_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fits_uint_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fits_sint_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fits_ushort_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fits_sshort_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fits_uintmax_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fits_intmax_p (mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Return non-zero if @var{op} would fit in the respective C data type,
|
|
respectively @code{unsigned long int}, @code{long int}, @code{unsigned int},
|
|
@code{int}, @code{unsigned short}, @code{short}, @code{uintmax_t},
|
|
@code{intmax_t}, when rounded to an integer in the direction @var{rnd}.
|
|
For instance, with the @code{MPFR_RNDU} rounding mode on @minus{}0.5,
|
|
the result will be non-zero for all these functions.
|
|
For @code{MPFR_RNDF}, those functions return non-zero when it is guaranteed
|
|
that the corresponding conversion function (for example @code{mpfr_get_ui}
|
|
for @code{mpfr_fits_ulong_p}), when called with faithful rounding,
|
|
will always return a number that is representable in the corresponding type.
|
|
As a consequence, for @code{MPFR_RNDF}, @code{mpfr_fits_ulong_p} will return
|
|
non-zero for a non-negative number less than or equal to @code{ULONG_MAX}.
|
|
@end deftypefun
|
|
|
|
@node Arithmetic Functions, Comparison Functions, Conversion Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Arithmetic functions
|
|
@section Arithmetic Functions
|
|
|
|
@deftypefun int mpfr_add (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_add_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_add_si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_add_d (mpfr_t @var{rop}, mpfr_t @var{op1}, double @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_add_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_add_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @tm{@var{op1} + @var{op2}} rounded in the direction
|
|
@var{rnd}. The IEEE@tie{}754 rules are used, in particular for signed zeros.
|
|
But for types having no signed zeros, 0 is considered unsigned
|
|
(i.e., @tm{(+0) + 0 = (+0)} and @tm{(@minus{}0) + 0 = (@minus{}0)}).
|
|
The @code{mpfr_add_d} function assumes that the radix of the @code{double} type
|
|
is a power of 2, with a precision at most that declared by the C implementation
|
|
(macro @code{IEEE_DBL_MANT_DIG}, and if not defined 53 bits).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sub (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_ui_sub (mpfr_t @var{rop}, unsigned long int @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sub_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_si_sub (mpfr_t @var{rop}, long int @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sub_si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_d_sub (mpfr_t @var{rop}, double @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sub_d (mpfr_t @var{rop}, mpfr_t @var{op1}, double @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_z_sub (mpfr_t @var{rop}, mpz_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sub_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sub_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @tm{@var{op1} @minus{} @var{op2}} rounded in the direction
|
|
@var{rnd}. The IEEE@tie{}754 rules are used, in particular for signed zeros.
|
|
But for types having no signed zeros, 0 is considered unsigned
|
|
(i.e., @tm{(+0) @minus{} 0 = (+0)}, @tm{(@minus{}0) @minus{} 0 = (@minus{}0)},
|
|
@tm{0 @minus{} (+0) = (@minus{}0)} and @tm{0 @minus{} (@minus{}0) = (+0)}).
|
|
The same restrictions as for @code{mpfr_add_d} apply to @code{mpfr_d_sub}
|
|
and @code{mpfr_sub_d}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_mul (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_mul_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_mul_si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_mul_d (mpfr_t @var{rop}, mpfr_t @var{op1}, double @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_mul_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_mul_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @tm{@var{op1} @GMPtimes{} @var{op2}} rounded in the
|
|
direction @var{rnd}.
|
|
When a result is zero, its sign is the product of the signs of the operands
|
|
(for types having no signed zeros, 0 is considered positive).
|
|
The same restrictions as for @code{mpfr_add_d} apply to @code{mpfr_mul_d}.
|
|
Note: when @var{op1} and @var{op2} are equal, use @code{mpfr_sqr} instead of
|
|
@code{mpfr_mul} for better efficiency.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sqr (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{@var{op}^{2}, the square of @var{op}}
|
|
rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_div (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_ui_div (mpfr_t @var{rop}, unsigned long int @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_div_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_si_div (mpfr_t @var{rop}, long int @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_div_si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_d_div (mpfr_t @var{rop}, double @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_div_d (mpfr_t @var{rop}, mpfr_t @var{op1}, double @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_div_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_div_q (mpfr_t @var{rop}, mpfr_t @var{op1}, mpq_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @tm{@var{op1} / @var{op2}} rounded in the direction @var{rnd}.
|
|
When a result is zero, its sign is the product of the signs of the operands.
|
|
For types having no signed zeros, 0 is considered positive; but note that if
|
|
@var{op1} is non-zero and @var{op2} is zero, the result might change from
|
|
@pom{}Inf to NaN in future MPFR versions if there is an opposite decision
|
|
on the IEEE@tie{}754 side.
|
|
The same restrictions as for @code{mpfr_add_d} apply to @code{mpfr_d_div}
|
|
and @code{mpfr_div_d}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sqrt (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sqrt_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{\sqrt{@var{op}}, the square root of @var{op}}
|
|
rounded in the direction @var{rnd}. Set @var{rop} to @minus{}0 if
|
|
@var{op} is @minus{}0, to be consistent with the IEEE@tie{}754 standard
|
|
(thus this differs from @code{mpfr_rootn_ui} and @code{mpfr_rootn_si}
|
|
with @tm{@var{n} = 2}).
|
|
Set @var{rop} to NaN if @var{op} is negative.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_rec_sqrt (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{1/\sqrt{@var{op}}, the reciprocal square root of @var{op}}
|
|
rounded in the direction @var{rnd}. Set @var{rop} to @mm{+}Inf if @var{op} is
|
|
@pom{}0, @mm{+}0 if @var{op} is @mm{+}Inf, and NaN if @var{op} is negative.
|
|
Warning! Therefore the result on @minus{}0 is different from the one of the
|
|
rSqrt function recommended by the IEEE@tie{}754 standard (Section@tie{}9.2.1),
|
|
which is @minus{}Inf instead of @mm{+}Inf. However, @code{mpfr_rec_sqrt} is
|
|
equivalent to @code{mpfr_rootn_si} with @tm{@var{n} = @minus{}2}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_cbrt (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_rootn_ui (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{n}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_rootn_si (mpfr_t @var{rop}, mpfr_t @var{op}, long int @var{n}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the @var{n}th root (with @tm{@var{n} = 3}, the cubic root,
|
|
for @code{mpfr_cbrt}) of @var{op} rounded in the direction @var{rnd}.
|
|
For @tm{@var{n} = 0}, set @var{rop} to NaN@.
|
|
For @var{n} odd (resp.@: even) and @var{op} negative (including @minus{}Inf),
|
|
set @var{rop} to a negative number (resp.@: NaN)@.
|
|
If @var{op} is zero, set @var{rop} to zero with the sign obtained by the
|
|
usual limit rules, i.e., the same sign as @var{op} if @var{n} is odd, and
|
|
positive if @var{n} is even.
|
|
|
|
These functions agree with the rootn operation of the IEEE@tie{}754 standard.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_root (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{n}, mpfr_rnd_t @var{rnd})
|
|
This function is the same as @code{mpfr_rootn_ui} except when @var{op}
|
|
is @minus{}0 and @var{n} is even: the result is @minus{}0 instead of @mm{+}0
|
|
(the reason was to be consistent with @code{mpfr_sqrt}). Said otherwise,
|
|
if @var{op} is zero, set @var{rop} to @var{op}.
|
|
|
|
This function predates IEEE@tie{}754-2008, where rootn was introduced, and
|
|
behaves differently from the IEEE@tie{}754 rootn operation. It is marked as
|
|
deprecated and will be removed in a future release.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_neg (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_abs (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @tm{@minus{}@var{op}} and the absolute value of @var{op}
|
|
respectively, rounded in the direction @var{rnd}.
|
|
Just changes or adjusts
|
|
the sign if @var{rop} and @var{op} are the same variable,
|
|
otherwise a rounding might occur if the precision of @var{rop} is less than
|
|
that of @var{op}.
|
|
|
|
The sign rule also applies to NaN in order to mimic the IEEE@tie{}754
|
|
@code{negate} and @code{abs} operations, i.e., for @code{mpfr_neg}, the
|
|
sign is reversed, and for @code{mpfr_abs}, the sign is set to positive.
|
|
But contrary to IEEE@tie{}754, the NaN flag is set as usual.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_dim (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the positive difference of @var{op1} and @var{op2}, i.e.,
|
|
@tm{@var{op1} @minus{} @var{op2}} rounded in the direction @var{rnd}
|
|
if @tm{@var{op1} > @var{op2}}, @mm{+}0 if @tm{@var{op1} @le{} @var{op2}},
|
|
and NaN if @var{op1} or @var{op2} is NaN@.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_mul_2ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_mul_2si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{@var{op1} \times 2^{@var{op2}}, @var{op1} times 2 raised
|
|
to @var{op2}}
|
|
rounded in the direction @var{rnd}. Just increases the exponent by @var{op2}
|
|
when @var{rop} and @var{op1} are identical.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_div_2ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_div_2si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{@var{op1}/2^{@var{op2}}, @var{op1} divided by 2 raised
|
|
to @var{op2}}
|
|
rounded in the direction @var{rnd}. Just decreases the exponent by @var{op2}
|
|
when @var{rop} and @var{op1} are identical.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_fac_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the factorial of @var{op}, rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_fma (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_t @var{op3}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fms (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_t @var{op3}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @tm{(@var{op1} @GMPtimes{} @var{op2}) + @var{op3}}
|
|
(resp.@: @tm{(@var{op1} @GMPtimes{} @var{op2}) @minus{} @var{op3}})
|
|
rounded in the direction @var{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.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_fmma (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_t @var{op3}, mpfr_t @var{op4}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fmms (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_t @var{op3}, mpfr_t @var{op4}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to
|
|
@tm{(@var{op1} @GMPtimes{} @var{op2}) + (@var{op3} @GMPtimes{} @var{op4})}
|
|
(resp.@:
|
|
@tm{(@var{op1} @GMPtimes{} @var{op2}) @minus{} (@var{op3} @GMPtimes{} @var{op4})})
|
|
rounded in the direction @var{rnd}.
|
|
In case the computation of @tm{@var{op1} @GMPtimes{} @var{op2}} overflows or
|
|
underflows (or that of @tm{@var{op3} @GMPtimes{} @var{op4}}), the result
|
|
@var{rop} is computed as if the two intermediate products were computed with
|
|
rounding toward zero.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_hypot (mpfr_t @var{rop}, mpfr_t @var{x}, mpfr_t @var{y}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the Euclidean norm of @var{x} and @var{y}, i.e.,
|
|
@m{\sqrt{@var{x}^2+@var{y}^2},the square root of the sum of the squares
|
|
of @var{x} and @var{y}}, rounded in the direction @var{rnd}.
|
|
Special values are handled as described in the ISO C99 (Section@tie{}F.9.4.3)
|
|
and IEEE@tie{}754 (Section@tie{}9.2.1) standards:
|
|
If @var{x} or @var{y} is an infinity, then @mm{+}Inf is returned in @var{rop},
|
|
even if the other number is NaN@.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sum (mpfr_t @var{rop}, const mpfr_ptr @var{tab}@fptt{[]}, unsigned long int @var{n}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the sum of all elements of @var{tab}, whose size is @var{n},
|
|
correctly rounded in the direction @var{rnd}. Warning: for efficiency reasons,
|
|
@var{tab} is an array of pointers
|
|
to @code{mpfr_t}, not an array of @code{mpfr_t}.
|
|
If @tm{@var{n} = 0}, then the result is @mm{+}0, and if @tm{@var{n} = 1},
|
|
then the function is equivalent to @code{mpfr_set}.
|
|
For the special exact cases, the result is the same as the one obtained
|
|
with a succession of additions (@code{mpfr_add}) in infinite precision.
|
|
In particular, if the result is an exact zero and @tm{@var{n} @ge{} 1}:
|
|
@itemize @bullet
|
|
@item if all the inputs have the same sign (i.e., all @mm{+}0 or
|
|
all @minus{}0), then the result has the same sign as the inputs;
|
|
@item otherwise, either because all inputs are zeros with at least
|
|
a @mm{+}0 and a @minus{}0, or because some inputs are non-zero
|
|
(but they globally cancel), the result is @mm{+}0, except for the
|
|
@code{MPFR_RNDD} rounding mode, where it is @minus{}0.
|
|
@end itemize
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_dot (mpfr_t @var{rop}, const mpfr_ptr @var{a}@fptt{[]}, const mpfr_ptr @var{b}@fptt{[]}, unsigned long int @var{n}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the dot product of elements of @var{a} by those of @var{b},
|
|
whose common size is @var{n},
|
|
correctly rounded in the direction @var{rnd}. Warning: for efficiency reasons,
|
|
@var{a} and @var{b} are arrays of pointers to @code{mpfr_t}.
|
|
This function is experimental, and does not yet handle intermediate overflows
|
|
and underflows.
|
|
@end deftypefun
|
|
|
|
For the power functions (with an integer exponent or not), see @ref{mpfr_pow}
|
|
in @ref{Transcendental Functions}.
|
|
|
|
@node Comparison Functions, Transcendental Functions, Arithmetic Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Comparison functions
|
|
@section Comparison Functions
|
|
|
|
@deftypefun int mpfr_cmp (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
@deftypefunx int mpfr_cmp_ui (mpfr_t @var{op1}, unsigned long int @var{op2})
|
|
@deftypefunx int mpfr_cmp_si (mpfr_t @var{op1}, long int @var{op2})
|
|
@deftypefunx int mpfr_cmp_d (mpfr_t @var{op1}, double @var{op2})
|
|
@deftypefunx int mpfr_cmp_ld (mpfr_t @var{op1}, long double @var{op2})
|
|
@deftypefunx int mpfr_cmp_z (mpfr_t @var{op1}, mpz_t @var{op2})
|
|
@deftypefunx int mpfr_cmp_q (mpfr_t @var{op1}, mpq_t @var{op2})
|
|
@deftypefunx int mpfr_cmp_f (mpfr_t @var{op1}, mpf_t @var{op2})
|
|
Compare @var{op1} and @var{op2}.
|
|
Return a positive value if @tm{@var{op1} > @var{op2}},
|
|
zero if @tm{@var{op1} = @var{op2}}, and
|
|
a negative value if @tm{@var{op1} < @var{op2}}.
|
|
Both @var{op1} and @var{op2} are considered to their full own precision,
|
|
which may differ.
|
|
If one of the operands is NaN, set the @emph{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., @code{mpfr_equal_p} for the equality) described
|
|
below; they behave like the IEEE@tie{}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).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_cmp_ui_2exp (mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_exp_t @var{e})
|
|
@deftypefunx int mpfr_cmp_si_2exp (mpfr_t @var{op1}, long int @var{op2}, mpfr_exp_t @var{e})
|
|
Compare @var{op1} and @m{@var{op2} \times 2^{@var{e}}, @var{op2} multiplied by two to
|
|
the power @var{e}}. Similar as above.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_cmpabs (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
@deftypefunx int mpfr_cmpabs_ui (mpfr_t @var{op1}, unsigned long int @var{op2})
|
|
Compare @tm{|@var{op1}|} and @tm{|@var{op2}|}.
|
|
Return a positive value if @tm{|@var{op1}| > |@var{op2}|},
|
|
zero if @tm{|@var{op1}| = |@var{op2}|}, and
|
|
a negative value if @tm{|@var{op1}| < |@var{op2}|}.
|
|
If one of the operands is NaN, set the @emph{erange} flag and return zero.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_nan_p (mpfr_t @var{op})
|
|
@deftypefunx int mpfr_inf_p (mpfr_t @var{op})
|
|
@deftypefunx int mpfr_number_p (mpfr_t @var{op})
|
|
@deftypefunx int mpfr_zero_p (mpfr_t @var{op})
|
|
@deftypefunx int mpfr_regular_p (mpfr_t @var{op})
|
|
Return non-zero if @var{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.
|
|
@end deftypefun
|
|
|
|
@deftypefn Macro int mpfr_sgn (mpfr_t @var{op})
|
|
Return a positive value if @tm{@var{op} > 0}, zero if @tm{@var{op} = 0},
|
|
and a negative value if @tm{@var{op} < 0}.
|
|
If the operand is NaN, set the @emph{erange} flag and return zero.
|
|
This is equivalent to @code{mpfr_cmp_ui (@var{op}, 0)}, but more efficient.
|
|
@end deftypefn
|
|
|
|
@deftypefun int mpfr_greater_p (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
@deftypefunx int mpfr_greaterequal_p (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
@deftypefunx int mpfr_less_p (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
@deftypefunx int mpfr_lessequal_p (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
@deftypefunx int mpfr_equal_p (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
Return non-zero if
|
|
@tm{@var{op1} > @var{op2}},
|
|
@tm{@var{op1} @ge{} @var{op2}},
|
|
@tm{@var{op1} < @var{op2}},
|
|
@tm{@var{op1} @le{} @var{op2}},
|
|
@tm{@var{op1} = @var{op2}} respectively,
|
|
and zero otherwise.
|
|
Those functions return zero whenever @var{op1} and/or @var{op2} is NaN@.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_lessgreater_p (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
Return non-zero if @tm{@var{op1} < @var{op2}} or @tm{@var{op1} > @var{op2}}
|
|
(i.e., neither @var{op1}, nor @var{op2} is NaN, and
|
|
@tm{@var{op1} @ne{} @var{op2}}), zero otherwise (i.e., @var{op1}
|
|
and/or @var{op2} is NaN, or @tm{@var{op1} = @var{op2}}).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_unordered_p (mpfr_t @var{op1}, mpfr_t @var{op2})
|
|
Return non-zero if @var{op1} or @var{op2} is a NaN (i.e., they cannot be
|
|
compared), zero otherwise.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_total_order_p (mpfr_t @var{x}, mpfr_t @var{y})
|
|
This function implements the totalOrder predicate from IEEE@tie{}754,
|
|
where @minus{}NaN @mm{<} @minus{}Inf @mm{<} negative finite numbers
|
|
@mm{<} @minus{}0 @mm{<} @mm{+}0 @mm{<} positive finite numbers
|
|
@mm{<} @mm{+}Inf @mm{<} @mm{+}NaN@.
|
|
It returns a non-zero value (true) when @var{x} is smaller than or equal
|
|
to @var{y} for this order relation, and zero (false) otherwise.
|
|
Contrary to @code{mpfr_cmp (@var{x}, @var{y})}, which returns a ternary value,
|
|
@code{mpfr_total_order_p} returns a binary value (zero or non-zero).
|
|
In particular, @code{mpfr_total_order_p (@var{x}, @var{x})} returns true,
|
|
@code{mpfr_total_order_p (-0, +0)} returns true and
|
|
@code{mpfr_total_order_p (+0, -0)} returns false.
|
|
The sign bit of NaN also matters.
|
|
@end deftypefun
|
|
|
|
@node Transcendental Functions, Input and Output Functions, Comparison Functions, MPFR Interface
|
|
@cindex Transcendental functions
|
|
@section Transcendental Functions
|
|
|
|
All those functions, except explicitly stated (for example
|
|
@code{mpfr_sin_cos}), return a @ref{ternary value}, i.e., zero for an
|
|
exact return value, a positive value for a return value larger than the
|
|
exact result, and a negative value otherwise.
|
|
|
|
Important note: In some domains, computing transcendental functions
|
|
(even more with correct rounding) is expensive, even in small precision,
|
|
for example the trigonometric and Bessel functions with a large argument.
|
|
For some functions, the algorithm complexity and memory usage does not
|
|
depend only on the output precision: for instance, the memory usage of
|
|
@code{mpfr_rootn_ui} is also linear in the argument @var{k}, and the
|
|
memory usage of the incomplete Gamma function also depends on the
|
|
precision of the input @var{op}. It is also theoretically possible that
|
|
some functions on some particular inputs might be very hard to round
|
|
(i.e. the Table Maker's Dilemma occurs in much larger precisions than
|
|
normally expected from the context), meaning that the internal precision
|
|
needs to be increased even more; but it is conjectured that the needed
|
|
precision has a reasonable bound (and in particular, that potentially
|
|
exact cases are known and can be detected efficiently).
|
|
@c Let's not give too many details, but by context, it is implied that
|
|
@c the input precision is involved if the cases have been built so that
|
|
@c they are hard to round, like in function bad_cases in the test suite
|
|
@c (tests/tests.c).
|
|
|
|
@deftypefun int mpfr_log (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_log_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_log2 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_log10 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the natural logarithm of @var{op},
|
|
@m{\log_2 @var{op}, log2(@var{op})} or
|
|
@m{\log_{10} @var{op}, log10(@var{op})}, respectively,
|
|
rounded in the direction @var{rnd}.
|
|
Set @var{rop} to @mm{+}0 if @var{op} is 1 (in all rounding modes),
|
|
for consistency with the ISO C99 and IEEE@tie{}754 standards.
|
|
Set @var{rop} to @minus{}Inf if @var{op} is @pom{}0
|
|
(i.e., the sign of the zero has no influence on the result).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_log1p (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_log2p1 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_log10p1 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the logarithm of one plus @var{op} (in radix two for
|
|
@code{mpfr_log2p1}, and in radix ten for @code{mpfr_log10p1}), rounded in the
|
|
direction @var{rnd}.
|
|
Set @var{rop} to @minus{}Inf if @var{op} is @minus{}1.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_exp (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_exp2 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_exp10 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the exponential of @var{op},
|
|
to @m{2^{@var{op}}, 2 power of @var{op}}
|
|
or to @m{10^{@var{op}}, 10 power of @var{op}}, respectively,
|
|
rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_expm1 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_exp2m1 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_exp10m1 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{e^{@var{op}}-1,the exponential of @var{op} followed by a
|
|
subtraction by one}
|
|
(resp.@: @m{2^{@var{op}}-1,2 power of @var{op} followed by a
|
|
subtraction by one},
|
|
and @m{10^{@var{op}}-1,10 power of @var{op} followed by a subtraction by one}),
|
|
rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@anchor{mpfr_pow}
|
|
@deftypefun int mpfr_pow (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_powr (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_pow_ui (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_pow_si (mpfr_t @var{rop}, mpfr_t @var{op1}, long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_pow_uj (mpfr_t @var{rop}, mpfr_t @var{op1}, uintmax_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_pow_sj (mpfr_t @var{rop}, mpfr_t @var{op1}, intmax_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_pown (mpfr_t @var{rop}, mpfr_t @var{op1}, intmax_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_pow_z (mpfr_t @var{rop}, mpfr_t @var{op1}, mpz_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_ui_pow_ui (mpfr_t @var{rop}, unsigned long int @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_ui_pow (mpfr_t @var{rop}, unsigned long int @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{@var{op1}^{@var{op2}}, @var{op1} raised to @var{op2}},
|
|
rounded in the direction @var{rnd}.
|
|
The @code{mpfr_powr} function corresponds to the @code{powr} function
|
|
from IEEE@tie{}754, i.e., it computes the exponential of
|
|
@var{op2} multiplied by the logarithm of @var{op1}.
|
|
The @code{mpfr_pown} function is just an alias for @code{mpfr_pow_sj}
|
|
(defined with @code{#define mpfr_pown mpfr_pow_sj}), to follow the
|
|
C2x function @code{pown}.
|
|
Special values are handled as described in the ISO C99 and IEEE@tie{}754
|
|
standards for the @code{pow} function:
|
|
@itemize @bullet
|
|
@item @code{pow(@pom{}0, @var{y})} returns @pom{}Inf for @var{y} a negative odd integer.
|
|
@item @code{pow(@pom{}0, @var{y})} returns @mm{+}Inf for @var{y} negative and not an odd integer.
|
|
@item @code{pow(@pom{}0, @var{y})} returns @pom{}0 for @var{y} a positive odd integer.
|
|
@item @code{pow(@pom{}0, @var{y})} returns @mm{+}0 for @var{y} positive and not an odd integer.
|
|
@item @code{pow(-1, @pom{}Inf)} returns 1.
|
|
@item @code{pow(+1, @var{y})} returns 1 for any @var{y}, even a NaN@.
|
|
@item @code{pow(@var{x}, @pom{}0)} returns 1 for any @var{x}, even a NaN@.
|
|
@item @code{pow(@var{x}, @var{y})} returns NaN for finite negative @var{x} and finite non-integer @var{y}.
|
|
@item @code{pow(@var{x}, -Inf)} returns @mm{+}Inf for @tm{0 < @GMPabs{x} < 1}, and @mm{+}0 for @tm{@GMPabs{x} > 1}.
|
|
@item @code{pow(@var{x}, +Inf)} returns @mm{+}0 for @tm{0 < @GMPabs{x} < 1}, and @mm{+}Inf for @tm{@GMPabs{x} > 1}.
|
|
@item @code{pow(-Inf, @var{y})} returns @minus{}0 for @var{y} a negative odd integer.
|
|
@item @code{pow(-Inf, @var{y})} returns @mm{+}0 for @var{y} negative and not an odd integer.
|
|
@item @code{pow(-Inf, @var{y})} returns @minus{}Inf for @var{y} a positive odd integer.
|
|
@item @code{pow(-Inf, @var{y})} returns @mm{+}Inf for @var{y} positive and not an odd integer.
|
|
@item @code{pow(+Inf, @var{y})} returns @mm{+}0 for @var{y} negative, and @mm{+}Inf for @var{y} positive.
|
|
@end itemize
|
|
Note: When 0 is of integer type, it is regarded as @mm{+}0 by these functions.
|
|
We do not use the usual limit rules in this case, as these rules are not
|
|
used for @code{pow}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_compound_si (mpfr_t @var{rop}, mpfr_t @var{op}, long int @var{n}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the power @var{n} of one plus @var{op},
|
|
following IEEE@tie{}754 for the special cases and exceptions. In particular:
|
|
@itemize @bullet
|
|
@item When @tm{@var{op} < @minus{}1}, @var{rop} is set to NaN@.
|
|
@item When @var{n} is zero and @var{op} is NaN (like any value greater or equal to @minus{}1), @var{rop} is set to 1.
|
|
@item When @tm{@var{op} = @minus{}1}, @var{rop} is set to @mm{+}Inf for @tm{@var{n} < 0}, and to @mm{+}0 for @tm{@var{n} > 0}.
|
|
@end itemize
|
|
The other special cases follow the usual rules.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_cos (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sin (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_tan (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the cosine of @var{op}, sine of @var{op},
|
|
tangent of @var{op}, rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_cosu (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{u}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sinu (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{u}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_tanu (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{u}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the cosine (resp.@: sine and tangent) of
|
|
@m{@var{op} \times 2\pi/@var{u},@var{op} multiplied by 2@tie{}Pi and divided
|
|
by @var{u}}. For example, if @var{u} equals 360, one gets the cosine
|
|
(resp.@: sine and tangent) for @var{op} in degrees. For @code{mpfr_cosu}, when
|
|
@m{@var{op} \times 2/@var{u},@var{op} multiplied by 2 and divided by @var{u}}
|
|
is a half-integer, the result is @mm{+}0, following IEEE@tie{}754 (cosPi),
|
|
so that the function is even. For @code{mpfr_sinu}, when
|
|
@m{@var{op} \times 2/@var{u},@var{op} multiplied by 2 and divided by @var{u}}
|
|
is an integer, the result is zero with the same sign as @var{op}, following
|
|
IEEE@tie{}754 (sinPi), so that the function is odd.
|
|
Similarly, the function @code{mpfr_tanu} follows IEEE@tie{}754 (tanPi).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_cospi (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sinpi (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_tanpi (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the cosine (resp.@: sine and tangent) of
|
|
@m{@var{op} \times \pi,@var{op} multiplied by Pi}. See the description of
|
|
@code{mpfr_sinu}, @code{mpfr_cosu} and @code{mpfr_tanu} for special values.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sin_cos (mpfr_t @var{sop}, mpfr_t @var{cop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set simultaneously @var{sop} to the sine of @var{op} and @var{cop} to the
|
|
cosine of @var{op}, rounded in the direction @var{rnd} with the corresponding
|
|
precisions of @var{sop} and @var{cop}, which must be different variables.
|
|
Return 0 iff both results are exact, more precisely it returns @tm{s + 4c}
|
|
where @tm{s = 0} if @var{sop} is exact, @tm{s = 1} if @var{sop} is larger
|
|
than the sine of @var{op}, @tm{s = 2} if @var{sop} is smaller than the sine
|
|
of @var{op}, and similarly for @tm{c} and the cosine of @var{op}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sec (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_csc (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_cot (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the secant of @var{op}, cosecant of @var{op},
|
|
cotangent of @var{op}, rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_acos (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_asin (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_atan (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the arc-cosine, arc-sine or arc-tangent of @var{op},
|
|
rounded in the direction @var{rnd}.
|
|
Note that since @code{acos(-1)} returns the floating-point number closest to
|
|
@m{\pi,Pi} according to the given rounding mode, this number might not be
|
|
in the output range @m{0 @le{} @var{rop} < \pi,0 @le{} @var{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 @code{asin(-1)}, @code{asin(1)}, @code{atan(-Inf)},
|
|
@code{atan(+Inf)} or for @code{atan(@var{op})} with large @var{op} and
|
|
small precision of @var{rop}.
|
|
@c PZ: check the above is correct
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_acosu (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{u}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_asinu (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{u}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_atanu (mpfr_t @var{rop}, mpfr_t @var{op}, unsigned long int @var{u}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @m{@var{a} \times @var{u}/(2\pi),@var{a} multiplied
|
|
by @var{u} and divided by 2@tie{}Pi}, where @var{a} is the arc-cosine
|
|
(resp.@: arc-sine and arc-tangent) of @var{op}.
|
|
For example, if @var{u} equals 360, @code{mpfr_acosu} yields the arc-cosine in
|
|
degrees.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_acospi (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_asinpi (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_atanpi (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @code{acos(@var{op})} (resp.@: @code{asin(@var{op})} and
|
|
@code{atan(@var{op})}) divided by @m{\pi,Pi}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_atan2 (mpfr_t @var{rop}, mpfr_t @var{y}, mpfr_t @var{x}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_atan2u (mpfr_t @var{rop}, mpfr_t @var{y}, mpfr_t @var{x}, unsigned long int @var{u}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_atan2pi (mpfr_t @var{rop}, mpfr_t @var{y}, mpfr_t @var{x}, mpfr_rnd_t @var{rnd})
|
|
For @code{mpfr_atan2}, set @var{rop} to the arc-tangent2 of @var{y} and
|
|
@var{x}, rounded in the direction @var{rnd}:
|
|
if @tm{@var{x} > 0}, then @code{atan2(@var{y}, @var{x})} returns
|
|
@tm{@atan{}(@var{y}/@var{x})};
|
|
if @tm{@var{x} < 0}, then @code{atan2(@var{y}, @var{x})} returns
|
|
@m{@sign{}(@var{y}) \times (\pi - @atan{}(@GMPabs{@var{y}/@var{x}})),the sign
|
|
of @var{y} multiplied by @w{Pi @minus{} atan(abs(@var{y}/@var{x}))}},
|
|
thus a number from @m{-\pi,@minus{}Pi} to @m{\pi,Pi}.
|
|
As for @code{atan}, in case the exact mathematical result is @m{+\pi,+Pi} or
|
|
@m{-\pi,@minus{}Pi},
|
|
its rounded result might be outside the function output range.
|
|
The function @code{mpfr_atan2u} behaves similarly, except the result is
|
|
multiplied by @m{@var{u}/(2\pi),@var{u} and divided by 2@tie{}Pi}; and
|
|
@code{mpfr_atan2pi} is the same as @code{mpfr_atan2u} with @tm{@var{u} = 2}.
|
|
For example, if @var{u} equals 360, @code{mpfr_atan2u} returns the
|
|
arc-tangent in degrees, with values from @minus{}180 to 180.
|
|
|
|
@code{atan2(@var{y}, 0)} does not raise any floating-point exception.
|
|
Special values are handled as described in the ISO C99 and IEEE@tie{}754
|
|
standards for the @code{atan2} function:
|
|
@itemize @bullet
|
|
@item @code{atan2(+0, -0)} returns @m{+\pi,+Pi}.
|
|
@item @code{atan2(-0, -0)} returns @m{-\pi,@minus{}Pi}.
|
|
@item @code{atan2(+0, +0)} returns @mm{+}0.
|
|
@item @code{atan2(-0, +0)} returns @minus{}0.
|
|
@item @code{atan2(+0, @var{x})} returns @m{+\pi,+Pi} for @tm{@var{x} < 0}.
|
|
@item @code{atan2(-0, @var{x})} returns @m{-\pi,@minus{}Pi} for @tm{@var{x} < 0}.
|
|
@item @code{atan2(+0, @var{x})} returns @mm{+}0 for @tm{@var{x} > 0}.
|
|
@item @code{atan2(-0, @var{x})} returns @minus{}0 for @tm{@var{x} > 0}.
|
|
@item @code{atan2(@var{y}, 0)} returns @m{-\pi/2,@minus{}Pi/2} for @tm{@var{y} < 0}.
|
|
@item @code{atan2(@var{y}, 0)} returns @m{+\pi/2,+Pi/2} for @tm{@var{y} > 0}.
|
|
@item @code{atan2(+Inf, -Inf)} returns @m{+3\pi/4,+3*Pi/4}.
|
|
@item @code{atan2(-Inf, -Inf)} returns @m{-3\pi/4,@minus{}3*Pi/4}.
|
|
@item @code{atan2(+Inf, +Inf)} returns @m{+\pi/4,+Pi/4}.
|
|
@item @code{atan2(-Inf, +Inf)} returns @m{-\pi/4,@minus{}Pi/4}.
|
|
@item @code{atan2(+Inf, @var{x})} returns @m{+\pi/2,+Pi/2} for finite @tm{@var{x}}.
|
|
@item @code{atan2(-Inf, @var{x})} returns @m{-\pi/2,@minus{}Pi/2} for finite @tm{@var{x}}.
|
|
@item @code{atan2(@var{y}, -Inf)} returns @m{+\pi,+Pi} for finite @tm{@var{y} > 0}.
|
|
@item @code{atan2(@var{y}, -Inf)} returns @m{-\pi,@minus{}Pi} for finite @tm{@var{y} < 0}.
|
|
@item @code{atan2(@var{y}, +Inf)} returns @mm{+}0 for finite @tm{@var{y} > 0}.
|
|
@item @code{atan2(@var{y}, +Inf)} returns @minus{}0 for finite @tm{@var{y} < 0}.
|
|
@end itemize
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_cosh (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_sinh (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_tanh (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the hyperbolic cosine, sine or tangent of @var{op},
|
|
rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sinh_cosh (mpfr_t @var{sop}, mpfr_t @var{cop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set simultaneously @var{sop} to the hyperbolic sine of @var{op} and
|
|
@var{cop} to the hyperbolic cosine of @var{op},
|
|
rounded in the direction @var{rnd} with the corresponding precision of
|
|
@var{sop} and @var{cop}, which must be different variables.
|
|
Return 0 iff both results are exact (see @code{mpfr_sin_cos} for a more
|
|
detailed description of the return value).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sech (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_csch (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_coth (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the hyperbolic secant of @var{op}, cosecant of @var{op},
|
|
cotangent of @var{op}, rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_acosh (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_asinh (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_atanh (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the inverse hyperbolic cosine, sine or tangent of @var{op},
|
|
rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_eint (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the exponential integral of @var{op},
|
|
rounded in the direction @var{rnd}.
|
|
This is the sum of Euler's constant, of the logarithm
|
|
of the absolute value of @var{op}, and of the sum for @tm{k}
|
|
from 1 to infinity of @m{@var{op}^k / (k \cdot k!),
|
|
@var{op} to the power k@comma{} divided by k and the factorial of k}.
|
|
For positive @var{op}, it corresponds to the Ei function at @var{op}
|
|
(see formula 5.1.10 from the Handbook of Mathematical Functions from
|
|
Abramowitz and Stegun),
|
|
and for negative @var{op}, to the opposite of the
|
|
E1 function (sometimes called eint1)
|
|
at @minus{}@var{op} (formula 5.1.1 from the same reference).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_li2 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to real part of the dilogarithm of @var{op}, rounded in the
|
|
direction @var{rnd}. MPFR defines the dilogarithm function as
|
|
@m{-\int_{t=0}^{@var{op}} \log(1-t)/t\ dt,the integral of
|
|
@minus{}log(1@minus{}t)/t from 0 to @var{op}}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_gamma (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_gamma_inc (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the Gamma function on @var{op}, resp.@: the
|
|
incomplete Gamma function on @var{op} and @var{op2},
|
|
rounded in the direction @var{rnd}.
|
|
(In the literature, @code{mpfr_gamma_inc} is called upper
|
|
incomplete Gamma function,
|
|
or sometimes complementary incomplete Gamma function.)
|
|
For @code{mpfr_gamma} (and @code{mpfr_gamma_inc} when @var{op2} is zero),
|
|
when @var{op} is a negative integer, @var{rop} is set to NaN@.
|
|
|
|
Note: the current implementation of @code{mpfr_gamma_inc} is slow for
|
|
large values of @var{rop} or @var{op}, in which case some internal overflow
|
|
might also occur.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_lngamma (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the logarithm of the Gamma function on @var{op},
|
|
rounded in the direction @var{rnd}.
|
|
When @var{op} is 1 or 2, set @var{rop} to @mm{+}0 (in all rounding modes).
|
|
When @var{op} is an infinity or a non-positive integer, set @var{rop} to
|
|
@mm{+}Inf, following the general rules on special values.
|
|
When @tm{@minus{}2k @minus{} 1 < @var{op} < @minus{}2k},
|
|
@tm{k} being a non-negative integer, set @var{rop} to NaN@.
|
|
See also @code{mpfr_lgamma}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_lgamma (mpfr_t @var{rop}, int *@var{signp}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the logarithm of the absolute value of the
|
|
Gamma function on @var{op}, rounded in the direction @var{rnd}. The sign
|
|
(1 or @minus{}1) of Gamma(@var{op}) is returned in the object pointed to
|
|
by @var{signp}.
|
|
When @var{op} is 1 or 2, set @var{rop} to @mm{+}0 (in all rounding modes).
|
|
When @var{op} is an infinity or a non-positive integer, set @var{rop} to
|
|
@mm{+}Inf.
|
|
When @var{op} is NaN, @minus{}Inf or a negative integer, *@var{signp} is
|
|
undefined, and when @var{op} is @pom{}0, *@var{signp} is the sign of the zero.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_digamma (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the Digamma (sometimes also called Psi)
|
|
function on @var{op}, rounded in the direction @var{rnd}.
|
|
When @var{op} is a negative integer, set @var{rop} to NaN@.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_beta (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the Beta function at arguments @var{op1} and
|
|
@var{op2}.
|
|
Note: the current code does not try to avoid internal overflow or underflow,
|
|
and might use a huge internal precision in some cases.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_zeta (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_zeta_ui (mpfr_t @var{rop}, unsigned long int @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the Riemann Zeta function on @var{op},
|
|
rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_erf (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_erfc (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the error function on @var{op}
|
|
(resp.@: the complementary error function on @var{op})
|
|
rounded in the direction @var{rnd}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_j0 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_j1 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_jn (mpfr_t @var{rop}, long int @var{n}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the first kind Bessel function of order 0,
|
|
(resp.@: 1 and @var{n})
|
|
on @var{op}, rounded in the direction @var{rnd}. When @var{op} is NaN,
|
|
@var{rop} is always set to NaN@. When @var{op} is positive or negative infinity,
|
|
@var{rop} is set to @mm{+}0. When @var{op} is zero, and @var{n} is not zero,
|
|
@var{rop} is set to @mm{+}0 or @minus{}0 depending on the parity and sign of
|
|
@var{n}, and the sign of @var{op}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_y0 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_y1 (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_yn (mpfr_t @var{rop}, long int @var{n}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the second kind Bessel function of order 0
|
|
(resp.@: 1 and @var{n})
|
|
on @var{op}, rounded in the direction @var{rnd}. When @var{op} is
|
|
NaN or negative, @var{rop} is always set to NaN@. When @var{op} is @mm{+}Inf,
|
|
@var{rop} is set to @mm{+}0. When @var{op} is zero, @var{rop} is set to
|
|
@mm{+}Inf or @minus{}Inf depending on the parity and sign of @var{n}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_agm (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the arithmetic-geometric mean of @var{op1} and @var{op2},
|
|
rounded in the direction @var{rnd}.
|
|
The arithmetic-geometric mean is the common limit of the sequences
|
|
@mm{u_n} and @mm{v_n}, where @tm{u_0 = @var{op1}}, @tm{v_0 = @var{op2}},
|
|
@m{u_{n+1},u_(n+1)} is the arithmetic mean of @mm{u_n} and @mm{v_n}, and
|
|
@m{v_{n+1},v_(n+1)} is the geometric mean of @mm{u_n} and @mm{v_n}.
|
|
If any operand is negative and the other one is not zero,
|
|
set @var{rop} to NaN@.
|
|
If any operand is zero and the other one is finite (resp.@: infinite),
|
|
set @var{rop} to @mm{+}0 (resp.@: NaN)@.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_ai (mpfr_t @var{rop}, mpfr_t @var{x}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the value of the Airy function Ai
|
|
on @var{x}, rounded in the direction @var{rnd}.
|
|
When @var{x} is
|
|
NaN,
|
|
@var{rop} is always set to NaN@. When @var{x} is @mm{+}Inf or @minus{}Inf,
|
|
@var{rop} is @mm{+}0.
|
|
The current implementation is not intended to be used with large arguments.
|
|
It works with @GMPabs{@var{x}} typically smaller than 500. For larger arguments,
|
|
other methods should be used and will be implemented in a future version.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_const_log2 (mpfr_t @var{rop}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_const_pi (mpfr_t @var{rop}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_const_euler (mpfr_t @var{rop}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_const_catalan (mpfr_t @var{rop}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the logarithm of 2, the value of @m{\pi,Pi},
|
|
of Euler's constant 0.577@dots{}, of Catalan's constant 0.915@dots{},
|
|
respectively, rounded in the direction
|
|
@var{rnd}. These functions cache the computed values to avoid other
|
|
calculations if a lower or equal precision is requested. To free these caches,
|
|
use @code{mpfr_free_cache} or @code{mpfr_free_cache2}.
|
|
@end deftypefun
|
|
|
|
@node Input and Output Functions, Formatted Output Functions, Transcendental Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Input functions
|
|
@cindex Output functions
|
|
@cindex I/O functions
|
|
@section 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 @code{stream} to any of these functions will make
|
|
them read from @code{stdin} and write to @code{stdout}, respectively.
|
|
|
|
When using a function that takes a @code{FILE *} argument, you must
|
|
include the @code{<stdio.h>} standard header before @file{mpfr.h},
|
|
to allow @file{mpfr.h} to define prototypes for these functions.
|
|
|
|
@deftypefun size_t mpfr_out_str (FILE *@var{stream}, int @var{base}, size_t @var{n}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Output @var{op} on stream @var{stream} as a text string in
|
|
base @GMPabs{@var{base}}, rounded in the direction @var{rnd}.
|
|
The base may vary from 2 to 62 or from @minus{}2 to @minus{}36
|
|
(any other value yields undefined behavior). The argument @var{n} has
|
|
the same meaning as in @code{mpfr_get_str} (@pxref{mpfr_get_str}):
|
|
Print @var{n} significant digits exactly, or if @var{n} is 0, the number
|
|
@code{mpfr_get_str_ndigits (@var{base}, @var{p})}, where @var{p} is the
|
|
precision of @var{op} (@pxref{mpfr_get_str_ndigits}).
|
|
|
|
If the input is NaN, @mm{+}Inf, @minus{}Inf, @mm{+}0, or @minus{}0, then
|
|
@samp{@@NaN@@}, @samp{@@Inf@@}, @samp{-@@Inf@@}, @samp{0}, or
|
|
@samp{-0} is output, respectively.
|
|
|
|
For the regular numbers, the format of the output is the following: the
|
|
most significant digit, then a decimal-point character (defined by the
|
|
current locale), then the remaining @tm{@var{n} @minus{} 1} digits (including
|
|
trailing zeros), then the exponent prefix, then the exponent in decimal.
|
|
The exponent prefix is @samp{e} when @tm{@GMPabs{@var{base}} @le{} 10},
|
|
and @samp{@@} when @tm{@GMPabs{@var{base}} > 10}. @xref{mpfr_get_str} for
|
|
information on the digits depending on the base.
|
|
@c The term "exponent prefix" is used in the mpfr_strtofr description.
|
|
|
|
Return the number of characters written, or if an error occurred, return 0.
|
|
@end deftypefun
|
|
|
|
@deftypefun size_t mpfr_inp_str (mpfr_t @var{rop}, FILE *@var{stream}, int @var{base}, mpfr_rnd_t @var{rnd})
|
|
Input a string in base @var{base} from stream @var{stream},
|
|
rounded in the direction @var{rnd}, and put the
|
|
read float in @var{rop}.
|
|
@c The argument @var{base} must be in the range 2 to 62.
|
|
|
|
@c The string is of the form @samp{M@@N} or, if the
|
|
@c base is 10 or less, alternatively @samp{MeN} or @samp{MEN}, or, if the base
|
|
@c is 16, alternatively @samp{MpB} or @samp{MPB}.
|
|
@c @samp{M} is the significand in the specified base, @samp{N} is the exponent
|
|
@c written in decimal for the specified base, and in base 16, @samp{B} is the
|
|
@c binary exponent written in decimal (i.e., it indicates the power of 2 by
|
|
@c which the significand is to be scaled).
|
|
After skipping optional whitespace (as defined by @code{isspace}, which
|
|
depends on the current locale), this function reads a word, defined as
|
|
the longest sequence of non-whitespace characters, and parses it using
|
|
@code{mpfr_set_str}.
|
|
See the documentation of @code{mpfr_strtofr} for a detailed description
|
|
of the valid string formats.
|
|
@c Special values can be read as follows (the case does not matter):
|
|
@c @samp{@@NaN@@}, @samp{@@Inf@@}, @samp{+@@Inf@@} and @samp{-@@Inf@@},
|
|
@c possibly followed by other characters; if the base is smaller than
|
|
@c or equal to 16, the following strings are accepted too: @samp{NaN},
|
|
@c @samp{Inf}, @samp{+Inf} and @samp{-Inf}.
|
|
|
|
Return the number of bytes read (including the leading whitespace,
|
|
if any), or if the string format is invalid or an error occurred,
|
|
return 0.
|
|
@end deftypefun
|
|
|
|
@c @deftypefun void mpfr_inp_raw (mpfr_t @var{float}, FILE *@var{stream})
|
|
@c Input from stdio stream @var{stream} in the format written by
|
|
@c @code{mpfr_out_raw}, and put the result in @var{float}.
|
|
@c @end deftypefun
|
|
|
|
@deftypefun int mpfr_fpif_export (FILE *@var{stream}, mpfr_t @var{op})
|
|
Export the number @var{op} to the stream @var{stream} in a floating-point
|
|
interchange format.
|
|
In particular one can export on a 32-bit computer and import on a 64-bit
|
|
computer, or export on a little-endian computer and import on a big-endian
|
|
computer.
|
|
The precision of @var{op} and the sign bit of a NaN are stored too.
|
|
Return 0 iff the export was successful.
|
|
|
|
Note: this function is experimental and its interface might change in future
|
|
versions.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_fpif_import (mpfr_t @var{op}, FILE *@var{stream})
|
|
Import the number @var{op} from the stream @var{stream} in a floating-point
|
|
interchange format (see @code{mpfr_fpif_export}).
|
|
Note that the precision of @var{op} is set to the one read from the stream,
|
|
and the sign bit is always retrieved (even for NaN)@.
|
|
If the stored precision is zero or greater than @code{MPFR_PREC_MAX}, the
|
|
function fails (it returns non-zero) and @var{op} is unchanged. If the
|
|
function fails for another reason, @var{op} is set to NaN and it is
|
|
unspecified whether the precision of @var{op} has changed to the one
|
|
read from the file.
|
|
Return 0 iff the import was successful.
|
|
|
|
Note: this function is experimental and its interface might change in future
|
|
versions.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_dump (mpfr_t @var{op})
|
|
Output @var{op} on @code{stdout} in some unspecified format, then a newline
|
|
character. This function is mainly for debugging purpose. Thus invalid data
|
|
may be supported. Everything that is not specified may change without
|
|
breaking the ABI and may depend on the environment.
|
|
|
|
The current output format is the following: a minus sign if the sign bit
|
|
is set (even for NaN); @samp{@@NaN@@}, @samp{@@Inf@@} or @samp{0} if the
|
|
argument is NaN, an infinity or zero, respectively; otherwise the remaining
|
|
of the output is as follows: @samp{0.} then the @tm{p} bits of the binary
|
|
significand, where @tm{p} is the precision of the number; if the trailing
|
|
bits are not all zeros (which must not occur with valid data), they are
|
|
output enclosed by square brackets; the character @samp{E} followed by
|
|
the exponent written in base 10; in case of invalid data or out-of-range
|
|
exponent, this function outputs three exclamation marks (@samp{!!!}),
|
|
followed by flags, followed by three exclamation marks (@samp{!!!}) again.
|
|
These flags are: @samp{N} if the most significant bit of the significand
|
|
is 0 (i.e., the number is not normalized); @samp{T} if there are non-zero
|
|
trailing bits; @samp{U} if this is an UBF number (internal use only);
|
|
@samp{<} if the exponent is less than the current minimum exponent;
|
|
@samp{>} if the exponent is greater than the current maximum exponent.
|
|
@end deftypefun
|
|
|
|
@node Formatted Output Functions, Integer and Remainder Related Functions, Input and Output Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Output functions
|
|
@cindex I/O functions
|
|
@section Formatted Output Functions
|
|
|
|
@subsection Requirements
|
|
The class of @code{mpfr_printf} functions provides formatted output in a
|
|
similar manner as the standard C @code{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 @code{<stdio.h>}
|
|
standard header before @file{mpfr.h}, to allow @file{mpfr.h} to define
|
|
prototypes for these functions.
|
|
|
|
@subsection Format String
|
|
The format specification accepted by @code{mpfr_printf} is an extension of
|
|
the @code{gmp_printf} one (itself, an extension of the @code{printf} one).
|
|
The conversion specification is of the form:
|
|
|
|
@example
|
|
% [flags] [width] [.[precision]] [type] [rounding] conv
|
|
@end example
|
|
|
|
@samp{flags}, @samp{width}, and @samp{precision} have the same meaning as for
|
|
the standard @code{printf} (in particular, notice that the precision is
|
|
related to the number of digits displayed in the base chosen by @samp{conv}
|
|
and not related to the internal precision of the @code{mpfr_t} variable), but
|
|
note that for @samp{Re}, the default precision is not the same as the one for
|
|
@samp{e}.
|
|
@code{mpfr_printf} accepts the same @samp{type} specifiers as GMP (except the
|
|
non-standard and deprecated @samp{q}, use @samp{ll} instead), namely the
|
|
length modifiers defined in the C standard:
|
|
|
|
@quotation
|
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM}
|
|
@item @samp{h} @tab @code{short}
|
|
@item @samp{hh} @tab @code{char}
|
|
@item @samp{j} @tab @code{intmax_t} or @code{uintmax_t}
|
|
@item @samp{l} @tab @code{long} or @code{wchar_t}
|
|
@item @samp{ll} @tab @code{long long}
|
|
@item @samp{L} @tab @code{long double}
|
|
@item @samp{t} @tab @code{ptrdiff_t}
|
|
@item @samp{z} @tab @code{size_t}
|
|
@end multitable
|
|
@end quotation
|
|
|
|
@noindent
|
|
and the @samp{type} specifiers defined in GMP, plus @samp{R} and @samp{P},
|
|
which are specific to MPFR (the second column in the table below shows the
|
|
type of the argument read in the argument list and the kind of @samp{conv}
|
|
specifier to use after the @samp{type} specifier):
|
|
|
|
@quotation
|
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM}
|
|
@item @samp{F} @tab @code{mpf_t}, float conversions
|
|
@item @samp{Q} @tab @code{mpq_t}, integer conversions
|
|
@item @samp{M} @tab @code{mp_limb_t}, integer conversions
|
|
@item @samp{N} @tab @code{mp_limb_t} array, integer conversions
|
|
@item @samp{Z} @tab @code{mpz_t}, integer conversions
|
|
|
|
@item @samp{P} @tab @code{mpfr_prec_t}, integer conversions
|
|
@item @samp{R} @tab @code{mpfr_t}, float conversions
|
|
@end multitable
|
|
@end quotation
|
|
|
|
The @samp{type} specifiers have the same restrictions as those
|
|
mentioned in the GMP documentation:
|
|
@ifinfo
|
|
@pxref{Formatted Output Strings,,, gmp.info,GNU MP}.
|
|
@end ifinfo
|
|
@ifnotinfo
|
|
see Section ``Formatted Output Strings'' in @cite{GNU MP}.
|
|
@end ifnotinfo
|
|
In particular, the @samp{type} specifiers (except @samp{R} and @samp{P}) are
|
|
supported only if they are supported by @code{gmp_printf} in your GMP build;
|
|
this implies that the standard specifiers, such as @samp{t}, must @emph{also}
|
|
be supported by your C library if you want to use them.
|
|
|
|
The @samp{rounding} field is specific to @code{mpfr_t} arguments and should
|
|
not be used with other types.
|
|
|
|
With conversion specification not involving @samp{P} and @samp{R} types,
|
|
@code{mpfr_printf} behaves exactly as @code{gmp_vasprintf} (thus, if GMP
|
|
uses its @code{vsnprintf} replacement, the behavior may differ from the
|
|
C library or from other GMP formatted output functions; for instance, in
|
|
such a case, up to GMP@tie{}6.3.0, the conversion specifiers @samp{a}/@samp{A}
|
|
will not work).
|
|
|
|
Thus the @samp{conv} specifier @samp{F} is not supported (due to the use
|
|
of @samp{F} as the @samp{type} specifier for @code{mpf_t}), except for
|
|
the @samp{type} specifier @samp{R} (i.e., for @code{mpfr_t} arguments).
|
|
|
|
The @samp{P} type specifies that a following @samp{d}, @samp{i},
|
|
@samp{o}, @samp{u}, @samp{x}, or @samp{X} conversion specifier applies
|
|
to a @code{mpfr_prec_t} argument.
|
|
It is needed because the @code{mpfr_prec_t} type does not necessarily
|
|
correspond to an @code{int} or any fixed standard type.
|
|
The @samp{precision} value specifies the minimum number of digits to
|
|
appear. The default precision is 1.
|
|
For example:
|
|
@example
|
|
mpfr_t x;
|
|
mpfr_prec_t p;
|
|
mpfr_init (x);
|
|
@dots{}
|
|
p = mpfr_get_prec (x);
|
|
mpfr_printf ("variable x with %Pd bits", p);
|
|
@end example
|
|
|
|
The @samp{R} type specifies that a following @samp{a}, @samp{A}, @samp{b},
|
|
@samp{e}, @samp{E}, @samp{f}, @samp{F}, @samp{g}, @samp{G}, or @samp{n}
|
|
conversion specifier applies to a @code{mpfr_t} argument.
|
|
The @samp{R} type can be followed by a @samp{rounding} specifier denoted by
|
|
one of the following characters:
|
|
|
|
@quotation
|
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM}
|
|
@item @samp{U} @tab round toward positive infinity
|
|
@item @samp{D} @tab round toward negative infinity
|
|
@item @samp{Y} @tab round away from zero
|
|
@item @samp{Z} @tab round toward zero
|
|
@item @samp{N} @tab round to nearest (with ties to even)
|
|
@item @samp{*} @tab rounding mode indicated by the @code{mpfr_rnd_t} argument
|
|
just before the corresponding @code{mpfr_t} variable.
|
|
@end multitable
|
|
@end quotation
|
|
|
|
@c FIXME: The @need value was changed from 800 to 400 in commit 73b04f49f2
|
|
@c in order to avoid a bug in Texinfo. Change it back to 800 once this bug
|
|
@c has been fixed. See thread
|
|
@c https://lists.gnu.org/archive/html/bug-texinfo/2022-11/msg00228.html
|
|
@need 400
|
|
The default rounding mode is rounding to nearest.
|
|
The following three examples are equivalent:
|
|
@example
|
|
mpfr_t x;
|
|
mpfr_init (x);
|
|
@dots{}
|
|
mpfr_printf ("%.128Rf", x);
|
|
mpfr_printf ("%.128RNf", x);
|
|
mpfr_printf ("%.128R*f", MPFR_RNDN, x);
|
|
@end example
|
|
|
|
Note that the rounding away from zero mode is specified with @samp{Y}
|
|
because ISO C reserves the @samp{A} specifier for hexadecimal output (see
|
|
below).
|
|
|
|
The output @samp{conv} specifiers allowed with @code{mpfr_t} parameter are:
|
|
|
|
@quotation
|
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM}
|
|
@item @samp{a} @samp{A} @tab hex float, C99 style
|
|
@item @samp{b} @tab binary output
|
|
@item @samp{e} @samp{E} @tab scientific-format float
|
|
@item @samp{f} @samp{F} @tab fixed-point float
|
|
@item @samp{g} @samp{G} @tab fixed-point or scientific float
|
|
@end multitable
|
|
@end quotation
|
|
|
|
The conversion specifier @samp{b}, which displays the argument in binary, is
|
|
specific to @code{mpfr_t} arguments and should not be used with other types.
|
|
Other conversion specifiers have the same meaning as for a @code{double}
|
|
argument.
|
|
|
|
In case of non-decimal output, only the significand is written in the
|
|
specified base, the exponent is always displayed in decimal.
|
|
|
|
Non-real values are always displayed as @samp{nan} / @samp{inf} for the
|
|
@samp{a}, @samp{b}, @samp{e}, @samp{f}, and @samp{g} specifiers, and
|
|
@samp{NAN} / @samp{INF} for @samp{A}, @samp{E}, @samp{F}, and @samp{G}
|
|
specifiers, possibly preceded by a sign or a space (the minus sign
|
|
when the value has a negative sign, the plus sign when the value has
|
|
a positive sign and the @samp{+} flag is used, a space when the value
|
|
has a positive sign and the @emph{space} flag is used).
|
|
|
|
The @code{mpfr_t} number is rounded to the given precision in the direction
|
|
specified by the rounding mode (see below if the precision is missing).
|
|
Similarly to the native C types, the precision is the number of digits output
|
|
after the decimal-point character, except for the @samp{g} and @samp{G}
|
|
conversion specifiers, where it is the number of significant digits
|
|
(but trailing zeros of the fractional part are not output by default),
|
|
or 1 if the precision is zero.
|
|
If the precision is zero with rounding to nearest mode and one of the
|
|
following conversion specifiers: @samp{a}, @samp{A}, @samp{b}, @samp{e},
|
|
@samp{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 @samp{8e+1} and 95 is displayed as
|
|
@samp{1e+2} with the format specification @code{"%.0RNe"}.
|
|
This also applies when the @samp{g} (resp.@: @samp{G}) conversion specifier
|
|
uses the @samp{e} (resp.@: @samp{E}) style.
|
|
If the precision is set to a value greater than the maximum value for an
|
|
@code{int}, it will be silently reduced down to @code{INT_MAX}.
|
|
|
|
If the precision is missing, it is chosen as follows, depending on the
|
|
conversion specifier.
|
|
@itemize @bullet
|
|
@item With @samp{a}, @samp{A}, and @samp{b}, it is chosen to have
|
|
an exact representation with no trailing zeros.
|
|
@c Avoid saying "minimum" as this could be confusing with the different
|
|
@c possible choices for a/A.
|
|
@item With @samp{e} and @samp{E}, it is
|
|
@m{\left\lceil p {\log 2 \over \log 10} \right\rceil,ceil(p times
|
|
log(2)/log(10))},
|
|
where @tm{p} is the precision of the input variable, matching the choice
|
|
done for @code{mpfr_get_str}; thus, if rounding to nearest is used,
|
|
outputting the value with a missing precision and reading it back will
|
|
yield the original value.
|
|
@item With @samp{f}, @samp{F}, @samp{g}, and @samp{G}, it is 6.
|
|
@end itemize
|
|
|
|
For a given number with @samp{a}/@samp{A}, 4 exponent values allow the
|
|
first hexadecimal digit to be non-zero as required, and the choice is
|
|
unspecified in ISO C99 and later. In MPFR, the choice currently depends
|
|
on the value of the precision field (zero or non-zero) and on the input
|
|
value. This may change in the future in order to have a more consistent
|
|
behavior. Details and discussion:
|
|
@url{https://sympa.inria.fr/sympa/arc/mpfr/2021-05/msg00002.html}
|
|
|
|
@c For the record, concerning the choice for 'e'/'E':
|
|
@c https://sympa.inria.fr/sympa/arc/mpfr/2019-12/msg00000.html
|
|
@c https://sympa.inria.fr/sympa/arc/mpfr/2020-01/msg00000.html
|
|
@c https://gforge.inria.fr/tracker/index.php?func=detail&aid=21816&group_id=136&atid=619
|
|
|
|
@subsection Functions
|
|
|
|
For all the following functions, if the number of characters that ought to be
|
|
written exceeds the maximum limit @code{INT_MAX} for an @code{int}, nothing is
|
|
written in the stream (resp.@: to @code{stdout}, to @var{buf}, to @var{str}),
|
|
the function returns @minus{}1, sets the @emph{erange} flag, and @code{errno}
|
|
is set to @code{EOVERFLOW} if the @code{EOVERFLOW} macro is defined (such as
|
|
on POSIX systems). Note, however, that @code{errno} might be changed to
|
|
another value by some internal library call if another error occurs there
|
|
(currently, this would come from the unallocation function).
|
|
|
|
@deftypefun int mpfr_fprintf (FILE *@var{stream}, const char *@var{template}, @dots{})
|
|
@deftypefunx int mpfr_vfprintf (FILE *@var{stream}, const char *@var{template}, va_list @var{ap})
|
|
Print to the stream @var{stream} the optional arguments under the control of
|
|
the template string @var{template}.
|
|
Return the number of characters written or a negative value if an error
|
|
occurred.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_printf (const char *@var{template}, @dots{})
|
|
@deftypefunx int mpfr_vprintf (const char *@var{template}, va_list @var{ap})
|
|
Print to @code{stdout} the optional arguments under the control of the
|
|
template string @var{template}.
|
|
Return the number of characters written or a negative value if an error
|
|
occurred.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_sprintf (char *@var{buf}, const char *@var{template}, @dots{})
|
|
@deftypefunx int mpfr_vsprintf (char *@var{buf}, const char *@var{template}, va_list @var{ap})
|
|
Form a null-terminated array corresponding to the optional arguments under
|
|
the control of the template string @var{template}, and print it in
|
|
@var{buf}. No overlap is permitted between
|
|
@var{buf} and the other arguments.
|
|
Return the number of characters written in the array @var{buf}
|
|
@emph{not counting}
|
|
the terminating null character or a negative value if an error occurred.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_snprintf (char *@var{buf}, size_t @var{n}, const char *@var{template}, @dots{})
|
|
@deftypefunx int mpfr_vsnprintf (char *@var{buf}, size_t @var{n}, const char *@var{template}, va_list @var{ap})
|
|
Form a null-terminated array corresponding to the optional arguments under
|
|
the control of the template string @var{template}, and print it in
|
|
@var{buf}. If @var{n} is zero, nothing is
|
|
written and @var{buf} may be a null pointer, otherwise, the first
|
|
@tm{@var{n} @minus{} 1} characters are written in @var{buf} and the
|
|
@var{n}-th one is a null character.
|
|
Return the number of characters that would have been written had @var{n} been
|
|
sufficiently large, @emph{not counting}
|
|
the terminating null character, or a negative value if an error occurred.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_asprintf (char **@var{str}, const char *@var{template}, @dots{})
|
|
@deftypefunx int mpfr_vasprintf (char **@var{str}, const char *@var{template}, va_list @var{ap})
|
|
Write their output as a null-terminated array in a block of memory allocated
|
|
using the allocation function (@pxref{Memory Handling}). A pointer to the
|
|
block is stored in @var{str}. The block of memory must be freed using
|
|
@code{mpfr_free_str}, but you must first make sure that it does not contain
|
|
non-terminating null characters or that the unallocation function does not
|
|
use its size argument.
|
|
The return value is the number of characters written in the array, excluding
|
|
the null-terminator, or a negative value if an error occurred, in which case
|
|
the contents of @var{str} are undefined.
|
|
Note that this return value may be used to know how many bytes may need to
|
|
be set to a non-zero value (in case @samp{%c} was used with the value 0)
|
|
before the call to @code{mpfr_free_str}.
|
|
@end deftypefun
|
|
|
|
@node Integer and Remainder Related Functions, Rounding-Related Functions, Formatted Output Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Integer related functions
|
|
@cindex Remainder related functions
|
|
@section Integer and Remainder Related Functions
|
|
|
|
@deftypefun int mpfr_rint (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_ceil (mpfr_t @var{rop}, mpfr_t @var{op})
|
|
@deftypefunx int mpfr_floor (mpfr_t @var{rop}, mpfr_t @var{op})
|
|
@deftypefunx int mpfr_round (mpfr_t @var{rop}, mpfr_t @var{op})
|
|
@deftypefunx int mpfr_roundeven (mpfr_t @var{rop}, mpfr_t @var{op})
|
|
@deftypefunx int mpfr_trunc (mpfr_t @var{rop}, mpfr_t @var{op})
|
|
Set @var{rop} to @var{op} rounded to an integer.
|
|
@code{mpfr_rint} rounds to the nearest representable integer in the
|
|
given direction @var{rnd}, and the other five functions behave in a
|
|
similar way with some fixed rounding mode:
|
|
@itemize @bullet
|
|
@item @code{mpfr_ceil}: to the next higher or equal representable integer
|
|
(like @code{mpfr_rint} with @code{MPFR_RNDU});
|
|
@item @code{mpfr_floor} to the next lower or equal representable integer
|
|
(like @code{mpfr_rint} with @code{MPFR_RNDD});
|
|
@item @code{mpfr_round} to the nearest representable integer,
|
|
rounding halfway cases away from zero
|
|
(as in the roundTiesToAway mode of IEEE@tie{}754);
|
|
@item @code{mpfr_roundeven} to the nearest representable integer,
|
|
rounding halfway cases with the even-rounding rule
|
|
(like @code{mpfr_rint} with @code{MPFR_RNDN});
|
|
@item @code{mpfr_trunc} to the next representable integer toward zero
|
|
(like @code{mpfr_rint} with @code{MPFR_RNDZ}).
|
|
@end itemize
|
|
When @var{op} is a zero or an infinity, set @var{rop} to the same value
|
|
(with the same sign).
|
|
|
|
The return value is zero when the result is exact, positive when it is
|
|
greater than the original value of @var{op}, and negative when it is smaller.
|
|
More precisely, the return value is 0 when @var{op} is an integer
|
|
representable in @var{rop}, 1 or @minus{}1 when @var{op} is an integer
|
|
that is not representable in @var{rop}, 2 or @minus{}2 when @var{op} is
|
|
not an integer.
|
|
|
|
When @var{op} is NaN, the NaN flag is set as usual. In the other cases,
|
|
the inexact flag is set when @var{rop} differs from @var{op}, following
|
|
the ISO C99 rule for the @code{rint} function. If you want the behavior to
|
|
be more like IEEE@tie{}754 / ISO TS@tie{}18661-1, i.e., the usual behavior
|
|
where the round-to-integer function is regarded as any other mathematical
|
|
function, you should use one of the @code{mpfr_rint_*} functions instead.
|
|
|
|
Note that no double rounding is performed; for instance, 10.5 (1010.1 in
|
|
binary) is rounded by @code{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.)
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_rint_ceil (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_rint_floor (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_rint_round (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_rint_roundeven (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_rint_trunc (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to @var{op} rounded to an integer:
|
|
@itemize @bullet
|
|
@item @code{mpfr_rint_ceil}: to the next higher or equal integer;
|
|
@item @code{mpfr_rint_floor}: to the next lower or equal integer;
|
|
@item @code{mpfr_rint_round}: to the nearest integer,
|
|
rounding halfway cases away from zero;
|
|
@item @code{mpfr_rint_roundeven}: to the nearest integer,
|
|
rounding halfway cases to the nearest even integer;
|
|
@item @code{mpfr_rint_trunc} to the next integer toward zero.
|
|
@end itemize
|
|
If the result is not representable, it is rounded in the direction @var{rnd}.
|
|
When @var{op} is a zero or an infinity, set @var{rop} to the same value
|
|
(with the same sign).
|
|
The return value is the ternary value associated with the considered
|
|
round-to-integer function (regarded in the same way as any other
|
|
mathematical function).
|
|
|
|
Contrary to @code{mpfr_rint}, those functions do perform a double rounding:
|
|
first @var{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 @var{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, @code{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.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_frac (mpfr_t @var{rop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the fractional part of @var{op}, having the same sign as
|
|
@var{op}, rounded in the direction @var{rnd} (unlike in @code{mpfr_rint},
|
|
@var{rnd} affects only how the exact fractional part is rounded, not how
|
|
the fractional part is generated).
|
|
When @var{op} is an integer or an infinity, set @var{rop} to zero with
|
|
the same sign as @var{op}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_modf (mpfr_t @var{iop}, mpfr_t @var{fop}, mpfr_t @var{op}, mpfr_rnd_t @var{rnd})
|
|
Set simultaneously @var{iop} to the integral part of @var{op} and @var{fop} to
|
|
the fractional part of @var{op}, rounded in the direction @var{rnd} with the
|
|
corresponding precision of @var{iop} and @var{fop} (equivalent to
|
|
@code{mpfr_trunc(@var{iop}, @var{op}, @var{rnd})} and
|
|
@code{mpfr_frac(@var{fop}, @var{op}, @var{rnd})}). The variables @var{iop} and
|
|
@var{fop} must be different. Return 0 iff both results are exact (see
|
|
@code{mpfr_sin_cos} for a more detailed description of the return value).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_fmod (mpfr_t @var{r}, mpfr_t @var{x}, mpfr_t @var{y}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fmod_ui (mpfr_t @var{r}, mpfr_t @var{x}, unsigned long int @var{y}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_fmodquo (mpfr_t @var{r}, long int* @var{q}, mpfr_t @var{x}, mpfr_t @var{y}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_remainder (mpfr_t @var{r}, mpfr_t @var{x}, mpfr_t @var{y}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_remquo (mpfr_t @var{r}, long int* @var{q}, mpfr_t @var{x}, mpfr_t @var{y}, mpfr_rnd_t @var{rnd})
|
|
Set @var{r} to the value of @tm{@var{x} @minus{} @var{n}@var{y}}, rounded
|
|
according to the direction @var{rnd}, where @var{n} is the integer quotient
|
|
of @var{x} divided by @var{y}, defined as follows: @var{n} is rounded
|
|
toward zero for @code{mpfr_fmod}, @code{mpfr_fmod_ui} and @code{mpfr_fmodquo},
|
|
and to the nearest integer (ties rounded to even) for @code{mpfr_remainder}
|
|
and @code{mpfr_remquo}.
|
|
|
|
Special values are handled as described in Section@tie{}F.9.7.1 of
|
|
the ISO C99 standard:
|
|
If @var{x} is infinite or @var{y} is zero, @var{r} is NaN@.
|
|
If @var{y} is infinite and @var{x} is finite, @var{r} is @var{x} rounded
|
|
to the precision of @var{r}.
|
|
If @var{r} is zero, it has the sign of @var{x}.
|
|
The return value is the ternary value corresponding to @var{r}.
|
|
|
|
Additionally, @code{mpfr_fmodquo} and @code{mpfr_remquo} store
|
|
the low significant bits from the quotient @var{n} in @var{*q}
|
|
(more precisely the number of bits in a @code{long int} minus one),
|
|
with the sign of @var{x} divided by @var{y}
|
|
(except if those low bits are all zero, in which case zero is returned).
|
|
If the result is NaN, the value of @var{*q} is unspecified.
|
|
Note that @var{x} may be so large in magnitude relative to @var{y} that an
|
|
exact representation of the quotient is not practical.
|
|
The @code{mpfr_remainder} and @code{mpfr_remquo} functions are useful for
|
|
additive argument reduction.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_integer_p (mpfr_t @var{op})
|
|
Return non-zero iff @var{op} is an integer.
|
|
@end deftypefun
|
|
|
|
@node Rounding-Related Functions, Miscellaneous Functions, Integer and Remainder Related Functions, MPFR Interface
|
|
@cindex Rounding mode related functions
|
|
@section Rounding-Related Functions
|
|
|
|
@deftypefun void mpfr_set_default_rounding_mode (mpfr_rnd_t @var{rnd})
|
|
Set the default rounding mode to @var{rnd}.
|
|
The default rounding mode is to nearest initially.
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_rnd_t mpfr_get_default_rounding_mode (void)
|
|
Get the default rounding mode.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_prec_round (mpfr_t @var{x}, mpfr_prec_t @var{prec}, mpfr_rnd_t @var{rnd})
|
|
Round @var{x} according to @var{rnd} with precision @var{prec}, which
|
|
must be an integer between @code{MPFR_PREC_MIN} and @code{MPFR_PREC_MAX}
|
|
(otherwise the behavior is undefined).
|
|
If @var{prec} is greater than or equal to the precision of @var{x}, then
|
|
new space is allocated for the significand, and it is filled with zeros.
|
|
Otherwise, the significand is rounded to precision @var{prec} with the given
|
|
direction; no memory reallocation to free the unused limbs is done.
|
|
In both cases, the precision of @var{x} is changed to @var{prec}.
|
|
|
|
Here is an example of how to use @code{mpfr_prec_round} to implement
|
|
Newton's algorithm to compute the inverse of @var{a}, assuming @var{x} is
|
|
already an approximation to @var{n} bits:
|
|
@example
|
|
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 */
|
|
@end example
|
|
|
|
Warning! You must not use this function if @var{x} was initialized
|
|
with @code{MPFR_DECL_INIT} or with @code{mpfr_custom_init_set}
|
|
(@pxref{Custom Interface}).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_can_round (mpfr_t @var{b}, mpfr_exp_t @var{err}, mpfr_rnd_t @var{rnd1}, mpfr_rnd_t @var{rnd2}, mpfr_prec_t @var{prec})
|
|
Assuming @var{b} is an approximation of an unknown number
|
|
@var{x} in the direction @var{rnd1} with error at most two to the power
|
|
@tm{@EXP{}(@var{b}) @minus{} @var{err}} where @tm{@EXP{}(@var{b})}
|
|
is the exponent of @var{b},
|
|
return a non-zero value if one is able to round correctly @var{x} to
|
|
precision @var{prec} with the direction @var{rnd2} assuming an unbounded
|
|
exponent range, and 0 otherwise (including for NaN and Inf).
|
|
In other words, if the error on @var{b} is bounded by two to the power
|
|
@var{k}@tie{}ulps, and @var{b} has precision @var{prec},
|
|
you should give @tm{@var{err} = @var{prec} @minus{} @var{k}}.
|
|
This function @strong{does not modify} its arguments.
|
|
|
|
If @var{rnd1} is @code{MPFR_RNDN} or @code{MPFR_RNDF},
|
|
the error is considered to be either
|
|
positive or negative, thus the possible range
|
|
is twice as large as with a directed rounding for @var{rnd1} (with the
|
|
same value of @var{err}).
|
|
|
|
When @var{rnd2} is @code{MPFR_RNDF}, let @var{rnd3} be the opposite direction
|
|
if @var{rnd1} is a directed rounding, and @code{MPFR_RNDN}
|
|
if @var{rnd1} is @code{MPFR_RNDN} or @code{MPFR_RNDF}.
|
|
The returned value of @code{mpfr_can_round (b, err, rnd1, MPFR_RNDF, prec)}
|
|
is non-zero iff after
|
|
the call @code{mpfr_set (y, b, rnd3)} with @var{y} of precision @var{prec},
|
|
@var{y} is guaranteed to be a faithful rounding of @var{x}.
|
|
@c
|
|
@c For rnd1=RNDN, let [u,v] be the interval where x can lie, then mpfr_can_round
|
|
@c returns 1 exactly when either:
|
|
@c a) [u,v] contains a unique representable number y in precision prec,
|
|
@c and both u and v round to y with RNDN
|
|
@c b) [u,v] contains no representable number y in precision prec, then mpfr_set
|
|
@c will return either down(u) or up(v) which are both faithful roundings of x
|
|
@c (With rnd2=RNDN instead, mpfr_can_round would only return 1 in case a).
|
|
@c
|
|
@c For rnd1=RNDU, let [u,b] be the interval where x can lie (we have v=b since
|
|
@c rnd1=RNDU implies x <= b), then mpfr_can_round returns 1 exactly when either:
|
|
@c a) [u,b] contains a (unique) representable number y in precision prec,
|
|
@c then b rounds to y with rnd3=RNDD
|
|
@c b) [u,b] contains no representable number y in precision prec, then mpfr_set
|
|
@c will return down(u) which is a faithful rounding of x
|
|
@c (With rnd2 a directed rounding instead of RNDF, mpfr_can_round would only return
|
|
@c 1 in case b, apart from special cases where u or b are representable in precision
|
|
@c prec).
|
|
@c
|
|
@c Note: This spec is better than one avoiding "hard cases" (leaving
|
|
@c such cases indeterminate to have a mpfr_can_round in constant time).
|
|
@c Indeed, the time gained by having a mpfr_can_round without hard cases
|
|
@c would be lost by making the user recompute everything in a larger
|
|
@c precision if one could have returned non-zero instead of 0.
|
|
|
|
Note: The @ref{ternary value} cannot be determined in general with this
|
|
function. However, if it is known that the exact value is not exactly
|
|
representable in precision @var{prec}, then one can use the following
|
|
trick to determine the (non-zero) ternary value in any rounding mode
|
|
@var{rnd2} (note that @code{MPFR_RNDZ} below can be replaced by any
|
|
directed rounding mode):
|
|
@example
|
|
if (mpfr_can_round (b, err, MPFR_RNDN, MPFR_RNDZ,
|
|
prec + (rnd2 == MPFR_RNDN)))
|
|
@{
|
|
/* round the approximation b to the result r of prec bits
|
|
with rounding mode rnd2 and get the ternary value inex */
|
|
inex = mpfr_set (r, b, rnd2);
|
|
@}
|
|
@end example
|
|
Indeed, if @var{rnd2} is @code{MPFR_RNDN}, this will check if one can
|
|
round to @tm{@var{prec} + 1} bits with a directed rounding:
|
|
if so, one can surely round to nearest to @var{prec} bits,
|
|
and in addition one can determine the correct ternary value, which would not
|
|
be the case when @var{b} is near from a value exactly representable on
|
|
@var{prec} bits.
|
|
|
|
A detailed example is available in the @file{examples} subdirectory,
|
|
file @file{can_round.c}.
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_prec_t mpfr_min_prec (mpfr_t @var{x})
|
|
Return the minimal number of bits required to store the significand of
|
|
@var{x}, and 0 for special values, including 0.
|
|
@c This warning no longer holds now that MPFR_PREC_MIN=1.
|
|
@c Warning! The return value can be less than @code{MPFR_PREC_MIN},
|
|
@c in particular for the powers of two. If you use this function together
|
|
@c with @code{mpfr_prec_round} in order to reduce the memory space occupied
|
|
@c by a number, you may need to take the maximum of the returned precision
|
|
@c and @code{MPFR_PREC_MIN} for @code{mpfr_prec_round}.
|
|
@end deftypefun
|
|
|
|
@deftypefun {const char *} mpfr_print_rnd_mode (mpfr_rnd_t @var{rnd})
|
|
Return a string (@code{"MPFR_RNDN"}, @code{"MPFR_RNDZ"}, @code{"MPFR_RNDU"},
|
|
@code{"MPFR_RNDD"}, @code{"MPFR_RNDA"}, @code{"MPFR_RNDF"}) corresponding to
|
|
the rounding mode @var{rnd}, or a null pointer if @var{rnd} is an invalid
|
|
rounding mode.
|
|
@end deftypefun
|
|
|
|
@deftypefn Macro int mpfr_round_nearest_away (int (@var{foo})(mpfr_t, type1_t, ..., mpfr_rnd_t), mpfr_t @var{rop}, type1_t @var{op}, ...)
|
|
Given a function @var{foo} and one or more values @var{op} (which may be
|
|
a @code{mpfr_t}, a @code{long int}, a @code{double}, etc.), put in @var{rop}
|
|
the round-to-nearest-away rounding of @code{@var{foo}(@var{op},...)}.
|
|
This rounding is defined in the same way as round-to-nearest-even,
|
|
except in case of tie, where the value away from zero is returned.
|
|
The function @var{foo} takes as input, from second to
|
|
penultimate argument(s), the argument list given after @var{rop},
|
|
a rounding mode as final argument,
|
|
puts in its first argument the value @code{@var{foo}(@var{op},...)} rounded
|
|
according to this rounding mode, and returns the corresponding ternary value
|
|
(which is expected to be correct, otherwise @code{mpfr_round_nearest_away}
|
|
will not work as desired).
|
|
Due to implementation constraints, this function must not be called when
|
|
the minimal exponent @var{emin} is the smallest possible one.
|
|
This macro has been made such that the compiler is able to detect
|
|
mismatch between the argument list @var{op}
|
|
and the function prototype of @var{foo}.
|
|
Multiple input arguments @var{op} are supported only with C99 compilers.
|
|
Otherwise, for C90 compilers, only one such argument is supported.
|
|
|
|
Note: this macro is experimental and its interface might change in future
|
|
versions.
|
|
@example
|
|
unsigned long ul;
|
|
mpfr_t f, r;
|
|
/* Code that inits and sets r, f, and ul, and if needed sets emin */
|
|
int i = mpfr_round_nearest_away (mpfr_add_ui, r, f, ul);
|
|
@end example
|
|
@end deftypefn
|
|
|
|
@node Miscellaneous Functions, Exception Related Functions, Rounding-Related Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Miscellaneous float functions
|
|
@section Miscellaneous Functions
|
|
|
|
@deftypefun void mpfr_nexttoward (mpfr_t @var{x}, mpfr_t @var{y})
|
|
If @var{x} or @var{y} is NaN, set @var{x} to NaN; note that the NaN flag
|
|
is set as usual.
|
|
If @var{x} and @var{y} are equal, @var{x} is unchanged.
|
|
Otherwise, if @var{x} is different from @var{y}, replace @var{x} by the
|
|
next floating-point number (with the precision of @var{x} and the current
|
|
exponent range) in the direction of @var{y}
|
|
(the infinite values are seen as the smallest and largest floating-point
|
|
numbers). If the result is zero, it keeps the same sign. No underflow,
|
|
overflow, or inexact exception is raised.
|
|
@c For NaN, the behavior is like IEEE@tie{}754 with sNaN.
|
|
|
|
Note: Concerning the exceptions and the sign of 0, the behavior differs
|
|
from the ISO C @code{nextafter} and @code{nexttoward} functions. It is
|
|
similar to the nextUp and nextDown operations from IEEE 754 (introduced
|
|
in its 2008 revision).
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_nextabove (mpfr_t @var{x})
|
|
@deftypefunx void mpfr_nextbelow (mpfr_t @var{x})
|
|
Equivalent to @code{mpfr_nexttoward} where @var{y} is @mm{+}Inf
|
|
(resp.@: @minus{}Inf).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_min (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_max (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set @var{rop} to the minimum (resp.@: maximum)
|
|
of @var{op1} and @var{op2}. If @var{op1}
|
|
and @var{op2} are both NaN, then @var{rop} is set to NaN@. If @var{op1}
|
|
or @var{op2} is NaN, then @var{rop} is set to the numeric value. If
|
|
@var{op1} and @var{op2} are zeros of different signs, then @var{rop}
|
|
is set to @minus{}0 (resp.@: @mm{+}0).
|
|
As usual, the NaN flag is set only when the result is NaN, i.e.,
|
|
when both @var{op1} and @var{op2} are NaN@.
|
|
|
|
Note: These functions correspond to the minimumNumber and maximumNumber
|
|
operations of IEEE@tie{}754-2019 for the result. But in MPFR, the NaN flag
|
|
is set only when @emph{both} operands are NaN@.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_urandomb (mpfr_t @var{rop}, gmp_randstate_t @var{state})
|
|
Generate a uniformly distributed random float in the interval
|
|
@tm{0 @le{} @var{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 @var{e} denotes the exponent after normalization, then
|
|
the least @tm{@minus{}@var{e}} significant bits of the significand are always
|
|
0).
|
|
|
|
Return 0, unless the exponent is not in the current exponent range, in
|
|
which case @var{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 @code{gmp_randstate_t} structure, which should be
|
|
created using the GMP @code{gmp_randinit} function (see the GMP manual).
|
|
|
|
Note: for a given version of MPFR, the returned value of @var{rop} and the
|
|
new value of @var{state} (which controls further random values) do not depend
|
|
on the machine word size.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_urandom (mpfr_t @var{rop}, gmp_randstate_t @var{state}, mpfr_rnd_t @var{rnd})
|
|
Generate a uniformly distributed random float.
|
|
The floating-point number @var{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 @var{rnd}.
|
|
|
|
The second argument is a @code{gmp_randstate_t} structure, which should be
|
|
created using the GMP @code{gmp_randinit} function (see the GMP manual).
|
|
|
|
Note: the note for @code{mpfr_urandomb} holds too. Moreover, the exact number
|
|
(the random value to be rounded) and the next random state do not depend on
|
|
the current exponent range and the rounding mode. However, they depend on
|
|
the target precision: from the same state of the random generator, if the
|
|
precision of the destination is changed, then the value may be completely
|
|
different (and the state of the random generator is different too).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_nrandom (mpfr_t @var{rop1}, gmp_randstate_t @var{state}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_grandom (mpfr_t @var{rop1}, mpfr_t @var{rop2}, gmp_randstate_t @var{state}, mpfr_rnd_t @var{rnd})
|
|
Generate one (possibly two for @code{mpfr_grandom}) random floating-point
|
|
number according to a standard normal Gaussian distribution (with mean zero
|
|
and variance one). For @code{mpfr_grandom}, if @var{rop2} is a null pointer,
|
|
then only one value is generated and stored in @var{rop1}.
|
|
|
|
The floating-point number @var{rop1} (and @var{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 @var{rnd}.
|
|
|
|
The @code{gmp_randstate_t} argument should be
|
|
created using the GMP @code{gmp_randinit} function (see the GMP manual).
|
|
|
|
For @code{mpfr_grandom},
|
|
the combination of the ternary values is returned like with
|
|
@code{mpfr_sin_cos}. If @var{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 @code{mpfr_urandomb} holds too. In addition, the exponent
|
|
range and the rounding mode might have a side effect on the next random state.
|
|
|
|
Note: @code{mpfr_nrandom} is much more efficient than @code{mpfr_grandom},
|
|
especially for large precision. Thus @code{mpfr_grandom} is marked as
|
|
deprecated and will be removed in a future release.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_erandom (mpfr_t @var{rop1}, gmp_randstate_t @var{state}, mpfr_rnd_t @var{rnd})
|
|
Generate one random floating-point number according to an exponential
|
|
distribution, with mean one.
|
|
Other characteristics are identical to @code{mpfr_nrandom}.
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_exp_t mpfr_get_exp (mpfr_t @var{x})
|
|
Return the exponent of @var{x}, assuming that @var{x} is a non-zero ordinary
|
|
number and the significand is considered in [1/2,1). For this function,
|
|
@var{x} is allowed to be outside of the current range of acceptable values.
|
|
The behavior for NaN, infinity or zero is undefined.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_set_exp (mpfr_t @var{x}, mpfr_exp_t @var{e})
|
|
Set the exponent of @var{x} to @var{e} if @var{x} is a non-zero ordinary
|
|
number and @var{e} is in the current exponent range, and return 0;
|
|
otherwise, return a non-zero value (@var{x} is not changed).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_signbit (mpfr_t @var{op})
|
|
Return a non-zero value iff @var{op} has its sign bit set (i.e., if it is
|
|
negative, @minus{}0, or a NaN whose representation has its sign bit set).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_setsign (mpfr_t @var{rop}, mpfr_t @var{op}, int @var{s}, mpfr_rnd_t @var{rnd})
|
|
Set the value of @var{rop} from @var{op}, rounded toward the given
|
|
direction @var{rnd}, then set (resp.@: clear) its sign bit if @var{s}
|
|
is non-zero (resp.@: zero), even when @var{op} is a NaN@.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_copysign (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Set the value of @var{rop} from @var{op1}, rounded toward the given
|
|
direction @var{rnd}, then set its sign bit to that of @var{op2} (even
|
|
when @var{op1} or @var{op2} is a NaN)@. This function is equivalent to
|
|
@code{mpfr_setsign (@var{rop}, @var{op1}, mpfr_signbit (@var{op2}), @var{rnd})}.
|
|
@end deftypefun
|
|
|
|
@c By definition, a C string is always null-terminated, so that we
|
|
@c could just say "string" or "null-terminated character array",
|
|
@c but "null-terminated string" is not an error and probably better
|
|
@c for most users.
|
|
@deftypefun {const char *} mpfr_get_version (void)
|
|
Return the MPFR version, as a null-terminated string.
|
|
@end deftypefun
|
|
|
|
@defmac MPFR_VERSION
|
|
@defmacx MPFR_VERSION_MAJOR
|
|
@defmacx MPFR_VERSION_MINOR
|
|
@defmacx MPFR_VERSION_PATCHLEVEL
|
|
@defmacx MPFR_VERSION_STRING
|
|
@code{MPFR_VERSION} is the version of MPFR as a preprocessing constant.
|
|
@code{MPFR_VERSION_MAJOR}, @code{MPFR_VERSION_MINOR} and
|
|
@code{MPFR_VERSION_PATCHLEVEL} are respectively the major, minor and patch
|
|
level of MPFR version, as preprocessing constants.
|
|
@code{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 @code{mpfr_get_version} to check at run time
|
|
the header file and library used match:
|
|
@example
|
|
if (strcmp (mpfr_get_version (), MPFR_VERSION_STRING))
|
|
fprintf (stderr, "Warning: header and library do not match\n");
|
|
@end example
|
|
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).
|
|
@end defmac
|
|
|
|
@deftypefn Macro long MPFR_VERSION_NUM (@var{major}, @var{minor}, @var{patchlevel})
|
|
Create an integer in the same format as used by @code{MPFR_VERSION} from the
|
|
given @var{major}, @var{minor} and @var{patchlevel}.
|
|
Here is an example of how to check the MPFR version at compile time:
|
|
@example
|
|
#if (!defined(MPFR_VERSION) || (MPFR_VERSION < MPFR_VERSION_NUM(3,0,0)))
|
|
# error "Wrong MPFR version."
|
|
#endif
|
|
@end example
|
|
@end deftypefn
|
|
|
|
@deftypefun {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 @file{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).
|
|
@end deftypefun
|
|
|
|
@deftypefun 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
|
|
@samp{--enable-thread-safe} configure option, see @code{INSTALL} file),
|
|
return zero otherwise.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_buildopt_float128_p (void)
|
|
Return a non-zero value if MPFR was compiled with binary128 support
|
|
(a.k.a.@: float128), return zero otherwise. @xref{Nomenclature and Types}
|
|
for additional information.
|
|
@end deftypefun
|
|
|
|
@deftypefun 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 @samp{--enable-decimal-float} configure option),
|
|
return zero otherwise.
|
|
@end deftypefun
|
|
|
|
@deftypefun 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 @samp{--with-gmp-build} or
|
|
@samp{--enable-gmp-internals} configure option), return zero otherwise.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_buildopt_sharedcache_p (void)
|
|
Return a non-zero value if MPFR was compiled so that all threads share
|
|
the same cache for one MPFR constant, like @code{mpfr_const_pi} or
|
|
@code{mpfr_const_log2} (that is, MPFR was built with the
|
|
@samp{--enable-shared-cache} configure option), return zero otherwise.
|
|
If the return value is non-zero, MPFR applications may need to be compiled
|
|
with the @samp{-pthread} option.
|
|
@end deftypefun
|
|
|
|
@deftypefun {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.
|
|
@end deftypefun
|
|
|
|
@node Exception Related Functions, Memory Handling Functions, Miscellaneous Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Exception related functions
|
|
@section Exception Related Functions
|
|
|
|
@deftypefun mpfr_exp_t mpfr_get_emin (void)
|
|
@deftypefunx 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 @m{1/2 \times 2^{@var{emin}}, one half times 2 raised to the
|
|
smallest exponent} and the largest value has the form @m{(1 - \varepsilon)
|
|
\times 2^{@var{emax}}, (1 @minus{} epsilon) times 2 raised to the largest
|
|
exponent}, where @m{\varepsilon,epsilon} depends on the precision of the
|
|
considered variable.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_set_emin (mpfr_exp_t @var{exp})
|
|
@deftypefunx int mpfr_set_emax (mpfr_exp_t @var{exp})
|
|
Set the smallest and largest exponents allowed for a floating-point variable.
|
|
Return a non-zero value when @var{exp} is not in the range accepted by the
|
|
implementation (in that case the smallest or largest exponent is not changed),
|
|
and zero otherwise.
|
|
|
|
For the subsequent operations, it is the user's responsibility to check
|
|
that any floating-point value used as an input is in the new exponent range
|
|
(for example using @code{mpfr_check_range}). If a floating-point value
|
|
outside the new exponent range is used as an input, the default behavior
|
|
is undefined, in the sense of the ISO C standard; the behavior may also be
|
|
explicitly documented, such as for @code{mpfr_check_range}.
|
|
|
|
Note: Caches may still have values outside the current exponent range.
|
|
This is not an issue as the user cannot use these caches directly via
|
|
the API (MPFR extends the exponent range internally when need be).
|
|
|
|
If @tm{@var{emin} > @var{emax}} and a floating-point value needs to
|
|
be produced as output, the behavior is undefined (@code{mpfr_set_emin}
|
|
and @code{mpfr_set_emax} do not check this condition as it might occur
|
|
between successive calls to these two functions).
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_exp_t mpfr_get_emin_min (void)
|
|
@deftypefunx mpfr_exp_t mpfr_get_emin_max (void)
|
|
@deftypefunx mpfr_exp_t mpfr_get_emax_min (void)
|
|
@deftypefunx mpfr_exp_t mpfr_get_emax_max (void)
|
|
Return the minimum and maximum of the exponents
|
|
allowed for @code{mpfr_set_emin} and @code{mpfr_set_emax} respectively.
|
|
These values are implementation dependent, thus a program using
|
|
@code{mpfr_set_emax(mpfr_get_emax_max())}
|
|
or @code{mpfr_set_emin(mpfr_get_emin_min())} may not be portable.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_check_range (mpfr_t @var{x}, int @var{t}, mpfr_rnd_t @var{rnd})
|
|
This function assumes that @var{x} is the correctly rounded value of some
|
|
real value @var{y} in the direction @var{rnd} and some extended exponent
|
|
range, and that @var{t} is the corresponding @ref{ternary value}.
|
|
For example, one performed @code{t = mpfr_log (x, u, rnd)}, and @var{y} is the
|
|
exact logarithm of @var{u}.
|
|
Thus @var{t} is negative if @var{x} is smaller than @var{y},
|
|
positive if @var{x} is larger than @var{y}, and zero if @var{x} equals @var{y}.
|
|
This function modifies @var{x} if needed
|
|
to be in the current range of acceptable values: It
|
|
generates an underflow or an overflow if the exponent of @var{x} is
|
|
outside the current allowed range; the value of @var{t} may be used
|
|
to avoid a double rounding. This function returns zero if the new value of
|
|
@var{x} equals the exact one @var{y}, a positive value if that new value
|
|
is larger than @var{y}, and a negative value if it is smaller than @var{y}.
|
|
Note that unlike most functions,
|
|
the new result @var{x} is compared to the (unknown) exact one @var{y},
|
|
not the input value @var{x}, i.e., the ternary value is propagated.
|
|
|
|
Note: If @var{x} is an infinity and @var{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 @code{mpfr_check_range} is typically called
|
|
(at least in MPFR functions) after restoring the flags that could have
|
|
been set due to internal computations.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_subnormalize (mpfr_t @var{x}, int @var{t}, mpfr_rnd_t @var{rnd})
|
|
This function rounds @var{x} emulating subnormal number arithmetic:
|
|
if @var{x} is outside the subnormal exponent range of the emulated
|
|
floating-point system, this function just propagates the
|
|
@ref{ternary value} @var{t}; otherwise, if @tm{@EXP{}(@var{x})}
|
|
denotes the exponent of @var{x}, it rounds @var{x} to precision
|
|
@tm{@EXP{}(@var{x})@minus{}@var{emin}+1} according to rounding mode @var{rnd}
|
|
and previous ternary value @var{t}, avoiding double rounding problems.
|
|
More precisely in the subnormal domain, denoting by @tm{e} the value of
|
|
@var{emin}, @var{x} is rounded in fixed-point arithmetic to an integer
|
|
multiple of @m{2^{e-1},two to the power @w{e @minus{} 1}}; as a consequence,
|
|
@m{1.5 \times 2^{e-1},1.5 multiplied by two to the power @w{e @minus{} 1}}
|
|
when @var{t} is zero is rounded to @m{2^e,two to the power e} with rounding
|
|
to nearest.
|
|
|
|
The precision @tm{@PREC{}(@var{x})} of @var{x} is not modified by
|
|
this function. @var{rnd} and @var{t} must be the rounding mode
|
|
and the returned ternary value used when computing @var{x}
|
|
(as in @code{mpfr_check_range}). The subnormal exponent range is
|
|
from @var{emin} to @tm{@var{emin}+@PREC{}(@var{x})@minus{}2}.
|
|
If the result cannot be represented in the current exponent range of MPFR
|
|
(due to a too small @var{emax}), the behavior is undefined.
|
|
Note that unlike most functions, the result is compared to the exact one,
|
|
not the input value @var{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 @var{x} was in the
|
|
subnormal range), the underflow flag is set.
|
|
|
|
Warning! If you change @var{emin} (with @code{mpfr_set_emin}) just before
|
|
calling @code{mpfr_subnormalize}, you need to make sure that the value is
|
|
in the current exponent range of MPFR@. But it is better to change
|
|
@var{emin} before any computation, if possible.
|
|
@c Note: not necessarily possible if the user wants to emulate different
|
|
@c floating-point systems in the same code.
|
|
@end deftypefun
|
|
|
|
This is an example of how to emulate binary64 IEEE@tie{}754 arithmetic
|
|
(a.k.a.@: double precision) using MPFR:
|
|
|
|
@example
|
|
@{
|
|
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);
|
|
@}
|
|
@end example
|
|
|
|
Note that @code{mpfr_set_emin} and @code{mpfr_set_emax} are called early
|
|
enough in order to make sure that all computed values are in the current
|
|
exponent range.
|
|
Warning! This emulates a double IEEE@tie{}754 arithmetic with correct rounding
|
|
in the subnormal range, which may not be the case for your hardware.
|
|
|
|
Below is another example showing how to emulate fixed-point arithmetic
|
|
in a specific case.
|
|
Here we compute the sine of the integers 1 to 17 with a result in a
|
|
fixed-point arithmetic rounded at @m{2^{-42},two to the power @minus{}42}
|
|
(using the fact that the result is at most 1 in absolute value):
|
|
|
|
@need 400
|
|
@example
|
|
@{
|
|
mpfr_t x; int i, inex;
|
|
|
|
mpfr_set_emin (-41);
|
|
mpfr_init2 (x, 42);
|
|
for (i = 1; i <= 17; i++)
|
|
@{
|
|
mpfr_set_ui (x, i, MPFR_RNDN);
|
|
inex = mpfr_sin (x, x, MPFR_RNDZ);
|
|
mpfr_subnormalize (x, inex, MPFR_RNDZ);
|
|
mpfr_dump (x);
|
|
@}
|
|
mpfr_clear (x);
|
|
@}
|
|
@end example
|
|
|
|
@deftypefun void mpfr_clear_underflow (void)
|
|
@deftypefunx void mpfr_clear_overflow (void)
|
|
@deftypefunx void mpfr_clear_divby0 (void)
|
|
@deftypefunx void mpfr_clear_nanflag (void)
|
|
@deftypefunx void mpfr_clear_inexflag (void)
|
|
@deftypefunx void mpfr_clear_erangeflag (void)
|
|
Clear (lower) the underflow, overflow, divide-by-zero, invalid,
|
|
inexact and @emph{erange} flags.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_clear_flags (void)
|
|
Clear (lower) all global flags (underflow, overflow, divide-by-zero, invalid,
|
|
inexact, @emph{erange}). Note: a group of flags can be cleared by using
|
|
@code{mpfr_flags_clear}.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_set_underflow (void)
|
|
@deftypefunx void mpfr_set_overflow (void)
|
|
@deftypefunx void mpfr_set_divby0 (void)
|
|
@deftypefunx void mpfr_set_nanflag (void)
|
|
@deftypefunx void mpfr_set_inexflag (void)
|
|
@deftypefunx void mpfr_set_erangeflag (void)
|
|
Set (raise) the underflow, overflow, divide-by-zero, invalid,
|
|
inexact and @emph{erange} flags.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_underflow_p (void)
|
|
@deftypefunx int mpfr_overflow_p (void)
|
|
@deftypefunx int mpfr_divby0_p (void)
|
|
@deftypefunx int mpfr_nanflag_p (void)
|
|
@deftypefunx int mpfr_inexflag_p (void)
|
|
@deftypefunx int mpfr_erangeflag_p (void)
|
|
Return the corresponding (underflow, overflow, divide-by-zero, invalid,
|
|
inexact, @emph{erange}) flag, which is non-zero iff the flag is set.
|
|
@end deftypefun
|
|
|
|
The @code{mpfr_flags_} functions below that take an argument @var{mask}
|
|
can operate on any subset of the exception flags: a flag is part of this
|
|
subset (or group) if and only if the corresponding bit of the argument
|
|
@var{mask} is set. The @code{MPFR_FLAGS_} macros will normally be used
|
|
to build this argument. @xref{Exceptions}.
|
|
|
|
@deftypefun void mpfr_flags_clear (mpfr_flags_t @var{mask})
|
|
Clear (lower) the group of flags specified by @var{mask}.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_flags_set (mpfr_flags_t @var{mask})
|
|
Set (raise) the group of flags specified by @var{mask}.
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_flags_t mpfr_flags_test (mpfr_flags_t @var{mask})
|
|
Return the flags specified by @var{mask}. To test whether any flag from
|
|
@var{mask} is set, compare the return value to 0. You can also test
|
|
individual flags by AND'ing the result with @code{MPFR_FLAGS_} macros.
|
|
Example:
|
|
@example
|
|
mpfr_flags_t t = mpfr_flags_test (MPFR_FLAGS_UNDERFLOW|
|
|
MPFR_FLAGS_OVERFLOW)
|
|
@dots{}
|
|
if (t) /* underflow and/or overflow (unlikely) */
|
|
@{
|
|
if (t & MPFR_FLAGS_UNDERFLOW) @{ /* handle underflow */ @}
|
|
if (t & MPFR_FLAGS_OVERFLOW) @{ /* handle overflow */ @}
|
|
@}
|
|
@end example
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_flags_t mpfr_flags_save (void)
|
|
Return all the flags. It is equivalent to
|
|
@code{mpfr_flags_test(MPFR_FLAGS_ALL)}.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_flags_restore (mpfr_flags_t @var{flags}, mpfr_flags_t @var{mask})
|
|
Restore the flags specified by @var{mask} to their state represented
|
|
in @var{flags}.
|
|
@end deftypefun
|
|
|
|
@node Memory Handling Functions, Compatibility with MPF, Exception Related Functions, MPFR Interface
|
|
@comment node-name, next, previous, up
|
|
@cindex Memory handling functions
|
|
@section Memory Handling Functions
|
|
|
|
These are general functions concerning memory handling
|
|
(@pxref{Memory Handling}, for more information).
|
|
|
|
@deftypefun void mpfr_free_cache (void)
|
|
Free all caches and pools used by MPFR internally (those local to the
|
|
current thread and those shared by all threads).
|
|
You should call this function before terminating a thread, even if you did
|
|
not call @code{mpfr_const_*} functions directly (they could have been called
|
|
internally).
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_free_cache2 (mpfr_free_cache_t @var{way})
|
|
Free various caches and pools used by MPFR internally,
|
|
as specified by @var{way}, which is a set of flags:
|
|
@itemize @bullet
|
|
@item those local to the current thread if flag @code{MPFR_FREE_LOCAL_CACHE}
|
|
is set;
|
|
@item those shared by all threads if flag @code{MPFR_FREE_GLOBAL_CACHE}
|
|
is set.
|
|
@end itemize
|
|
The other bits of @var{way} are currently ignored and are reserved for
|
|
future use; they should be zero.
|
|
|
|
Note: @code{mpfr_free_cache2 (MPFR_FREE_LOCAL_CACHE | MPFR_FREE_GLOBAL_CACHE)}
|
|
is currently equivalent to @code{mpfr_free_cache()}.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_free_pool (void)
|
|
Free the pools used by MPFR internally.
|
|
Note: This function is automatically called after the thread-local caches
|
|
are freed (with @code{mpfr_free_cache} or @code{mpfr_free_cache2}).
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_mp_memory_cleanup (void)
|
|
This function should be called before calling @code{mp_set_memory_functions}.
|
|
@xref{Memory Handling}, for more information.
|
|
Zero is returned in case of success, non-zero in case of error.
|
|
Errors are currently not possible, but checking the return value
|
|
is recommended for future compatibility.
|
|
@end deftypefun
|
|
|
|
@node Compatibility with MPF, Custom Interface, Memory Handling Functions, MPFR Interface
|
|
@cindex Compatibility with MPF
|
|
@section Compatibility With MPF
|
|
|
|
A header file @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 @code{#include <gmp.h>} line,
|
|
@example
|
|
#include <mpfr.h>
|
|
#include <mpf2mpfr.h>
|
|
@end example
|
|
@noindent
|
|
many programs written for MPF can be compiled directly against MPFR
|
|
without any changes.
|
|
All operations are then performed with the default MPFR rounding mode,
|
|
which can be reset with @code{mpfr_set_default_rounding_mode}.
|
|
|
|
Warning! There are some differences. In particular:
|
|
@itemize @bullet
|
|
@item The precision is different: MPFR rounds to the exact number of bits
|
|
(zeroing trailing bits in the internal representation). Users may need to
|
|
increase the precision of their variables.
|
|
@item The exponent range is also different.
|
|
@item The formatted output functions (@code{gmp_printf}, etc.) will not work
|
|
for arguments of arbitrary-precision floating-point type (@code{mpf_t}, which
|
|
@file{mpf2mpfr.h} redefines as @code{mpfr_t}).
|
|
@item The output of @code{mpf_out_str} has a format slightly different from
|
|
the one of @code{mpfr_out_str} (concerning the position of the decimal-point
|
|
character, trailing zeros and the output of the value 0).
|
|
@end itemize
|
|
|
|
@deftypefun void mpfr_set_prec_raw (mpfr_t @var{x}, mpfr_prec_t @var{prec})
|
|
Reset the precision of @var{x} to be @strong{exactly} @var{prec} bits.
|
|
The only difference with @code{mpfr_set_prec} is that @var{prec} is assumed to
|
|
be small enough so that the significand fits into the current allocated memory
|
|
space for @var{x}. Otherwise the behavior is undefined.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_eq (mpfr_t @var{op1}, mpfr_t @var{op2}, unsigned long int @var{op3})
|
|
Return non-zero if @var{op1} and @var{op2} are both non-zero ordinary
|
|
numbers with the same exponent and the same first @var{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
|
|
@var{op3} larger than 1.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_reldiff (mpfr_t @var{rop}, mpfr_t @var{op1}, mpfr_t @var{op2}, mpfr_rnd_t @var{rnd})
|
|
Compute the relative difference between @var{op1} and @var{op2}
|
|
and store the result in @var{rop}.
|
|
This function does not guarantee the correct rounding on the relative
|
|
difference; it just computes @tm{|@var{op1} @minus{} @var{op2}| / @var{op1}},
|
|
using the precision of @var{rop} and the rounding mode @var{rnd} for all
|
|
operations.
|
|
@c VL: say that if op1 and op2 have the same precision and are close to
|
|
@c each other, then one gets correct rounding?
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_mul_2exp (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
@deftypefunx int mpfr_div_2exp (mpfr_t @var{rop}, mpfr_t @var{op1}, unsigned long int @var{op2}, mpfr_rnd_t @var{rnd})
|
|
These functions are identical to @code{mpfr_mul_2ui} and @code{mpfr_div_2ui}
|
|
respectively.
|
|
These functions are only kept for compatibility with MPF, one should
|
|
prefer @code{mpfr_mul_2ui} and @code{mpfr_div_2ui} otherwise.
|
|
@end deftypefun
|
|
|
|
|
|
@node Custom Interface, Internals, Compatibility with MPF, MPFR Interface
|
|
@cindex Custom interface
|
|
@section 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:
|
|
|
|
@itemize
|
|
|
|
@item Either directly store a floating-point number as a @code{mpfr_t}
|
|
on the stack.
|
|
|
|
@item Either store its own representation on the
|
|
stack and construct a new temporary @code{mpfr_t} each time it is needed.
|
|
|
|
@end itemize
|
|
|
|
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 @code{mpfr_custom_init (s, p)}
|
|
uses the macro, while @code{(mpfr_custom_init) (s, p)} uses the function.
|
|
The @code{mpfr_custom_init_set} macro is not usable in contexts where
|
|
an expression is expected, e.g., inside @code{for(...)} or before a
|
|
comma operator.
|
|
@c FIXME: In the future, an inline function could be used to avoid this
|
|
@c limitation.
|
|
|
|
Note 1: MPFR functions may still initialize temporary floating-point numbers
|
|
using @code{mpfr_init} and similar functions. See Custom Allocation (GNU MP)@.
|
|
|
|
Note 2: MPFR functions may use the cached functions (@code{mpfr_const_pi} for
|
|
example), even if they are not explicitly called. You have to call
|
|
@code{mpfr_free_cache} each time you garbage the memory iff @code{mpfr_init},
|
|
through GMP Custom Allocation, allocates its memory on the application stack.
|
|
|
|
@deftypefun size_t mpfr_custom_get_size (mpfr_prec_t @var{prec})
|
|
Return the needed size in bytes to store the significand of a floating-point
|
|
number of precision @var{prec}.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_custom_init (void *@var{significand}, mpfr_prec_t @var{prec})
|
|
Initialize a significand of precision @var{prec}, where
|
|
@var{significand} must be an area of @code{mpfr_custom_get_size (prec)} bytes
|
|
at least and be suitably aligned for an array of @code{mp_limb_t} (GMP type,
|
|
@pxref{Internals}).
|
|
@c PZ: give an example how to align?
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_custom_init_set (mpfr_t @var{x}, int @var{kind}, mpfr_exp_t @var{exp}, mpfr_prec_t @var{prec}, void *@var{significand})
|
|
Perform a dummy initialization of a @code{mpfr_t} and set it to:
|
|
@itemize
|
|
@item if @GMPabs{@var{kind}} = @code{MPFR_NAN_KIND}, @var{x} is set to NaN;
|
|
@item if @GMPabs{@var{kind}} = @code{MPFR_INF_KIND}, @var{x} is set to the
|
|
infinity of the same sign as @var{kind};
|
|
@item if @GMPabs{@var{kind}} = @code{MPFR_ZERO_KIND}, @var{x} is set to the
|
|
zero of the same sign as @var{kind};
|
|
@item if @GMPabs{@var{kind}} = @code{MPFR_REGULAR_KIND}, @var{x} is set to
|
|
the regular number whose sign is the one of @var{kind}, and whose exponent
|
|
and significand are given by @var{exp} and @var{significand}.
|
|
@end itemize
|
|
In all cases, @var{significand} will be used directly for further computing
|
|
involving @var{x}. This function does not allocate anything.
|
|
A floating-point number initialized with this function cannot be resized using
|
|
@code{mpfr_set_prec} or @code{mpfr_prec_round},
|
|
or cleared using @code{mpfr_clear}!
|
|
The @var{significand} must have been initialized with @code{mpfr_custom_init}
|
|
using the same precision @var{prec}.
|
|
@end deftypefun
|
|
|
|
@deftypefun int mpfr_custom_get_kind (mpfr_t @var{x})
|
|
Return the current kind of a @code{mpfr_t} as created by
|
|
@code{mpfr_custom_init_set}.
|
|
The behavior of this function for any @code{mpfr_t} not initialized
|
|
with @code{mpfr_custom_init_set} is undefined.
|
|
@end deftypefun
|
|
|
|
@deftypefun {void *} mpfr_custom_get_significand (mpfr_t @var{x})
|
|
Return a pointer to the significand used by a @code{mpfr_t} initialized with
|
|
@code{mpfr_custom_init_set}.
|
|
The behavior of this function for any @code{mpfr_t} not initialized
|
|
with @code{mpfr_custom_init_set} is undefined.
|
|
@end deftypefun
|
|
|
|
@deftypefun mpfr_exp_t mpfr_custom_get_exp (mpfr_t @var{x})
|
|
Return the exponent of @var{x}, assuming that @var{x} is a non-zero ordinary
|
|
number and the significand is considered in [1/2,1).
|
|
But if @var{x} is NaN, infinity or zero, contrary to @code{mpfr_get_exp}
|
|
(where the behavior is undefined), the return value is here an unspecified,
|
|
valid value of the @code{mpfr_exp_t} type.
|
|
The behavior of this function for any @code{mpfr_t} not initialized
|
|
with @code{mpfr_custom_init_set} is undefined.
|
|
@end deftypefun
|
|
|
|
@deftypefun void mpfr_custom_move (mpfr_t @var{x}, void *@var{new_position})
|
|
Inform MPFR that the significand of @var{x} has moved due to a garbage collect
|
|
and update its new position to @code{new_position}.
|
|
However, the application has to move the significand and the @code{mpfr_t}
|
|
itself.
|
|
The behavior of this function for any @code{mpfr_t} not initialized
|
|
with @code{mpfr_custom_init_set} is undefined.
|
|
@end deftypefun
|
|
|
|
@node Internals, , Custom Interface, MPFR Interface
|
|
@cindex Internals
|
|
@section Internals
|
|
|
|
@cindex Limb
|
|
@c @tindex @code{mp_limb_t}
|
|
@noindent
|
|
A @dfn{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 @code{mp_limb_t}.
|
|
|
|
The @code{mpfr_t} type is internally defined as a one-element
|
|
array of a structure, and @code{mpfr_ptr} is the C data type representing
|
|
a pointer to this structure.
|
|
The @code{mpfr_t} type consists of four fields:
|
|
|
|
@itemize @bullet
|
|
|
|
@item The @code{_mpfr_prec} field is used to store the precision of
|
|
the variable (in bits); this is not less than @code{MPFR_PREC_MIN}.
|
|
|
|
@item The @code{_mpfr_sign} field is used to store the sign of the variable.
|
|
|
|
@item The @code{_mpfr_exp} field stores the exponent.
|
|
An exponent of 0 means a radix point just above the most significant
|
|
limb. Non-zero values @tm{n} are a multiplier @tm{2^n} relative to that
|
|
point.
|
|
A NaN, an infinity and a zero are indicated by special values of the exponent
|
|
field.
|
|
|
|
@item Finally, the @code{_mpfr_d} field is a pointer to the limbs, least
|
|
significant limbs stored first.
|
|
The number of limbs in use is controlled by @code{_mpfr_prec}, namely
|
|
ceil(@code{_mpfr_prec}/@code{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.
|
|
|
|
@end itemize
|
|
|
|
@node API Compatibility, MPFR and the IEEE 754 Standard, MPFR Interface, Top
|
|
@chapter 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.
|
|
@comment This includes undefined 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
|
|
(@pxref{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::
|
|
@end menu
|
|
|
|
@node Type and Macro Changes, Added Functions, API Compatibility, API Compatibility
|
|
@section Type and Macro Changes
|
|
|
|
@comment r6789
|
|
The official type for exponent values changed from @code{mp_exp_t} to
|
|
@code{mpfr_exp_t} in MPFR@tie{}3.0. The type @code{mp_exp_t} will remain
|
|
available as it comes from GMP (with a different meaning). These types
|
|
are currently the same (@code{mpfr_exp_t} is defined as @code{mp_exp_t}
|
|
with @code{typedef}), so that programs can still use @code{mp_exp_t};
|
|
but this may change in the future.
|
|
Alternatively, using the following code after including @file{mpfr.h}
|
|
will work with official MPFR versions, as @code{mpfr_exp_t} was never
|
|
defined in MPFR@tie{}2.x:
|
|
@example
|
|
#if MPFR_VERSION_MAJOR < 3
|
|
typedef mp_exp_t mpfr_exp_t;
|
|
#endif
|
|
@end example
|
|
|
|
The official types for precision values and for rounding modes
|
|
respectively changed from @code{mp_prec_t} and @code{mp_rnd_t}
|
|
to @code{mpfr_prec_t} and @code{mpfr_rnd_t} in MPFR@tie{}3.0. This
|
|
change was actually done a long time ago in MPFR, at least since
|
|
MPFR@tie{}2.2.0, with the following code in @file{mpfr.h}:
|
|
@example
|
|
#ifndef mp_rnd_t
|
|
# define mp_rnd_t mpfr_rnd_t
|
|
#endif
|
|
#ifndef mp_prec_t
|
|
# define mp_prec_t mpfr_prec_t
|
|
#endif
|
|
@end example
|
|
This means that it is safe to use the new official types
|
|
@code{mpfr_prec_t} and @code{mpfr_rnd_t} in your programs.
|
|
The types @code{mp_prec_t} and @code{mp_rnd_t} (defined
|
|
in MPFR only) may be removed in the future, as the prefix
|
|
@code{mp_} is reserved by GMP@.
|
|
|
|
@comment r6787
|
|
The precision type @code{mpfr_prec_t} (@code{mp_prec_t}) was unsigned
|
|
before MPFR@tie{}3.0; it is now signed. @code{MPFR_PREC_MAX} has not
|
|
changed, though. Indeed the MPFR code requires that @code{MPFR_PREC_MAX} be
|
|
representable in the exponent type, which may have the same size as
|
|
@code{mpfr_prec_t} but has always been signed.
|
|
The consequence is that valid code that does not assume anything about
|
|
the signedness of @code{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
|
|
@code{mpfr_prec_t} is signed may be affected by this problem when
|
|
it is built and run against MPFR@tie{}2.x.
|
|
|
|
The rounding modes @code{GMP_RNDx} were renamed to @code{MPFR_RNDx}
|
|
in MPFR@tie{}3.0. However, the old names @code{GMP_RNDx} have been kept for
|
|
compatibility (this might change in future versions), using:
|
|
@example
|
|
#define GMP_RNDN MPFR_RNDN
|
|
#define GMP_RNDZ MPFR_RNDZ
|
|
#define GMP_RNDU MPFR_RNDU
|
|
#define GMP_RNDD MPFR_RNDD
|
|
@end example
|
|
The rounding mode ``round away from zero'' (@code{MPFR_RNDA}) was added in
|
|
MPFR@tie{}3.0 (however, no rounding mode @code{GMP_RNDA} exists).
|
|
Faithful rounding (@code{MPFR_RNDF}) was added in MPFR@tie{}4.0, but
|
|
currently, it is partially supported.
|
|
@c That's sufficient information for now. More should be said in future
|
|
@c versions (for instance, a user of 4.1 may want to know if this works
|
|
@c in 4.0).
|
|
|
|
The flags-related macros, whose name starts with @code{MPFR_FLAGS_},
|
|
were added in MPFR@tie{}4.0 (for the new functions @code{mpfr_flags_clear},
|
|
@code{mpfr_flags_restore}, @code{mpfr_flags_set} and @code{mpfr_flags_test},
|
|
in particular).
|
|
|
|
@node Added Functions, Changed Functions, Type and Macro Changes, API Compatibility
|
|
@section Added Functions
|
|
|
|
We give here in alphabetical order the functions (and function-like macros)
|
|
that were added after MPFR@tie{}2.2, and in which MPFR version.
|
|
|
|
@comment The functions are listed in such a way that if a developer wonders
|
|
@comment whether some function existed in some previous version, then he can
|
|
@comment find this very quickly.
|
|
|
|
@itemize @bullet
|
|
|
|
@item @code{mpfr_acospi} and @code{mpfr_acosu} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_add_d} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_ai} in MPFR@tie{}3.0 (incomplete, experimental).
|
|
|
|
@item @code{mpfr_asinpi} and @code{mpfr_asinu} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_asprintf} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_atan2pi} and @code{mpfr_atan2u} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_atanpi} and @code{mpfr_atanu} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_beta} in MPFR@tie{}4.0 (incomplete, experimental).
|
|
|
|
@item @code{mpfr_buildopt_decimal_p} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_buildopt_float128_p} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_buildopt_gmpinternals_p} in MPFR@tie{}3.1.
|
|
|
|
@item @code{mpfr_buildopt_sharedcache_p} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_buildopt_tls_p} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_buildopt_tune_case} in MPFR@tie{}3.1.
|
|
|
|
@item @code{mpfr_clear_divby0} in MPFR@tie{}3.1
|
|
(new divide-by-zero exception).
|
|
|
|
@item @code{mpfr_cmpabs_ui} in MPFR@tie{}4.1.
|
|
|
|
@item @code{mpfr_compound_si} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_copysign} in MPFR@tie{}2.3.
|
|
Note: MPFR@tie{}2.2 had a @code{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)@.
|
|
|
|
@item @code{mpfr_cospi} and @code{mpfr_cosu} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_custom_get_significand} in MPFR@tie{}3.0.
|
|
This function was named @code{mpfr_custom_get_mantissa} in previous
|
|
versions; @code{mpfr_custom_get_mantissa} is still available via a
|
|
macro in @file{mpfr.h}:
|
|
@example
|
|
#define mpfr_custom_get_mantissa mpfr_custom_get_significand
|
|
@end example
|
|
Thus code that needs to work with both MPFR@tie{}2.x and MPFR@tie{}3.x should
|
|
use @code{mpfr_custom_get_mantissa}.
|
|
|
|
@item @code{mpfr_d_div} and @code{mpfr_d_sub} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_digamma} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_divby0_p} in MPFR@tie{}3.1 (new divide-by-zero exception).
|
|
|
|
@item @code{mpfr_div_d} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_dot} in MPFR@tie{}4.1 (incomplete, experimental).
|
|
|
|
@item @code{mpfr_erandom} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_exp2m1} and @code{mpfr_exp10m1} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_flags_clear}, @code{mpfr_flags_restore},
|
|
@code{mpfr_flags_save}, @code{mpfr_flags_set} and @code{mpfr_flags_test}
|
|
in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_fmma} and @code{mpfr_fmms} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_fmod} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_fmodquo} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_fmod_ui} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_fms} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_fpif_export} and @code{mpfr_fpif_import} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_fprintf} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_free_cache2} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_free_pool} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_frexp} in MPFR@tie{}3.1.
|
|
|
|
@item @code{mpfr_gamma_inc} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_get_decimal128} in MPFR@tie{}4.1.
|
|
|
|
@item @code{mpfr_get_float128} in MPFR@tie{}4.0 if configured with
|
|
@samp{--enable-float128}.
|
|
|
|
@item @code{mpfr_get_flt} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_get_patches} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_get_q} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_get_str_ndigits} in MPFR@tie{}4.1.
|
|
|
|
@item @code{mpfr_get_z_2exp} in MPFR@tie{}3.0.
|
|
This function was named @code{mpfr_get_z_exp} in previous versions;
|
|
@code{mpfr_get_z_exp} is still available via a macro in @file{mpfr.h}:
|
|
@example
|
|
#define mpfr_get_z_exp mpfr_get_z_2exp
|
|
@end example
|
|
Thus code that needs to work with both MPFR@tie{}2.x and MPFR@tie{}3.x should
|
|
use @code{mpfr_get_z_exp}.
|
|
|
|
@item @code{mpfr_grandom} in MPFR@tie{}3.1.
|
|
|
|
@item @code{mpfr_j0}, @code{mpfr_j1} and @code{mpfr_jn} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_log2p1} and @code{mpfr_log10p1} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_lgamma} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_li2} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_log_ui} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_min_prec} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_modf} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_mp_memory_cleanup} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_mul_d} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_nrandom} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_powr}, @code{mpfr_pown}, @code{mpfr_pow_sj} and @code{mpfr_pow_uj} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_printf} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_rec_sqrt} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_regular_p} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_remainder} and @code{mpfr_remquo} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_rint_roundeven} and @code{mpfr_roundeven} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_round_nearest_away} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_rootn_si} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_rootn_ui} in MPFR@tie{}4.0.
|
|
|
|
@item @code{mpfr_set_decimal128} in MPFR@tie{}4.1.
|
|
|
|
@item @code{mpfr_set_divby0} in MPFR@tie{}3.1 (new divide-by-zero exception).
|
|
|
|
@item @code{mpfr_set_float128} in MPFR@tie{}4.0 if configured with
|
|
@samp{--enable-float128}.
|
|
|
|
@item @code{mpfr_set_flt} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_set_z_2exp} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_set_zero} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_setsign} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_signbit} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_sinh_cosh} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_sinpi} and @code{mpfr_sinu} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_snprintf} and @code{mpfr_sprintf} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_sub_d} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_tanpi} and @code{mpfr_tanu} in MPFR@tie{}4.2.
|
|
|
|
@item @code{mpfr_total_order_p} in MPFR@tie{}4.1.
|
|
|
|
@item @code{mpfr_urandom} in MPFR@tie{}3.0.
|
|
|
|
@item @code{mpfr_vasprintf}, @code{mpfr_vfprintf}, @code{mpfr_vprintf},
|
|
@code{mpfr_vsprintf} and @code{mpfr_vsnprintf} in MPFR@tie{}2.4.
|
|
|
|
@item @code{mpfr_y0}, @code{mpfr_y1} and @code{mpfr_yn} in MPFR@tie{}2.3.
|
|
|
|
@item @code{mpfr_z_sub} in MPFR@tie{}3.1.
|
|
|
|
@end itemize
|
|
|
|
@node Changed Functions, Removed Functions, Added Functions, API Compatibility
|
|
@section Changed Functions
|
|
|
|
The following functions and function-like macros have changed after
|
|
MPFR@tie{}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.
|
|
|
|
@itemize @bullet
|
|
|
|
@item The formatted output functions (@code{mpfr_printf}, etc.) have
|
|
slightly changed in MPFR@tie{}4.1 in the case where the precision field
|
|
is empty: trailing zeros were not output with the conversion specifier
|
|
@samp{e} / @samp{E} (the chosen precision was not fully specified and
|
|
it depended on the input value), and also on the value zero with the
|
|
conversion specifiers @samp{f} / @samp{F} / @samp{g} / @samp{G} (this
|
|
could partly be regarded as a bug); they are now kept in a way similar
|
|
to the formatted output functions from C@. Moreover, the case where the
|
|
precision consists only of a period has been fixed in MPFR@tie{}4.2 to
|
|
be like @samp{.0} as specified in the ISO C standard (it previously
|
|
behaved as a missing precision).
|
|
@c https://gforge.inria.fr/tracker/index.php?func=detail&aid=21816&group_id=136&atid=619
|
|
|
|
@item @code{mpfr_abs}, @code{mpfr_neg} and @code{mpfr_set} changed in
|
|
MPFR@tie{}4.0.
|
|
In previous MPFR versions, the sign bit of a NaN was unspecified; however,
|
|
in practice, it was set as now specified except for @code{mpfr_neg} with
|
|
a reused argument: @code{mpfr_neg(x,x,rnd)}.
|
|
|
|
@item @code{mpfr_check_range} changed in MPFR@tie{}2.3.2 and MPFR@tie{}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@tie{}2.3.2.
|
|
|
|
@item @code{mpfr_eint} changed in MPFR@tie{}4.0.
|
|
This function now returns the value of the E1/eint1 function for
|
|
negative argument (before MPFR@tie{}4.0, it was returning NaN)@.
|
|
|
|
@item @code{mpfr_get_f} changed in MPFR@tie{}3.0.
|
|
This function was returning zero, except for NaN and Inf, which do not
|
|
exist in MPF@. The @emph{erange} flag is now set in these cases,
|
|
and @code{mpfr_get_f} now returns the usual ternary value.
|
|
|
|
@item @code{mpfr_get_si}, @code{mpfr_get_sj}, @code{mpfr_get_ui}
|
|
and @code{mpfr_get_uj} changed in MPFR@tie{}3.0.
|
|
In previous MPFR versions, the cases where the @emph{erange} flag
|
|
is set were unspecified.
|
|
|
|
@item @code{mpfr_get_str} changed in MPFR@tie{}4.0.
|
|
This function now sets the NaN flag on NaN input (to follow the usual MPFR
|
|
rules on NaN and IEEE@tie{}754 recommendations on string conversions
|
|
from Subclause@tie{}5.12.1) and sets the inexact flag when the conversion
|
|
is inexact.
|
|
|
|
@item @code{mpfr_get_z} changed in MPFR@tie{}3.0.
|
|
The return type was @code{void}; it is now @code{int}, and the usual
|
|
ternary value is returned. Thus programs that need to work with both
|
|
MPFR@tie{}2.x and 3.x must not use the return value. Even in this case,
|
|
C code using @code{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@tie{}3.0, but not with MPFR@tie{}2.x:
|
|
@example
|
|
cond ? mpfr_get_z(...) : mpfr_add(...);
|
|
@end example
|
|
On the other hand, the following is correct with MPFR@tie{}2.x, but not
|
|
with MPFR@tie{}3.0:
|
|
@example
|
|
cond ? mpfr_get_z(...) : (void) mpfr_add(...);
|
|
@end example
|
|
Portable code should cast @code{mpfr_get_z(...)} to @code{void} to
|
|
use the type @code{void} for both terms of the conditional operator,
|
|
as in:
|
|
@example
|
|
cond ? (void) mpfr_get_z(...) : (void) mpfr_add(...);
|
|
@end example
|
|
Alternatively, @code{if ... else} can be used instead of the
|
|
conditional operator.
|
|
|
|
Moreover the cases where the @emph{erange} flag is set were unspecified
|
|
in MPFR@tie{}2.x.
|
|
|
|
@item @code{mpfr_get_z_exp} changed in MPFR@tie{}3.0.
|
|
In previous MPFR versions, the cases where the @emph{erange} flag
|
|
is set were unspecified.
|
|
Note: this function has been renamed to @code{mpfr_get_z_2exp}
|
|
in MPFR@tie{}3.0, but @code{mpfr_get_z_exp} is still available for
|
|
compatibility reasons.
|
|
|
|
@item @code{mpfr_out_str} changed in MPFR@tie{}4.1.
|
|
The argument @var{base} can now be negative (from @minus{}2 to
|
|
@minus{}36), in order to follow @code{mpfr_get_str} and GMP's
|
|
@code{mpf_out_str} functions.
|
|
|
|
@item @code{mpfr_set_exp} changed in MPFR@tie{}4.0.
|
|
Before MPFR@tie{}4.0, the exponent was set whatever the contents of the MPFR
|
|
object in argument. In practice, this could be useful as a low-level
|
|
function when the MPFR number was being constructed by setting the fields
|
|
of its internal structure, but the API does not provide a way to do this
|
|
except by using internals. Thus, for the API, this behavior was useless
|
|
and could quickly lead to undefined behavior due to the fact that the
|
|
generated value could have an invalid format if the MPFR object contained
|
|
a special value (NaN, infinity or zero).
|
|
|
|
@item @code{mpfr_strtofr} changed in MPFR@tie{}2.3.1 and MPFR@tie{}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 @samp{0b} or
|
|
@samp{0x} prefix. Data corresponding to NaN can now have an optional
|
|
sign (such data were previously invalid).
|
|
|
|
@item @code{mpfr_strtofr} changed in MPFR@tie{}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@tie{}2.3.1 and later,
|
|
providing an unsupported base yields an assertion failure (this
|
|
behavior may change in the future).
|
|
|
|
@item @code{mpfr_subnormalize} changed in MPFR@tie{}3.1.
|
|
This was actually regarded as a bug fix. The @code{mpfr_subnormalize}
|
|
implementation up to MPFR@tie{}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.
|
|
|
|
@item @code{mpfr_sum} changed in MPFR@tie{}4.0.
|
|
The @code{mpfr_sum} function has completely been rewritten for MPFR@tie{}4.0,
|
|
with an update of the specification: the sign of an exact zero result
|
|
is now specified, and the return value is now the usual ternary value.
|
|
The old @code{mpfr_sum} implementation could also take all the memory
|
|
and crash on inputs of very different magnitude.
|
|
|
|
@item @code{mpfr_urandom} and @code{mpfr_urandomb} changed in MPFR@tie{}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
|
|
@code{gmp_randinit_default} is used). As a consequence, the returned values
|
|
can be different between MPFR@tie{}3.1 and previous MPFR versions.
|
|
Note: as the reproducibility of these functions was not specified
|
|
before MPFR@tie{}3.1, the MPFR@tie{}3.1 behavior is @emph{not} regarded as
|
|
backward incompatible with previous versions.
|
|
|
|
@item @code{mpfr_urandom} changed in MPFR@tie{}4.0.
|
|
The next random state no longer depends on the current exponent range and
|
|
the rounding mode. The exceptions due to the rounding of the random number
|
|
are now correctly generated, following the uniform distribution.
|
|
As a consequence, the returned values can be different between MPFR@tie{}4.0
|
|
and previous MPFR versions.
|
|
|
|
@item Up to MPFR@tie{}4.1.0, some macros of the @ref{Custom Interface} had
|
|
undocumented limitations. In particular, their arguments may be evaluated
|
|
multiple times or none.
|
|
|
|
@end itemize
|
|
|
|
@node Removed Functions, Other Changes, Changed Functions, API Compatibility
|
|
@section Removed Functions
|
|
|
|
Functions @code{mpfr_random} and @code{mpfr_random2} have been
|
|
removed in MPFR@tie{}3.0 (this only affects old code built against
|
|
MPFR@tie{}3.0 or later).
|
|
(The function @code{mpfr_random} had been deprecated since at least
|
|
MPFR@tie{}2.2.0, and @code{mpfr_random2} since MPFR@tie{}2.4.0.)
|
|
|
|
Macros @code{mpfr_add_one_ulp} and @code{mpfr_sub_one_ulp} have been
|
|
removed in MPFR@tie{}4.0. They were no longer documented since
|
|
MPFR@tie{}2.1.0 and were announced as deprecated since MPFR@tie{}3.1.0.
|
|
|
|
Function @code{mpfr_grandom} is marked as deprecated in MPFR@tie{}4.0.
|
|
It will be removed in a future release.
|
|
|
|
@node Other Changes, , Removed Functions, API Compatibility
|
|
@section Other Changes
|
|
|
|
@comment r6699
|
|
For users of a C++ compiler, the way how the availability of @code{intmax_t}
|
|
is detected has changed in MPFR@tie{}3.0.
|
|
In MPFR@tie{}2.x, if a macro @code{INTMAX_C} or @code{UINTMAX_C} was defined
|
|
(e.g. when the @code{__STDC_CONSTANT_MACROS} macro had been defined
|
|
before @code{<stdint.h>} or @code{<inttypes.h>} has been included),
|
|
@code{intmax_t} was assumed to be defined.
|
|
However, this was not always the case (more precisely, @code{intmax_t}
|
|
can be defined only in the namespace @code{std}, as with Boost), so
|
|
that compilations could fail.
|
|
Thus the check for @code{INTMAX_C} or @code{UINTMAX_C} is now disabled for
|
|
C++ compilers, with the following consequences:
|
|
|
|
@itemize
|
|
|
|
@item Programs written for MPFR@tie{}2.x that need @code{intmax_t} may no
|
|
longer be compiled against MPFR@tie{}3.0: a @code{#define MPFR_USE_INTMAX_T}
|
|
may be necessary before @file{mpfr.h} is included.
|
|
|
|
@item The compilation of programs that work with MPFR@tie{}3.0 may fail with
|
|
MPFR@tie{}2.x due to the problem described above. Workarounds are possible,
|
|
such as defining @code{intmax_t} and @code{uintmax_t} in the global
|
|
namespace, though this is not clean.
|
|
|
|
@end itemize
|
|
|
|
The divide-by-zero exception is new in MPFR@tie{}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@tie{}3.1, the @file{mpfr.h} header can be included several times,
|
|
while still supporting optional functions (@pxref{Headers and Libraries}).
|
|
|
|
The way memory is allocated by MPFR should be regarded as well-specified
|
|
only as of MPFR@tie{}4.0.
|
|
|
|
@node MPFR and the IEEE 754 Standard, Contributors, API Compatibility, Top
|
|
@chapter MPFR and the IEEE 754 Standard
|
|
|
|
This section describes differences between MPFR and the IEEE@tie{}754
|
|
standard, and behaviors that are not specified yet in IEEE@tie{}754.
|
|
|
|
The MPFR numbers do not include subnormals. The reason is that subnormals
|
|
are less useful than in IEEE@tie{}754 as the default exponent range in MPFR
|
|
is large and they would have made the implementation more complex.
|
|
However, subnormals can be emulated using @code{mpfr_subnormalize}.
|
|
|
|
MPFR has a single NaN@. The behavior is similar either to a signaling NaN or
|
|
to a quiet NaN, depending on the context. For any function returning a NaN
|
|
(either produced or propagated), the NaN flag is set, while in IEEE@tie{}754,
|
|
some operations are quiet (even on a signaling NaN)@.
|
|
|
|
The @code{mpfr_rec_sqrt} function differs from IEEE@tie{}754 on @minus{}0,
|
|
where it gives @mm{+}Inf (like for @mm{+}0), following the usual limit rules,
|
|
instead of @minus{}Inf.
|
|
|
|
The @code{mpfr_root} function predates IEEE@tie{}754-2008, where rootn was
|
|
introduced, and behaves differently from the IEEE@tie{}754 rootn operation.
|
|
It is deprecated and @code{mpfr_rootn_ui} should be used instead.
|
|
|
|
@c The following paragraph should cover functions like mpfr_div_ui and
|
|
@c mpfr_log_ui. There are no issues with mpfr_pow_{ui,si,z} because the
|
|
@c IEEE 754 pown operation agrees with mpfr_pow.
|
|
@c Discussions:
|
|
@c https://sympa.inria.fr/sympa/arc/mpfr/2017-04/msg00019.html
|
|
@c https://sympa.inria.fr/sympa/arc/mpfr/2017-11/msg00009.html
|
|
@c https://sympa.inria.fr/sympa/arc/mpfr/2017-12/msg00008.html
|
|
|
|
Operations with an unsigned zero: For functions taking an argument of
|
|
integer or rational type, a zero of such a type is unsigned unlike the
|
|
floating-point zero (this includes the zero of type @code{unsigned long},
|
|
which is a mathematical, exact zero, as opposed to a floating-point zero,
|
|
which may come from an underflow and whose sign would correspond to the
|
|
sign of the real non-zero value). Unless documented otherwise, this zero
|
|
is regarded as @mm{+}0, as if it were first converted to a MPFR number with
|
|
@code{mpfr_set_ui} or @code{mpfr_set_si} (thus the result may not agree
|
|
with the usual limit rules applied to a mathematical zero). This is not
|
|
the case of addition and subtraction (@code{mpfr_add_ui}, etc.), but for
|
|
these functions, only the sign of a zero result would be affected, with
|
|
@mm{+}0 and @minus{}0 considered equal.
|
|
Such operations are currently out of the scope of the IEEE@tie{}754 standard,
|
|
and at the time of specification in MPFR, the Floating-Point Working Group
|
|
in charge of the revision of IEEE@tie{}754 did not want to discuss issues with
|
|
non-floating-point types in general.
|
|
|
|
Note also that some obvious differences may come from the fact that in
|
|
MPFR, each variable has its own precision. For instance, a subtraction
|
|
of two numbers of the same sign may yield an overflow; idem for a call
|
|
to @code{mpfr_set}, @code{mpfr_neg} or @code{mpfr_abs}, if the destination
|
|
variable has a smaller precision.
|
|
|
|
@node Contributors, References, MPFR and the IEEE 754 Standard, Top
|
|
@comment node-name, next, previous, up
|
|
@unnumbered Contributors
|
|
|
|
The main developers of MPFR are Guillaume Hanrot, Vincent Lef@`evre,
|
|
Patrick P@'elissier, Philippe Th@'eveny and Paul Zimmermann.
|
|
|
|
Sylvie Boldo from ENS-Lyon, France,
|
|
contributed the functions @code{mpfr_agm} and @code{mpfr_log}.
|
|
Sylvain Chevillard contributed the @code{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 @code{mpfr_get_str}
|
|
function.
|
|
Mathieu Dutour contributed the functions @code{mpfr_acos}, @code{mpfr_asin}
|
|
and @code{mpfr_atan}, and a previous version of @code{mpfr_gamma}.
|
|
Laurent Fousse contributed the original version of the @code{mpfr_sum}
|
|
function (used up to MPFR@tie{}3.1).
|
|
Emmanuel Jeandel, from ENS-Lyon too,
|
|
contributed the generic hypergeometric code,
|
|
as well as the internal function @code{mpfr_exp3},
|
|
a first implementation of the sine and cosine,
|
|
and improved versions of
|
|
@code{mpfr_const_log2} and @code{mpfr_const_pi}.
|
|
Ludovic Meunier helped in the design of the @code{mpfr_erf} code.
|
|
Jean-Luc R@'emy contributed the @code{mpfr_zeta} code.
|
|
Fabrice Rouillier contributed the @code{mpfr_xxx_z} and @code{mpfr_xxx_q}
|
|
functions, and helped to the Microsoft Windows porting.
|
|
Damien Stehl@'e contributed the @code{mpfr_get_ld_2exp} function.
|
|
Charles Karney contributed the @code{mpfr_nrandom} and @code{mpfr_erandom}
|
|
functions.
|
|
|
|
We would like to thank Jean-Michel Muller and Joris van der Hoeven for very
|
|
fruitful discussions at the beginning of that project, Torbj@"orn 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@'enaire, AriC and Pascaline 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@'egional de Lorraine in 2002,
|
|
from INRIA by an "associate engineer" grant (2003-2005),
|
|
an "op@'eration de d@'eveloppement logiciel" grant (2007-2009),
|
|
and the post-doctoral grant of Sylvain Chevillard in 2009-2010.
|
|
The MPFR-MPC workshop in June 2012 was partly supported by the ERC
|
|
grant ANTICS of Andreas Enge.
|
|
The MPFR-MPC workshop in January 2013 was partly supported by the ERC
|
|
grant ANTICS, the GDR IM and the Caramel project-team, during which
|
|
Mickaël Gastineau contributed the MPFRbench program,
|
|
Fredrik Johansson a faster version of @code{mpfr_const_euler},
|
|
and Jianyang Pan a formally proven version of the @code{mpfr_add1sp1}
|
|
internal routine.
|
|
|
|
@node References, GNU Free Documentation License, Contributors, Top
|
|
@comment node-name, next, previous, up
|
|
@unnumbered References
|
|
|
|
@itemize @bullet
|
|
|
|
@item
|
|
Richard Brent and Paul Zimmermann,
|
|
"Modern Computer Arithmetic",
|
|
Cambridge University Press,
|
|
Cambridge Monographs on Applied and Computational Mathematics,
|
|
Number 18, 2010.
|
|
Electronic version freely available at
|
|
@url{https://members.loria.fr/PZimmermann/mca/pub226.html}.
|
|
|
|
@item
|
|
Laurent Fousse, Guillaume Hanrot, Vincent Lef@`evre,
|
|
Patrick P@'elissier 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,
|
|
@url{https://doi.org/10.1145/1236463.1236468}.
|
|
|
|
@item
|
|
Torbj@"orn Granlund, "GNU MP: The GNU Multiple Precision Arithmetic Library",
|
|
version 6.1.2, 2016, @url{https://gmplib.org/}.
|
|
|
|
@item
|
|
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.
|
|
|
|
@item
|
|
IEEE Standard for Floating-Point Arithmetic,
|
|
IEEE Standard 754-2008, 2008.
|
|
Revision of IEEE Standard 754-1985,
|
|
approved June 12, 2008: IEEE-SA Standards Board, 70 pages.
|
|
|
|
@item
|
|
IEEE Standard for Floating-Point Arithmetic,
|
|
IEEE Standard 754-2019, 2019.
|
|
Revision of IEEE Standard 754-2008,
|
|
approved June 13, 2019: IEEE-SA Standards Board, 84 pages.
|
|
|
|
@item
|
|
Donald E.@: Knuth, "The Art of Computer Programming", vol 2,
|
|
"Seminumerical Algorithms", 2nd edition, Addison-Wesley, 1981.
|
|
|
|
@item
|
|
Jean-Michel Muller, "Elementary Functions, Algorithms and Implementation",
|
|
Birkh@"auser, Boston, 3rd edition, 2016.
|
|
|
|
@item
|
|
Jean-Michel Muller, Nicolas Brisebarre, Florent de Dinechin,
|
|
Claude-Pierre Jeannerod, Vincent Lef@`evre, Guillaume Melquiond,
|
|
Nathalie Revol, Damien Stehl@'e and Serge Torr@`es,
|
|
"Handbook of Floating-Point Arithmetic",
|
|
Birkh@"auser, Boston, 2009.
|
|
|
|
@end itemize
|
|
|
|
|
|
@node GNU Free Documentation License, Concept Index, References, Top
|
|
@appendix GNU Free Documentation License
|
|
@cindex GNU Free Documentation License
|
|
@include fdl.texi
|
|
|
|
|
|
@node Concept Index, Function and Type Index, GNU Free Documentation License, Top
|
|
@comment node-name, next, previous, up
|
|
@unnumbered Concept Index
|
|
@printindex cp
|
|
|
|
@node Function and Type Index, , Concept Index, Top
|
|
@comment node-name, next, previous, up
|
|
@unnumbered Function and Type Index
|
|
@printindex fn
|
|
|
|
@bye
|
|
|
|
@c Local variables:
|
|
@c fill-column: 78
|
|
@c End:
|