frexpMpfr {Rmpfr} | R Documentation |
MPFR - versions of the C99 (and POSIX) standard C (and C++) mathlib
functions frexp()
and ldexp()
.
frexpMpfr(x)
computes base-2 exponent e
and “mantissa”,
or fraction r
, such that x = r * 2^e, where r \in
[0.5, 1) (unless when x
is in c(0, -Inf, Inf, NaN)
where r == x
and e
is 0),
and e is integer valued.
ldexpMpfr(f, E)
is the inverse of frexpMpfr()
: Given
fraction or mantissa f
and integer exponent E
, it returns
x = f * 2^E.
Viewed differently, it's the fastest way to multiply or divide MPFR
numbers with 2^E.
frexpMpfr(x, rnd.mode = c("N", "D", "U", "Z", "A")) ldexpMpfr(f, E, rnd.mode = c("N", "D", "U", "Z", "A"))
x |
numeric (coerced to |
f |
numeric fraction (vector), in [0.5, 1). |
E |
integer valued, exponent of |
rnd.mode |
a 1-letter string specifying how rounding
should happen at C-level conversion to MPFR, see |
frexpMpfr
returns a list
with named components r
(of class mpfr
) and e
(integer valued, of type
integer
is small enough, "double"
otherwise).
Martin Maechler
On unix-alikes, typically man frexp
and man ldexp
Somewhat related, .mpfr2exp()
.
frexp()
and ldexp()
in package DPQ.
set.seed(47) x <- c(0, 2^(-3:3), (-1:1)/0, sort(rlnorm(2^12, 10, 20) * sample(c(-1,1), 512, replace=TRUE))) head(xM <- mpfr(x, 128), 11) str(rFM <- frexpMpfr(xM)) d.fr <- with(rFM, data.frame(x=x, r=asNumeric(r), e=e)) head(d.fr , 16) tail(d.fr) ar <- abs(rFM$r) stopifnot(0.5 <= ar[is.finite(x) & x != 0], ar[is.finite(x)] < 1, is.integer(rFM$e)) ldx <- with(rFM, ldexpMpfr(r, e)) (iN <- which(is.na(x))) # 10 stopifnot(exprs = { all.equal(xM, ldx, tol = 2^-124) # allow 4 bits loss, but apart from the NA, even: identical(xM[-iN], ldx[-iN]) is.na(xM [iN]) is.na(ldx[iN]) })