[Gmpcommit] /var/hg/gmp: Rewrite mpf introduction.
mercurial at gmplib.org
mercurial at gmplib.org
Sat Oct 31 19:04:21 UTC 2015
details: /var/hg/gmp/rev/44286f32c22e
changeset: 16920:44286f32c22e
user: Torbjorn Granlund <torbjorng at google.com>
date: Sat Oct 31 20:04:07 2015 +0100
description:
Rewrite mpf introduction.
diffstat:
doc/gmp.texi  45 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 21 deletions()
diffs (66 lines):
diff r 9290d50bb9cf r 44286f32c22e doc/gmp.texi
 a/doc/gmp.texi Fri Oct 30 19:00:28 2015 +0100
+++ b/doc/gmp.texi Sat Oct 31 20:04:07 2015 +0100
@@ 4174,7 +4174,7 @@
mp_limb_t *xp;
n = mpz_size (x);
 xp = mpz_limbs_modify(x, 2*n);
+ xp = mpz_limbs_modify (x, 2*n);
for (i = 0; i < n; i++)
xp[n+i] = xp[n1i];
mpz_limbs_finish (x, mpz_sgn (x) < 0 ?  2*n : 2*n);
@@ 4550,30 +4550,33 @@
GMP floating point numbers are stored in objects of type @code{mpf_t} and
functions operating on them have an @code{mpf_} prefix.
The mantissa of each float has a userselectable precision, limited only by
available memory. Each variable has its own precision, and that can be
increased or decreased at any time.

The exponent of each float is a fixed precision, one machine word on most
+The mantissa of each float has a userselectable precision, in practice only
+limited by available memory. Each variable has its own precision, and that can
+be increased or decreased at any time. This selectable precision is a minimum
+value, GMP rounds it up to a whole limb.
+
+The accuracy of a calculation is determined by the priorly set precision of the
+destination variable and the numeric values of the input variables. Input
+variables' set precisions do not affect calculations (except indirectly as
+their values might have been affected when they were assigned).
+
+The exponent of each float has fixed precision, one machine word on most
systems. In the current implementation the exponent is a count of limbs, so
for example on a 32bit system this means a range of roughly
@math{2^@W{68719476768}} to @math{2^@W{68719476736}}, or on a 64bit system
this will be greater. Note however that @code{mpf_get_str} can only return an
exponent which fits an @code{mp_exp_t} and currently @code{mpf_set_str}
doesn't accept exponents bigger than a @code{long}.

Each variable keeps a size for the mantissa data actually in use. This means
+this will be much greater. Note however that @code{mpf_get_str} can only
+return an exponent which fits an @code{mp_exp_t} and currently
+ at code{mpf_set_str} doesn't accept exponents bigger than a @code{long}.
+
+Each variable keeps track of the mantissa data actually in use. This means
that if a float is exactly represented in only a few bits then only those bits
will be used in a calculation, even if the selected precision is high.

All calculations are performed to the precision of the destination variable.
Each function calculate with ``higher'' precision then truncate to the
destination precision.

The precision selected by the user for a variable is a minimum value, GMP may
increase it to facilitate efficient calculation. Currently this means
rounding up to a whole limb, and then sometimes having a further partial limb,
depending on the high limb of the mantissa.
+will be used in a calculation, even if the variable's selected precision is
+high. This is a performance optimization; it does not affect the numeric
+results.
+
+Internally, GMP sometimes calculates with higher precision than that of the
+destination variable in order to limit errors. Final results are always
+truncated to the destination variable's precision.
The mantissa is stored in binary. One consequence of this is that decimal
fractions like @math{0.1} cannot be represented exactly. The same is true of
More information about the gmpcommit
mailing list