Rmpfr (version 0.5-3)

mpfr: Create "mpfr" Numbers (Objects)

Description

Create multiple (i.e. typically high) precision numbers, to be used in arithmetic and mathematical computations with R.

Usage

mpfr(x, precBits, base = 10, rnd.mode = c("N","D","U","Z"))
Const(name = c("pi", "gamma", "catalan", "log2"), prec = 120L)

Arguments

x
a numeric, bigz, bigq, or character vector or
precBits, prec
a number, the maximal precision to be used, in bits; i.e. 53 corresponds to double precision. Must be at least 2. If missing,
base
(only when x is character) the base with respect to which x[i] represent numbers; base $b$ must fulfill $2 \le b \le 36$.
rnd.mode
a 1-letter string specifying how rounding should happen at C-level conversion to MPFR, see details.
name
a string specifying the mpfrlib - internal constant computation. "gamma" is Euler's gamma $(\gamma)$, and "catalan" Catalan's constant.

Value

  • an object of (S4) class mpfr, mpfrMatrix, or mpfrArray which the user should just as a normal numeric vector or array.

Details

MPFR supports four rounding modes, [object Object],[object Object],[object Object],[object Object] The round to nearest ("N") mode, the default here, works as in the IEEE 754 standard: in case the number to be rounded lies exactly in the middle of two representable numbers, it is rounded to the one with the least significant bit set to zero. For example, the number 5/2, which is represented by (10.1) in binary, is rounded to (10.0)=2 with a precision of two bits, and not to (11.0)=3. This rule avoids the "drift" phenomenon mentioned by Knuth in volume 2 of The Art of Computer Programming (Section 4.2.2).

References

The MPFR team. (2009). GNU MPFR -- The Multiple Precision Floating-Point Reliable Library; Edition 2.4.2, November 2009; see http://www.mpfr.org/mpfr-current/#doc or directly http://www.mpfr.org/mpfr-current/mpfr.pdf.

See Also

The class documentation mpfr contains more details.

Examples

Run this code
mpfr(pi, 120) ## the double-precision pi "translated" to 120-bit precision

pi. <- Const("pi", prec = 260) # pi "computed" to correct 260-bit precision
pi. # nicely prints 80 digits [260 * log10(2) ~= 78.3 ~ 80]

Const("gamma",   128L) # 0.5772...
Const("catalan", 128L) # 0.9159...

x <- mpfr(0:7, 100)/7 # a more precise version of  k/7, k=0,..,7
x
1 / x

## character input :
mpfr("2.718281828459045235360287471352662497757") - exp(mpfr(1, 150))
## ~= -4 * 10^-40
## Also works for  NA, NaN, ... :
cx <- c("1234567890123456", 345, "NA", "NaN", "Inf", "-Inf")
mpfr(cx)

## with some 'base' choices :
print(mpfr("111.1111", base=2)) * 2^4

mpfr("af21.01020300a0b0c", base=16)
##  68 bit prec.  44833.00393694653820642

## --- Large integers from package 'gmp':
Z <- as.bigz(7)^(1:200)
head(Z, 40)
## mfpr(Z) by default chooses the correct *maximal* default precision:
mZ. <- mpfr(Z)
## more efficiently chooses precision individually
m.Z <- mpfr(Z, precBits = frexpZ(Z)$exp)
## the precBits chosen are large enough to keep full precision:
stopifnot(identical(cZ <- as.character(Z),
                    as(mZ.,"character")),
          identical(cZ, as(m.Z,"character")))

## compare mpfr-arithmetic with exact rational one:
stopifnot(all.equal(mpfr(as.bigq(355,113), 99),
                    mpfr(355, 99) / 113,	tol = 2^-98))

## look at different "rounding modes":
sapply(c("N", "D","U","Z"), function(RND)
       mpfr(c(-1,1)/5, 20, rnd.mode = RND), simplify=FALSE)

symnum(sapply(c("N", "D","U","Z"),
              function(RND) mpfr(0.2, prec = 5:15, rnd.mode = RND) < 0.2 ))

Run the code above in your browser using DataLab