Frequentemente, acabo em situações em que é necessário verificar se a diferença obtida está acima da precisão da máquina. Parece que para esta finalidade R tem uma variável útil: .Machine$double.eps
. No entanto, quando recorro ao código-fonte R para obter orientações sobre o uso desse valor, vejo vários padrões diferentes.
Exemplos
Aqui estão alguns exemplos da stats
biblioteca:
t.test.R
if(stderr < 10 *.Machine$double.eps * abs(mx))
chisq.test.R
if(abs(sum(p)-1) > sqrt(.Machine$double.eps))
integrar.R
rel.tol < max(50*.Machine$double.eps, 0.5e-28)
lm.influence.R
e[abs(e) < 100 * .Machine$double.eps * median(abs(e))] <- 0
princomp.R
if (any(ev[neg] < - 9 * .Machine$double.eps * ev[1L]))
etc.
Questões
- Como se pode compreender o raciocínio por trás de todos esses diferentes
10 *
,100 *
,50 *
esqrt()
modificadores? - Existem diretrizes sobre como usar
.Machine$double.eps
para ajustar diferenças devido a problemas de precisão?
double.eps
. Se você estiver executando várias operações em um número de ponto flutuante, sua tolerância a erros também deverá se ajustar. É por isso que all.equal oferece um tolerance
argumento.