R'de baskı çıktısındaki ondalık basamak sayısını kontrol etme


110

R'de rakam gösterimi üzerinde kontrol elde etme seçeneği vardır. Örneğin:

options(digits=10)

hesaplama sonuçlarını R seansı sonuna kadar 10 haneli olarak vermesi beklenir. R'nin yardım dosyasında, basamak parametresinin tanımı aşağıdaki gibidir:

rakamlar: sayısal değerleri yazdırırken yazdırılacak basamak sayısını kontrol eder. Bu sadece bir öneridir. Geçerli değerler 1 ... 22 ve varsayılan 7'dir

Yani, bunun yalnızca bir öneri olduğunu söylüyor. Ya her zaman 10 basamak göstermeyi seversem, az ya da çok değil?

İkinci sorum şu: 22 basamaktan fazlasını görüntülemek istersem, yani 100 basamak gibi daha kesin hesaplamalar için? Temel R ile mümkün mü yoksa bunun için ek bir pakete / işleve ihtiyacım var mı?

Düzenleme: Jmoy'un önerisi sayesinde denedim sprintf("%.100f",pi)ve verdi

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

48 ondalık sayıya sahiptir. Bu, R'nin üstesinden gelebileceği maksimum sınır mı?


5
Pi'nin yalnızca ilk 15 hanesi doğrudur. Gerçek değer joyofpi.com/pi.html ile karşılaştırın
Richie Cotton

1
Haklısın. R'de neden farklı?
Mehper C. Palavuzlar


2
Mehper: Ben okumak isteyebilirsiniz R. You sayıların hesaplama temsilini yanlış yorumlama sanıyorlar en.wikipedia.org/wiki/Floating_point .
Shane

Karşılaştırma olarak, Python tam olarak aynı şeyi yapar: Deneyin python -c "import math; print(format(math.pi, '.100f'))". Sonuç, pikalan 52 hane için sıfırlarla doldurulmuş 48 "gerçek" ondalıktır.
sözdizimi hatası

Yanıtlar:


49

Bunun yalnızca bir öneri olmasının nedeni, options değerini yok sayan bir yazdırma işlevini kolayca yazabilmenizdir. Yerleşik yazdırma ve biçimlendirme işlevleri, optionsdeğeri varsayılan olarak kullanır .

İkinci soruya gelince, R sonlu kesinlik aritmetiği kullandığından, cevaplarınız 15 veya 16 ondalık basamağın ötesinde doğru değildir, bu nedenle genel olarak daha fazlasına gerek yoktur. Gmp ve rcdd paketleri (gmp kütüphanesine bir interace yoluyla) çoklu kesinlik aritmetik başa, ancak bu çoğunlukla yerine kendi çiftlerde daha ondalık basamağa daha büyük tamsayılar ile ilgilidir.

Mathematica veya Maple , kalbinizin istediği kadar ondalık basamak vermenize izin verecektir.

DÜZENLEME:
Ondalık basamaklar ile önemli rakamlar arasındaki farkı düşünmek faydalı olabilir. 15. önemli rakamın ötesindeki farklılıklara dayanan istatistiksel testler yapıyorsanız, analiziniz neredeyse kesinlikle gereksizdir.

Öte yandan, eğer sadece çok küçük sayılarla uğraşıyorsanız, bu daha az problemdir, çünkü R .Machine$double.xmin(genellikle 2e-308) kadar küçük bir sayı ile başa çıkabilir .

Bu iki analizi karşılaştırın.

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

İlk durumda, sayılar arasındaki farklar yalnızca birçok önemli rakamdan sonra ortaya çıkar, bu nedenle veriler "neredeyse sabittir". İkinci durumda, sayılar arasındaki farkların boyutu aynı olsa da, sayıların büyüklüğüne kıyasla büyüktür.


E3bo'da belirtildiği gibi, Rmpfrpaketi kullanarak çok duyarlıklı kayan noktalı sayılar kullanabilirsiniz .

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

Bunlar, normal (çift duyarlıklı) numericvektörlere göre daha yavaştır ve daha fazla bellek kullanır , ancak kötü koşullandırılmış bir sorununuz veya kararsız bir algoritmanız varsa yararlı olabilir.


4
Gibi bu Rwiki sayfa gösteriyor Rmpfr paket R. yüksek hassasiyetli kayar nokta aritmetik için izin verir
e3bo

Ancak Rmpfr, hassasiyetini artırmak için herhangi bir R paketi tarafından kullanılabilir mi? Yoksa sadece dahili olarak kodlanmış fonksiyonları kullanabilir mi?
skan

2
Düşünüyordum da, "15. önemli rakamın ötesindeki farklılıklara dayanan istatistiksel testler yapıyorsanız, analiziniz neredeyse kesinlikle gereksizdir." ama önemsiz olduğu sonucuna varacağım basamak sayısının ne olacağını merak ettim ve 5 diye düşündüm, ama düzeltilmiş olmaktan mutlu olurum.
PatrickT

46

Çıktının tamamını kendiniz üretiyorsanız sprintf(), örneğin

> sprintf("%.10f",0.25)
[1] "0.2500000000"

Eğer (on ondalık noktaları ile de ondalık sayı biçimlendirmek istediğiniz belirtir şamandıra ve içindir belirttiğinden on ondalık puan).%.10ff.10

R'nin üst düzey işlevlerini kesin sayıda basamak yazdırmaya zorlamanın herhangi bir yolunu bilmiyorum.

64-bit çiftleri kullanarak elde edebileceğiniz en iyi doğruluk yaklaşık 16 ondalık basamak olduğundan (sisteminizde .Machine $ double.eps'e bakın), R'nin normal sayılarını yazdırıyorsanız, 100 basamaklı görüntülemenin bir anlamı yoktur. Kalan basamaklar önemsiz olacaktır.


Aslında, uyguladığım bazı özel ki-kare testleri, doğru sonuçlar vermek için yüzlerce ondalık sayıya ihtiyaç duyuyordu. Ayrıca pi'de binlerce ondalık sayı vardır. Bu yüzden 100 veya daha fazla basamak merak ediyordum.
Mehper C. Palavuzlar

14
pi sonsuz sayıda ondalık sayıya sahiptir; bu, bir bilgisayarın bunları depolayabileceği anlamına gelmez.
Shane

Sanırım bu, Mathematica'nın R'den üstün olduğu bir senaryo
skan

1
@skan Mathematica'nın sonsuz sayıda ondalık sayı sakladığını düşünüyor musunuz?
Gregor Thomas

@Gregor elbette değil, ama hafızanızın izin verdiği kadar rakam yapabilirsiniz.
Skan

1

İhtiyaçlara göre kaç ondalık basamağın yazdırılacağını kontrol edebilen bir çözüm daha (gereksiz sıfır (lar) yazdırmak istemiyorsanız)

Örneğin, bir vektörünüz varsa elementsve onu elde etmek sumistiyorsanız

elements <- c(-1e-05, -2e-04, -3e-03, -4e-02, -5e-01, -6e+00, -7e+01, -8e+02)
sum(elements)
## -876.5432

Görünüşe göre, 1kesilen son dijital , ideal sonuç şöyle olmalıdır -876.54321, ancak sabit yazdırma ondalık seçeneği olarak ayarlanırsa, örneğin sprintf("%.10f", sum(elements)), yedek sıfır (lar) olarak-876.5432100000

Buradaki öğreticinin ardından: ondalık sayıların yazdırılması , burada olduğu gibi belirli sayısal sayılarda kaç ondalık basamağın -876.54321yazdırılması gerektiğini belirleyebiliyorsa, formataşağıdaki gibi işlev için bir parametre ayarlayabiliriz :

decimal_length <- 5
formatC(sum(elements), format = "f", digits = decimal_length)
## -876.54321

decimal_lengthHer seferinde sorguyu temel alarak değiştirebiliriz , böylece farklı ondalık yazdırma gereksinimlerini karşılayabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.