R : Copyright 2000, The R Development Core Team Version 1.2.0 Under development (unstable) (2000-11-29) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type `license()' or `licence()' for distribution details. R is a collaborative project with many contributors. Type `contributors()' for more information. Type `demo()' for some demos, `help()' for on-line help, or `help.start()' for a HTML browser interface to help. Type `q()' to quit R. > ####=== Numerical / Arithmetic Tests > ####--- ALL tests here should return TRUE ! > ### > ### '##P': This lines give not 'T' but relevant ``Print output'' > > ### --> d-p-q-r-tests.R for distribution things > > .proctime00 <- proc.time() > opt.conformance <- 0 > Meps <- .Machine $ double.eps > > options(rErr.eps = 1e-30) > rErr <- function(approx, true, eps = .Options$rErr.eps) + { + if(is.null(eps)) { eps <- 1e-30; options(rErr.eps = eps) } + ifelse(Mod(true) >= eps, + 1 - approx / true, # relative error + true - approx) # absolute error (e.g. when true=0) + } > > abs(1- .Machine$double.xmin * 10^(-.Machine$double.min.exp*log10(2)))/Meps < 1e3 [1] TRUE > ##P (1- .Machine$double.xmin * 10^(-.Machine$double.min.exp*log10(2)))/Meps > if(opt.conformance)#fails at least on SGI/IRIX 6.5 + abs(1- .Machine$double.xmax * 10^(-.Machine$double.max.exp*log10(2)))/Meps < 1e3 > > ## More IEEE Infinity/NaN checks > i1 <- pi / 0 > i1 == (i2 <- 1:1 / 0:0) [1] TRUE > is.infinite( i1) & is.infinite( i2) & i1 > 12 & i2 > 12 [1] TRUE > is.infinite(-i1) & is.infinite(-i2) & (-i1) < -12 & (-i2) < -12 [1] TRUE > > is.nan(n1 <- 0 / 0) [1] TRUE > is.nan( - n1) [1] TRUE > > i1 == i1 + i1 [1] TRUE > i1 == i1 * i1 [1] TRUE > is.nan(i1 - i1) [1] TRUE > is.nan(i1 / i1) [1] TRUE > > 1/0 == Inf & 0 ^ -1 == Inf [1] TRUE > 1/Inf == 0 & Inf ^ -1 == 0 [1] TRUE > > !is.na(Inf) & !is.nan(Inf) & is.infinite(Inf) & !is.finite(Inf) [1] TRUE > !is.na(-Inf)& !is.nan(-Inf)& is.infinite(-Inf)& !is.finite(-Inf) [1] TRUE > is.na(NA) & !is.nan(NA) & !is.infinite(NA) & !is.finite(NA) [1] TRUE > is.na(NaN) & is.nan(NaN) & !is.infinite(NaN) & !is.finite(NaN) [1] TRUE > > all(!is.nan(c(1,NA))) [1] TRUE > all(c(F,T,F) == is.nan(c (1,NaN,NA))) [1] TRUE > all(c(F,T,F) == is.nan(list(1,NaN,NA))) [1] TRUE > > > ## log() and "pow()" -- POSIX is not specific enough.. > log(0) == -Inf [1] TRUE > is.nan(log(-1))# TRUE and warning [1] TRUE Warning message: NaNs produced in: log(x) > > rp <- c(1:2,Inf); rn <- rev(- rp) > r <- c(rn, 0, rp) > all(r^0 == 1) [1] TRUE > all((rn ^ -3) == -((-rn) ^ -3)) [1] TRUE > # > all(c(1.1,2,Inf) ^ Inf == Inf) [1] TRUE > all(c(1.1,2,Inf) ^ -Inf == 0) [1] TRUE > .9 ^ Inf == 0 [1] TRUE > .9 ^ -Inf == Inf [1] TRUE > ## Wasn't ok in 0.64: > all(1^c(-Inf,Inf) == 1) [1] TRUE > all(is.nan(rn ^ .5))# in some C's : (-Inf) ^ .5 gives Inf, instead of NaN [1] TRUE > > > ## Real Trig.: > cos(0) == 1 [1] TRUE > sin(3*pi/2) == cos(pi) [1] TRUE > x <- rnorm(99) > all( sin(-x) == - sin(x)) [1] TRUE > all( cos(-x) == cos(x)) [1] TRUE > > x <- 1:99/100 > all(abs(1 - x / asin(sin(x))) <= 2*Meps)# "== 2*" for HP-UX [1] TRUE > all(abs(1 - x / atan(tan(x))) < 2*Meps) [1] TRUE > > ## Sun has asin(.) = acos(.) = 0 for these: > ## is.nan(acos(1.1)) && is.nan(asin(-2)) [!] > > ## Complex Trig.: > abs(Im(cos(acos(1i))) - 1) < 2*Meps [1] TRUE > abs(Im(sin(asin(1i))) - 1) < 2*Meps [1] TRUE > ##P (1 - Im(sin(asin(Ii))))/Meps > ##P (1 - Im(cos(acos(Ii))))/Meps > abs(Im(asin(sin(1i))) - 1) < 2*Meps [1] TRUE > cos(1i) == cos(-1i)# i.e. Im(acos(*)) gives + or - 1i: [1] TRUE > abs(abs(Im(acos(cos(1i)))) - 1) < 4*Meps [1] TRUE > > .Random.seed <- c(0, 629, 6137, 22167) # want reproducible output > Isi <- Im(sin(asin(1i + rnorm(100)))) > all(abs(Isi-1) < 100* Meps) [1] TRUE > ##P table(2*abs(Isi-1) / Meps) > Isi <- Im(cos(acos(1i + rnorm(100)))) > all(abs(Isi-1) < 100* Meps) [1] TRUE > ##P table(2*abs(Isi-1) / Meps) > Isi <- Im(atan(tan(1i + rnorm(100)))) #-- tan(atan(..)) does NOT work (Math!) > all(abs(Isi-1) < 100* Meps) [1] TRUE > ##P table(2*abs(Isi-1) / Meps) > > ## polyroot(): > all(abs(1 + polyroot(choose(8, 0:8))) < 1e-10)# maybe smaller.. [1] TRUE > > ## gamma(): > abs(gamma(1/2)^2 - pi) < 4* Meps [1] TRUE > r <- rlnorm(5000) > all(abs(rErr(gamma(r+1), r*gamma(r))) < 500 * Meps) [1] TRUE > > n <- 10; all( gamma(1:n) == cumprod(c(1,1:(n-1)))) [1] TRUE > n <- 20; all(abs(rErr( gamma(1:n), cumprod(c(1,1:(n-1))))) < 100*Meps) [1] TRUE > n <- 120; all(abs(rErr( gamma(1:n), cumprod(c(1,1:(n-1))))) < 1000*Meps) [1] TRUE > n <- 10000;all(abs(rErr(lgamma(1:n),cumsum(log(c(1,1:(n-1)))))) < 100*Meps) [1] TRUE > > all(is.nan(gamma(0:-4))) # + warn. [1] TRUE Warning message: NaNs produced in: gamma(x) > > > ## fft(): > ok <- TRUE > ##test EXTENSIVELY: for(N in 1:100) { > cat(".") .> for(n in c(1:30, 1000:1050)) { + x <- rnorm(n) + er <- Mod(rErr(fft(fft(x), inverse = TRUE)/n, x*(1+0i))) + n.ok <- all(er < 1e-8) & quantile(er, 0.95, names=FALSE) < 10000*Meps + if(!n.ok) cat("\nn=",n,": quantile(rErr, c(.95,1)) =", + formatC(quantile(er, prob= c(.95,1))),"\n") + ok <- ok & n.ok + } > cat("\n") > ##test EXTENSIVELY: } > ok [1] TRUE > > ## var(): > for(n in 2:10) + print(all.equal(n*(n-1)*var(diag(n)), + matrix(c(rep(c(n-1,rep(-1,n)),n-1), n-1), nr=n, nc=n), + tol = 20*Meps))# use tol=0 to see rel.error [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE [1] TRUE > > ## pmin() & pmax() -- "attributes" ! > v1 <- c(a=2) > m1 <- cbind( 2:4,3) > m2 <- cbind(a=2:4,2) > > all( pmax(v1, 1:3) == pmax(1:3, v1) & pmax(1:3, v1) == c(2,2,3)) [1] TRUE > all( pmin(v1, 1:3) == pmin(1:3, v1) & pmin(1:3, v1) == c(1,2,2)) [1] TRUE > > oo <- options(warn = -1)# These four lines each would give 3-4 warnings : > all( pmax(m1, 1:7) == pmax(1:7, m1) & pmax(1:7, m1) == c(2:4,4:7)) [1] TRUE > all( pmin(m1, 1:7) == pmin(1:7, m1) & pmin(1:7, m1) == c(1:3,3,3,3,2)) [1] TRUE > all( pmax(m2, 1:7) == pmax(1:7, m2) & pmax(1:7, m2) == pmax(1:7, m1)) [1] TRUE > all( pmin(m2, 1:7) == pmin(1:7, m2) & pmin(1:7, m2) == c(1:3,2,2,2,2)) [1] TRUE > options(oo) > > ## pretty() > stopifnot(pretty(1:15) == seq(0,16, by=2), + pretty(1:15, h=2) == seq(0,15, by=5), + pretty(1) == 0:1, + pretty(pi) == c(2,4), + pretty(pi, n=6) == 2:4, + pretty(pi, n=10) == 2:5, + pretty(pi, shr=.1)== c(3, 3.5)) > > ## gave infinite loop [R 0.64; Solaris], seealso PR#390 : > all(pretty((1-1e-5)*c(1,1+3*Meps), 7) == seq(0,1,len=3)) [1] TRUE > > n <- 1000 > x12 <- matrix(NA, 2,n); x12[,1] <- c(2.8,3) # Bug PR#673 > for(j in 1:2) x12[j, -1] <- round(rnorm(n-1), dig = rpois(n-1, lam=3.5) - 2) > for(i in 1:n) { + lp <- length(p <- pretty(x <- sort(x12[,i]))) + stopifnot(p[1] <= x[1] & x[2] <= p[lp], + all(x==0) || all.equal(p, rev(-pretty(-x)), tol = 10*Meps)) + } > > ## PR#741: > pi != (pi0 <- pi + 2*.Machine$double.eps) [1] TRUE > is.na(match(c(1,pi,pi0), pi)[3]) [1] TRUE > > ## PR#749: > all(is.na(c(NA && TRUE, TRUE && NA, NA && NA, + NA || FALSE,FALSE || NA, NA || NA))) [1] TRUE > > all((c(NA || TRUE, TRUE || NA, + !c(NA && FALSE,FALSE && NA)))) [1] TRUE > > > ## Last Line: > cat('Time elapsed: ', proc.time() - .proctime00,'\n') Time elapsed: 4.07 0.18 4.26 0 0 >