Często kończę w sytuacjach, w których konieczne jest sprawdzenie, czy uzyskana różnica jest wyższa niż precyzja maszyny. Wygląda na to, w tym celu R ma zmienną poręczny: .Machine$double.eps
. Jednak po przejściu do kodu źródłowego R w celu uzyskania wskazówek dotyczących korzystania z tej wartości widzę wiele różnych wzorców.
Przykłady
Oto kilka przykładów z stats
biblioteki:
t.test.R
if(stderr < 10 *.Machine$double.eps * abs(mx))
chisq.test.R
if(abs(sum(p)-1) > sqrt(.Machine$double.eps))
integrate.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]))
itp.
pytania
- Jak można zrozumieć uzasadnienie wszystkich tych różnych
10 *
,100 *
,50 *
orazsqrt()
modyfikatory? - Czy istnieją wytyczne dotyczące używania
.Machine$double.eps
do korygowania różnic z powodu problemów z precyzją?
double.eps
. Jeśli wykonujesz kilka operacji na liczbie zmiennoprzecinkowej, twoja tolerancja błędu również powinna się dostosować. Dlatego all.equal daje ci tolerance
argument.