2016-03-13 9 views
7
bir değer bir tamsayı ise ?is.integer için yardım sayfası bize söyleyecek bir işlevi hakkında bir not vardır

: argümanı ne olabilir Neden kimse is.wholenumber bu toleransı kullanmak istiyorsunuz

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

sqrt(eps) kullanmak Burada hoşgörü olarak mı? Ayrıca, tol=0'dan başka bir şey kullanmak için iyi bir neden var mı?

Arka planım bu question numaralı telefondaki cevabım. Bazı yorumcular bu işleve itiraz ettiler.

Basit düşünceye dayanan hipotezim: bu, yazdırılacak davranışlarda (7 ondalık basamaklı varsayılan) yakınlaştırmak için yapılır. Ör:

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

Mükemmel olsa çalışmaz: sqrt(eps) neden yuvarlama hatası (kaba) tahmin çekebilir:

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

aşağıdaki yorum daha iyi bir argüman var kayan nokta işlemleri.

+6

Baskı ile ilgisi yoktur. Çifte kayan nokta aritmetiğinden beklediğiniz hassasiyet miktarıdır. –

+1

Birisi bu soruyu kapatmak için oy kullandı. Lütfen nedenini açıklayabilir misiniz? Teşekkürler. (Hangi kuralı reddettiğimi öğrenmeye istekliyim). –

+0

@JoshuaUlrich Teşekkürler. Bu aslında mantıklı. –

cevap

1

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

tam gerçekte 3 == 0.6/0.3 birlikte, kayan ayrımlı böyle değildir karşılaştırın. Sayısal ve karmaşık değerleri için "=="

için helpfile itibaren

, ‘==’ ve ‘! =’ fraksiyonların sonlu temsil için izin, ne hata yuvarlama için değil hatırlıyorum. ‘All.equal’ ifadesini "aynı" ile kullanmak neredeyse her zaman tercih edilir.

is.wholenumber için varsayılan tolerans all.equal aynı miktara ayarlanır:

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

Bu is.wholenumber varsayılan davranışı bizim örnek vermek gerekirse

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

karşılaştırılabilir olduğu anlamına gelir tam daire

> 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 
İlgili konular