2016-03-13 11 views
7

Strona pomoc dla ?is.integer ma notatkę o funkcji, która powie nam, czy dana liczba jest liczbą całkowitą:Dlaczego należałoby użyć tej tolerancji w is.wholenumber

is.wholenumber <- 
    function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol 

co może być argumentem do korzystania sqrt(eps) jako tolerancja tutaj? Czy istnieje również dobry powód, aby używać czegoś innego niż tylko tol=0?

Tło jest moją odpowiedzią na temat tego question. Niektórzy komentatorzy sprzeciwili się tej funkcji.

Moja prosta hipoteza poglądowa: robi się to, aby zamknąć drukowanie (domyślnie 7 cyfr dziesiętnych). Np:

> 1.000005 
[1] 1.000005 
> 1.0000000005 
[1] 1 
> is.wholenumber(1.000005) 
[1] FALSE 
> is.wholenumber(1.0000000005) 
[1] TRUE 

To nie działa perfekcyjnie, choć:

> 1.00000005 
[1] 1 
> is.wholenumber(1.00000005) 
[1] FALSE 

Nie ma lepszego argumentu w poniższych Uwagi: sqrt(eps) może być (szorstki) oszacowanie zaokrąglić błędu spowodowanego przez operacje zmiennoprzecinkowe.

+6

Nie ma to nic wspólnego z drukowaniem. Jest to mniej więcej precyzja, jakiej można oczekiwać od arytmetyki o podwójnym zmiennoprzecinkowym. –

+1

Ktoś zagłosował, aby zamknąć to pytanie. Czy możesz wyjaśnić, dlaczego? Dzięki. (Chciałem się dowiedzieć, z jakiej zasady nie skorzystałem). –

+0

@JoshuaUlrich Dzięki. To ma sens. –

Odpowiedz

1

Porównaj

> is.wholenumber(0.6/0.2, tol=0) 
[1] FALSE 
> is.wholenumber(0.6/0.2) 
[1] TRUE 

Podczas 3 == 0.6/0.3 dokładnie w rzeczywistości tak nie jest w pływające punkt reprezentacji.

Z HelpFile dla "=="

dla wartości liczbowych i złożonych, pamiętać „==” i „! =” Nie pozwalają na skończonej reprezentacji ułamków, ani do zaokrąglania błąd. Używanie "all.equal" z "identycznym" jest prawie zawsze preferowane.

Domyślna tolerancja is.wholenumber jest na tej samej wysokości jak w all.equal:

## S3 method for class 'numeric' 
all.equal(target, current, 
      tolerance = .Machine$double.eps^0.5, scale = NULL, 
      ..., check.attributes = TRUE) 

Oznacza to, że wartość domyślna zachowanie is.wholenumber jest porównywalna

isTRUE(all.equal(0,abs(x - round(x)))) 

do naszego przykładu pełne koło

> x <- 0.6/0.2 
> x 
[1] 3 
> round(x) 
[1] 3 
> x == round(x) 
[1] FALSE 
> isTRUE(all.equal(0,x-round(x))) 
[1] TRUE 
> isTRUE(all.equal(0,x-round(x), tol=0)) 
[1] FALSE 
Powiązane problemy