(r <- logQab_asy(1, 50))
(rF <- logQab_asy(1, 50, give.all=TRUE))
r == rF # all TRUE: here, even the first approx. is good!
(r2 <- logQab_asy(5/4, 50))
(r2F <- logQab_asy(5/4, 50, give.all=TRUE))
r2 == r2F # TRUE only first entry "5"
(r2F.3 <- logQab_asy(5/4, 50, k=3, give.all=TRUE))
## Check relation to Beta(), Gamma() functions:
a <- 1.1 * 2^(-6:4)
b <- 1001.5
rDlgg <- lgamma(a+b) - lgamma(b) # suffers from cancellation for small 'a'
rDlgb <- lgamma(a) - lbeta(a, b) # (ditto)
ralgd <- - algdiv(a,b)
rQasy <- logQab_asy(a, b)
cbind(a, rDlgg, rDlgb, ralgd, rQasy)
all.equal(rDlgg, rDlgb, tolerance = 0) # 3.0e-14
all.equal(rDlgb, ralgd, tolerance = 0) # 1.2e-16
all.equal(ralgd, rQasy, tolerance = 0) # 4.1e-10
all.equal(rQasy, rDlgg, tolerance = 0) # 3.5e-10
stopifnot(exprs = {
all.equal(rDlgg, rDlgb, tolerance = 1e-12) # 3e-14 {from cancellations!}
all.equal(rDlgb, ralgd, tolerance = 1e-13) # 1e-16
all.equal(ralgd, rQasy, tolerance = 2e-9) # 4.1e-10
all.equal(rQasy, rDlgg, tolerance = 2e-9) # 3.5e-10
all.equal(lgamma(a)-lbeta(a, 2*b), logQab_asy(a, 2*b), tolerance =1e-10)# 1.4e-11
all.equal(lgamma(a)-lbeta(a, b/2), logQab_asy(a, b/2), tolerance = 1e-7)# 1.2e-8
})
if(requireNamespace("Rmpfr")) withAutoprint({
aM <- Rmpfr::mpfr(a, 512)
bM <- Rmpfr::mpfr(b, 512)
rT <- lgamma(aM+bM) - lgamma(bM) # "True" i.e. accurate values
relE <- Rmpfr::asNumeric(sfsmisc::relErrV(rT, cbind(rDlgg, rDlgb, ralgd, rQasy)))
cbind(a, signif(relE,4))
## a rDlgg rDlgb ralgd rQasy
## 0.0171875 4.802e-12 3.921e-16 4.145e-17 -4.260e-16
## 0.0343750 1.658e-12 1.509e-15 -1.011e-17 1.068e-16
## 0.0687500 -2.555e-13 6.853e-16 -1.596e-17 -1.328e-16
## 0.1375000 1.916e-12 -7.782e-17 3.905e-17 -7.782e-17
## 0.2750000 1.246e-14 7.001e-17 7.001e-17 -4.686e-17
## 0.5500000 -2.313e-13 5.647e-17 5.647e-17 -6.040e-17
## 1.1000000 -9.140e-14 -1.298e-16 -1.297e-17 -1.297e-17
## 2.2000000 9.912e-14 2.420e-17 2.420e-17 -9.265e-17
## 4.4000000 1.888e-14 6.810e-17 -4.873e-17 -4.873e-17
## 8.8000000 -7.491e-15 1.004e-16 -1.638e-17 -4.118e-13
## 17.6000000 2.222e-15 1.207e-16 3.974e-18 -6.972e-10
## ==> logQab_asy() is very good _here_ as long as a << b
})
Run the code above in your browser using DataLab