mpfr-distr-etc {Rmpfr} | R Documentation |
For some R standard (probability) density, distribution or quantile functions, we provide MPFR versions.
dpois (x, lambda, log = FALSE, useLog = ) dbinom (x, size, prob, log = FALSE, useLog = ) dnbinom(x, size, prob, mu, log = FALSE, useLog = any(x > 1e6)) dnorm (x, mean = 0, sd = 1, log = FALSE) dgamma(x, shape, rate = 1, scale = 1/rate, log = FALSE) dt (x, df, ncp, log = FALSE) pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
x,q, lambda, size,prob, mu, mean,sd, shape,rate,scale, df,ncp |
|
log, log.p, lower.tail |
|
useLog |
|
pnorm()
is based on erf()
and erfc()
which
have direct MPFR counter parts and are both reparametrizations
of pnorm
, erf(x) = 2*pnorm(sqrt(2)*x)
and
erfc(x) = 2* pnorm(sqrt(2)*x, lower=FALSE)
.
A vector of the same length as the longest of x,q, ...
,
of class mpfr
with the high accuracy results of
the corresponding standard R function.
E.g., for pnorm(*, log.p = TRUE)
to be useful, i.e., not to
underflow or overflow, you may want to extend the exponential range of
MPFR numbers, using .mpfr_erange_set()
, see the examples.
pnorm
,
dt
,
dbinom
,
dnbinom
,
dgamma
,
dpois
in standard package stats.
pbetaI(x, a,b)
is a mpfr
version of
pbeta
only for integer a
and b
.
x <- 1400+ 0:10 print(dpois(x, 1000), digits =18) ## standard R's double precision (px <- dpois(mpfr(x, 120), 1000))## more accuracy for the same px. <- dpois(mpfr(x, 120), 1000, useLog=TRUE)# {failed in 0.8-8} stopifnot(all.equal(px, px., tol = 1e-31)) dpois(0:5, mpfr(10000, 80)) ## very small exponents (underflowing in dbl.prec.) print(dbinom(0:8, 8, pr = 4 / 5), digits=18) dbinom(0:8, 8, pr = 4/mpfr(5, 99)) -> dB; dB print(dnorm( -5:5), digits=18) dnorm(mpfr(-5:5, prec=99)) ## For pnorm() in the extreme tails, need an exponent range ## larger than the (MPFR and Rmpfr) default: (old_eranges <- .mpfr_erange()) # typically -/+ 2^30: log2(abs(old_eranges)) # 30 30 .mpfr_erange_set(value = (1-2^-52)*.mpfr_erange(c("min.emin","max.emax"))) log2(abs(.mpfr_erange()))# 62 62 **iff** setup -- 2023-01: *not* on Winbuilder tens <- mpfr(10^(4:7), 128) pnorm(tens, lower.tail=FALSE, log.p=TRUE) # "works" (iff ...) ## "the" boundary: pnorm(mpfr(- 38581.371, 128), log.p=TRUE) # still does not underflow {but *.372 does} ## -744261105.599283824811986753129188937418 (iff ...) .mpfr_erange()*log(2) # the boundary ## Emin Emax ## -3.196577e+18 3.196577e+18 (iff ...) ## reset to previous .mpfr_erange_set( , old_eranges) pnorm(tens, lower.tail=FALSE, log.p=TRUE) # all but first underflow to -Inf