| numer-utils | R Documentation |
The DPQ package provides some numeric constants used in some of its distribution computations.
all_mpfr() and any_mpfr() return TRUE
iff all (or ‘any’, respectively) of their arguments inherit from
class "mpfr" (from package Rmpfr).
logr(x,a) computes log(x / (x + a)) in a numerically
stable way.
modf(x) splits each x into integer part (as
trunc(x)) and fractional (remainder) part in (-1, 1)
and corresponds to the R version of the C99 (and POSIX) standard C (and C++) mathlib
functions of the same name.
## Numeric Constants : % mostly in ../R/beta-fns.R
M_LN2 # = log(2) = 0.693....
M_SQRT2 # = sqrt(2) = 1.4142...
M_cutoff # := If |x| > |k| * M_cutoff, then log[ exp(-x) * k^x ] =~= -x
# = 3196577161300663808 ~= 3.2e+18
M_minExp # = log(2) * .Machine$double.min.exp # ~= -708.396..
G_half # = sqrt(pi) = Gamma( 1/2 )
## Functions :
all_mpfr(...)
any_mpfr(...)
logr(x, a) # == log(x / (x + a)) -- but numerically smart; x >= 0, a > -x
modf(x)
okLongDouble(lambda = 999, verbose = 0L, tol = 1e-15)
... |
numeric or |
x, a |
number-like, not negative, now may be vectors of
|
lambda |
a number, typically in the order of 500–10'000. |
verbose |
a non-negative integer, if not zero,
|
tol |
numerical tolerance used to determine the accuracy required
for near equality in |
all_mpfr(),all_mpfr() :test if all or
any of their arguments or of class "mpfr" (from
package Rmpfr). The arguments are evaluated only until
the result is determined, see the example.
logr()computes \log( x / (x+a) ) in a numerically
stable way.
The numeric constant in the first case; a numeric (or "mpfr") vector of appropriate size in the 2nd case.
okLongDouble() returns a logical,
TRUE iff the long double arithmetic with expl() and
logl() seems to work accurately
and consistently for exp(-lambda) and log(lambda).
Martin Maechler
.Machine
(Ms <- ls("package:DPQ", pattern = "^M"))
lapply(Ms, function(nm) { cat(nm,": "); print(get(nm)) }) -> .tmp
logr(1:3, a=1e-10)
okLongDouble(verbose=TRUE) # verbose: show (C-level) computations
## typically TRUE, but not e.g. in a valgrinded R-devel of Oct.2019
## Here is typically the "boundary":
rr <- try(uniroot(function(x) okLongDouble(x) - 1/2,
c(11350, 11400), tol=1e-7, extendInt = "yes"))
str(rr, digits=9) ## seems somewhat platform dependent: now see
## $ root : num 11376.563
## $ estim.prec: num 9.313e-08
## $ iter : int 29
set.seed(2021); x <- runif(100, -7,7)
mx <- modf(x)
with(mx, head( cbind(x, i=mx$i, fr=mx$fr) )) # showing the first cases
with(mx, stopifnot( x == fr + i,
i == trunc(x),
sign(fr) == sign(x)))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.