Rmpfr – Utilities for Precision Setting, Printing, etc
This page documents utilities from package Rmpfr which are typically not called by the user, but may come handy in some situations.
Notably, the (base-2) maximal (and minimal) precision and the
“erange”, the range of possible (base-2) exponents of
mpfr
-numbers can be queried and partly extended.
getPrec(x, base = 10, doNumeric = TRUE, is.mpfr = NA, bigq. = 128L) .getPrec(x) getD(x) mpfr_default_prec(prec) ## S3 method for class 'mpfrArray' print(x, digits = NULL, drop0trailing = FALSE, right = TRUE, max.digits = getOption("Rmpfr.print.max.digits", 999L), exponent.plus = getOption("Rmpfr.print.exponent.plus", TRUE), ...) ## S3 method for class 'mpfr' print(x, digits = NULL, drop0trailing = TRUE, right = TRUE, max.digits = getOption("Rmpfr.print.max.digits", 999L), exponent.plus = getOption("Rmpfr.print.exponent.plus", TRUE), ...) toNum(from, rnd.mode = c('N','D','U','Z','A')) mpfr2array(x, dim, dimnames = NULL, check = FALSE) .mpfr2list(x, names = FALSE) mpfrXport(x, names = FALSE) mpfrImport(mxp) .mpfr_formatinfo(x) .mpfr2exp(x) .mpfr_erange(kind = c("Emin", "Emax"), names = TRUE) .mpfr_erange_set(kind = c("Emin", "Emax"), value) .mpfr_erange_kinds .mpfr_erange_is_int() .mpfr_maxPrec() .mpfr_minPrec()
x, from |
typically, an R object of class |
base |
(only when |
doNumeric |
logical indicating |
is.mpfr |
logical indicating if |
bigq. |
for |
prec |
a positive integer, or missing. |
drop0trailing |
logical indicating if trailing |
right |
logical indicating |
digits, ... |
further arguments to print methods. |
max.digits |
a number (possibly |
exponent.plus |
logical, simply passed to |
rnd.mode |
a 1-letter string specifying how rounding
should happen at C-level conversion to MPFR, see details of
|
dim, dimnames |
for |
check |
logical indicating if the mpfrArray construction should happen with internal safety check. Previously, the implicit default used to be true. |
names |
(for |
mxp |
an |
kind |
a |
value |
|
Note that formatMpfr()
which is called by print()
(or show()
or R's implicit printing) uses max.digits =
Inf
, differing from our print()
's default on purpose.
If you do want to see the full accuracy even in cases it is large, use
options(Rmpfr.print.max.digits = Inf)
or
(.. = 1e7)
, say.
The .mpfr_erange*
functions (and variable) allow to query and set
the allowed range of values for the base-2 exponents of
"mpfr"
numbers.
See the examples below and GNU MPFR library documentation on the C functions
mpfr_get_emin()
, mpfr_set_emin(.)
,
mpfr_get_emin_min()
, and mpfr_get_emin_max()
,
(and those four with ‘_emin’ replaced by ‘_emax’ above).
.getPrec(x)
is a simplified version of getPrec()
which only
works for "mpfr"
objects x
.
getD(x)
is intended to be a fast version of x@.Data
,
and should not be used outside of lower level functions.
mpfr_default_prec()
returns the current MPFR default precision,
an integer
. This is currently
not made use of much in package Rmpfr, where functions have
their own default precision where needed, and otherwise we'd rather not
be dependent of such a global setting.
mpfr_default_prec(prec)
sets the current MPFR default
precision and returns the previous one; see above.
.mpfr_maxPrec()
and (less interestingly) .mpfr_minPrec()
give the maximal and minimal base-2 precision allowed in the current
version of the MPFR library linked to by R package Rmpfr.
The maximal precision is typically 2^{63}, i.e.,
all.equal(.mpfr_maxPrec(), 2^63)
is typically true.
toNum(m)
returns a numeric array
or
matrix
, when m
is of class
"mpfrArray"
or "mpfrMatrix"
,
respectively. It should be equivalent to as(m, "array")
or
... "matrix"
. Note that the slightly more general
asNumeric()
is preferred now.
mpfr2array()
a slightly more flexible alternative to
dim(.) <- dd
.
.mpfr2exp(x)
returns the base-2 (integer valued) exponents of
x
, i.e., it is the R interface to MPFR C's mpfr_get_exp()
.
The result is integer
iff .mpfr_erange_is_int()
is true, otherwise double
. Note that the MPFR (4.0.1)
manual says about mpfr_get_exp()
: The behavior for NaN,
infinity or zero is undefined.
.mpfr_erange_set()
invisibly (see
invisible()
) returns TRUE
iff the change was successful.
.mpfr_formatinfo(x)
returns conceptually a subset of
.mpfr2str()
's result, a list with three components
(Note that .mpfr2str(x, .., base)$exp
is wrt base
and is not undefined but
In other words, the format of the result of mpfrXport()
and
hence the mxp
argument to mpfrImport()
are considered
internal, not part of the API and subject to change.
Start using mpfr(..)
, and compute with these numbers.
mpfrArray(x)
is for numeric (“non-mpfr”)
x
, whereas mpfr2array(x)
is for "mpfr"
classed
x
, only.
getPrec(as(c(1,pi), "mpfr")) # 128 for both (opr <- mpfr_default_prec()) ## typically 53, the MPFR system default stopifnot(opr == (oprec <- mpfr_default_prec(70)), 70 == mpfr_default_prec()) ## and reset it: mpfr_default_prec(opr) ## Explore behavior of rounding modes 'rnd.mode': x <- mpfr(10,99)^512 # too large for regular (double prec. / numeric): sapply(c("N", "D", "U", "Z", "A"), function(RM) sapply(list(-x,x), function(.) toNum(., RM))) ## N D U Z A ## -Inf -Inf -1.797693e+308 -1.797693e+308 -Inf ## Inf 1.797693e+308 Inf 1.797693e+308 Inf ## Printing of "MPFR" matrices is less nice than R's usual matrix printing: m <- outer(c(1, 3.14, -1024.5678), c(1, 1e-3, 10,100)) m[3,3] <- round(m[3,3]) m mpfr(m, 50) B6 <- mpfr2array(Bernoulli(1:6, 60), c(2,3), dimnames = list(LETTERS[1:2], letters[1:3])) B6 ## Ranges of (base 2) exponents of MPFR numbers: .mpfr_erange() # the currently active range of possible base 2 exponents: ## A factory fresh setting fulfills .mpfr_erange(c("Emin","Emax")) == c(-1,1) * (2^30 - 1) ## There are more 'kind's, the latter 4 showing how you could change the first two : .mpfr_erange_kinds .mpfr_erange(.mpfr_erange_kinds) eLimits <- .mpfr_erange(c("min.emin", "max.emin", "min.emax", "max.emax")) ## Typically true in "current" MPFR versions: eLimits == c(-1,1, -1,1) * (2^62 - 1) ## Looking at internal representation [for power users only!]: i8 <- mpfr(-2:5, 32) x4 <- mpfr(c(NA, NaN, -Inf, Inf), 32) ## The output of the following depends on the GMP "numb" size ## (32 bit vs. 64 bit), and may be even more platform specifics: str( .mpfr2list(i8) ) str( .mpfr2list(x4, names = TRUE) ) str(xp4 <- mpfrXport(x4, names = TRUE)) stopifnot(identical(x4, mpfrImport(mpfrXport(x4))), identical(i8, mpfrImport(mpfrXport(i8)))) if(FALSE) ## FIXME: not yet working: stopifnot(identical(B6, mpfrImport(mpfrXport(B6))))
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.