Rmpfr (version 0.7-2)

formatMpfr: Formatting MPFR (multiprecision) Numbers

Description

Flexible formatting of “multiprecision numbers”, i.e., objects of class '>mpfr. formatMpfr() is also the mpfr method of the generic format function.

The formatN() methods for '>mpfr numbers renders them differently than their double precision equivalents, by appending "_M".

Usage

formatMpfr(x, digits = NULL, trim = FALSE, scientific = NA,
	   base = 10, showNeg0 = TRUE, max.digits = Inf,
	   big.mark = "", big.interval = 3L,
	   small.mark = "", small.interval = 5L,
           decimal.mark = ".",
           exponent.char = if(base 

Arguments

x

an MPFR number (vector or array).

digits

how many significant digits (in the base chosen!) are to be used in the result. The default, NULL, uses enough digits to represent the full precision, often one or two digits more than “you” would expect. For bases 2,4,8,16, or 32, MPFR requires digits at least 2. For such bases, digits = 1 is changed into 2, with a message.

trim

logical; if FALSE, numbers are right-justified to a common width: if TRUE the leading blanks for justification are suppressed.

scientific

either a logical specifying whether MPFR numbers should be encoded in scientific format, or an integer penalty (see options("scipen")). Missing values correspond to the current default penalty.

base

an integer in \(2,3,..,62\); the base (“basis”) in which the numbers should be represented. Apart from the default base 10, binary (base = 2) or hexadecimal (base = 16) are particularly interesting.

showNeg0

logical indicating if “negative” zeros should be shown with a "-". The default, TRUE is intentially different from format(<numeric>).

exponent.char

the “exponent” character to be used in scientific notation. The default takes into account that for base \(B \ge 15\), "e" is part of the (mantissa) digits and the same is true for "E" when \(B \ge 37\).

max.digits

a (large) positive number to limit the number of (mantissa) digits, notably when digits is NULL (as by default). Otherwise, a numeric digits is preferred to setting max.digits (which should not be smaller than digits).

big.mark, big.interval, small.mark, small.interval, decimal.mark, zero.print, drop0trailing

used for prettying decimal sequences, these are passed to prettyNum and that help page explains the details.

further arguments passed to or from other methods.

Value

a character vector or array, say cx, of the same length as x. Since Rmpfr version 0.5-3 (2013-09), if x is an '>mpfrArray, then cx is a character array with the same dim and dimnames as x.

Note that in scientific notation, the integer exponent is always in decimal, i.e., base 10 (even when base is not 10), but of course meaning base powers, e.g., in base 32, "u.giE3"is the same as "ugi0" which is \(32^3\) times "u.gi". This is in contrast, e.g., with sprintf("%a", x) where the powers after "p" are powers of \(2\).

References

The MPFR manual's description of mpfr_get_str() which is the C-internal workhorse for the (internal) R function .mpfr2str() on which formatMpfr builds.

See Also

mpfr for creation and the '>mpfr class description with its many methods. The format generic, and the prettyNum utility on which formatMpfr is based as well. The S3 generic function formatN from package gmp.

Examples

Run this code
# NOT RUN {
 ## Printing of MPFR numbers  uses formatMpfr() internally.
 ## Note how each components uses the "necessary" number of digits:
 ( x3 <- c(Const("pi", 168), mpfr(pi, 140), 3.14) )
 format(x3[3], 15)
 format(x3[3], 15, drop0 = TRUE)# "3.14" .. dropping the trailing zeros
 x3[4] <- 2^30
 x3[4] # automatically drops trailing zeros
 format(x3[1], dig = 41, small.mark = "'") # (41 - 1 = ) 40 digits after "."

 rbind(formatN(           x3,  digits = 15),
       formatN(as.numeric(x3), digits = 15))

 (Zero <- mpfr(c(0,1/-Inf), 20)) # 0 and "-0"
 xx <- c(Zero, 1:2, Const("pi", 120), -100*pi, -.00987)
 format(xx, digits = 2)
 format(xx, digits = 1, showNeg0 = FALSE)# "-0" no longer shown

## Output in other bases :
formatMpfr(mpfr(10^6, 40), base=32, drop0trailing=TRUE)
## "ugi0"
mpfr("ugi0", base=32) #-> 1'000'000
# }
# NOT RUN {
i32 <- mpfr(1:32, precBits = 64)
format(i32,   base=  2, drop0trailing=TRUE)
format(i32,   base= 16, drop0trailing=TRUE)
format(1/i32, base=  2, drop0trailing=TRUE)# using scientific notation for [17..32]
format(1/i32, base= 32)
format(1/i32, base= 62, drop0trailing=TRUE)
format(mpfr(2, 64)^-(1:16), base=16, drop0trailing=TRUE)
# }

Run the code above in your browser using DataCamp Workspace