2010-02-18 12 views
77

Istnieje opcja w R, aby uzyskać kontrolę nad cyfrowym wyświetlaczem. Na przykład:Sterowanie liczbą cyfr dziesiętnych w wydruku w R

options(digits=10) 

ma dać wyniki obliczeń w 10 cyfrach do końca sesji R. W pliku pomocy R, definicja cyfry parametru jest następujący:

cyfr: kontroluje liczbę cyfr do wydrukowania podczas drukowania wartości liczbowych. To jest tylko sugestia. Prawidłowe wartości są 1 ... 22 z domyślnie

Tak, to mówi, że to tylko sugestia. Co się stanie, jeśli zawsze będę wyświetlać 10 cyfr, nie więcej lub mniej?

Moje drugie pytanie brzmi: co zrobić, jeśli chcę wyświetlić więcej niż 22 cyfry, tj. Bardziej precyzyjne obliczenia, np. 100 cyfr? Czy to możliwe z bazą R, czy też potrzebuję do tego dodatkowego pakietu/funkcji?

Edit: Dzięki za sugestię jmoy, próbowałem sprintf("%.100f",pi) i dała

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 

który posiada 48 miejsc po przecinku. Czy jest to maksymalna granica, którą może obsłużyć R? Właściwie pi ma nieskończoną liczbę miejsc dziesiętnych.

+4

Tylko pierwsze 15 cyfr pi jest poprawnych. Porównaj z prawdziwą wartością http://joyofpi.com/pi.html –

+1

Masz rację. Dlaczego jest inaczej w R? –

+3

Zobacz FAQ na R http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f –

Odpowiedz

38

Powodem, dla którego jest to tylko sugestia, można dość łatwo napisać funkcję drukowania, która zignorowała wartość opcji. Wbudowane funkcje drukowania i formatowania używają domyślnie wartości options.

Jeśli chodzi o drugie pytanie, ponieważ R posługuje się arytmetyczną dokładnością precyzyjną, twoje odpowiedzi nie są dokładne powyżej 15 lub 16 miejsc po przecinku, więc generalnie więcej nie jest wymaganych. Pakiety gmp i rcdd zajmują się arytmetyczną precyzją (poprzez interakcję z biblioteką gmp), ale jest to głównie związane z dużymi liczbami całkowitymi, a nie miejscami dziesiętnymi dla twoich debów.

Mathematica lub Maple pozwoli Ci podać tyle miejsc po przecinku, ile pragnie twoje serce.

EDYCJA:
Przydałoby się pomyśleć o różnicy między miejscami dziesiętnymi a liczbami znaczącymi. Jeśli wykonujesz testy statystyczne, które opierają się na różnicach wykraczających poza 15 znaczącą liczbę, twoja analiza to prawie na pewno śmieci.

Z drugiej strony, jeśli masz do czynienia tylko z bardzo małymi liczbami, jest to mniejszy problem, ponieważ R może obsłużyć liczbę tak małą, jak .Machine$double.xmin (zwykle 2e-308).

Porównaj te dwie analizy.

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 

W pierwszym przypadku różnice między liczbami występują tylko po wielu znaczących cyfrach, więc dane są "prawie stałe". W drugim przypadku, chociaż wielkość różnic między liczbami jest taka sama, w porównaniu do wielkości samych liczb są one duże.


Jak wspomniano przez e3bo, można korzystać z wielu precyzji liczb zmiennoprzecinkowych przy użyciu pakietu Rmpfr.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825") 

Są wolniejsze i bardziej intensywnie wykorzystujących pamięć w użyciu niż zwykłe (podwójnej precyzji) numeric wektory, ale może być przydatny, jeśli masz źle uwarunkowany problem lub algorytm niestabilny.

+3

Jako [ta strona Rwiki] (http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:high_precision_arithmetic) demonstruje [pakiet Rmpfr] (http: //cran.at.r-project. org/web/packages/Rmpfr/index.html) pozwala arytmetyce zmiennoprzecinkowej o wysokiej precyzji w R. – e3bo

+0

Ale czy Rmpfr może być użyty przez dowolny pakiet R, aby poprawić jego precyzję? Lub może używać tylko funkcji zakodowanych wewnętrznie na nim? – skan

+2

Myślałem właśnie, że "Jeśli przeprowadzasz testy statystyczne, które opierają się na różnicach wykraczających poza 15 znaczącą liczbę, twoja analiza prawie na pewno jest śmieciowa." ale zastanawiałem się, jaka byłaby liczba cyfr, z której wywnioskowałbym, że to śmieci, i pomyślałem 5, ale byłbym szczęśliwy, gdyby mnie poprawiono. – PatrickT

29

Jeśli produkcji całego wyjścia siebie, można użyć sprintf

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

ja nie znam żadnego sposobu wymuszania wyższych funkcji na poziomie R, aby wydrukować dokładną liczbę cyfr.

Wyświetlenie 100 cyfr nie ma sensu, jeśli drukujesz zwykłe liczby R, ponieważ najlepsza dokładność, jaką można osiągnąć za pomocą 64-bitowych dubletów, to około 16 cyfr dziesiętnych (spójrz na .Machine $ double.eps w twoim systemie). Pozostałe cyfry będą tylko śmieciami.

+0

W rzeczywistości niektóre specjalne testy chi-kwadrat, które zastosowałem, wymagały setek cyfr po przecinku, aby dać dokładne wyniki. Również pi ma tysiące miejsc dziesiętnych. Właśnie dlatego zastanawiałem się nad 100 lub więcej cyfr. –

+12

pi ma nieskończoną liczbę miejsc po przecinku; to nie znaczy, że komputer może je przechowywać. – Shane

+0

Domyślam się, że jest to scenariusz, w którym Mathematica jest lepsza od R. – skan

Powiązane problemy