W R jest opcja uzyskania kontroli nad wyświetlaniem cyfr. Na przykład:
options(digits=10)
ma podawać wyniki obliczeń w 10 cyfrach do końca sesji R. W pliku pomocy R, definicja parametru cyfry jest następująca:
cyfry: kontroluje liczbę cyfr do wydrukowania podczas drukowania wartości liczbowych. To tylko sugestia. Prawidłowe wartości to 1 ... 22, domyślnie 7
Więc mówi, że to tylko sugestia. Co jeśli lubię zawsze wyświetlać 10 cyfr, a nie mniej lub więcej?
Moje drugie pytanie brzmi: co zrobić, jeśli lubię wyświetlać więcej niż 22 cyfry, czyli do bardziej precyzyjnych obliczeń, takich jak 100 cyfr? Czy jest to możliwe z podstawowym R, czy potrzebuję do tego dodatkowego pakietu / funkcji?
Edycja: Dzięki sugestii jmoy spróbowałem sprintf("%.100f",pi)
i dałem
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
który ma 48 miejsc po przecinku. Czy to jest maksymalny limit, z którym R może sobie poradzić?
python -c "import math; print(format(math.pi, '.100f'))"
. Wynikiem jestpi
48 „prawdziwych” miejsc po przecinku, wypełnionych zerami dla pozostałych 52 cyfr.Odpowiedzi:
Powodem, dla którego jest to tylko sugestia, jest to, że można dość łatwo napisać funkcję drukującą, która ignorowała wartość opcji. Wbudowane funkcje drukowania i formatowania używają tej
options
wartości jako domyślnej.Jeśli chodzi o drugie pytanie, ponieważ R używa arytmetyki o skończonej precyzji, twoje odpowiedzi nie są dokładne poza 15 lub 16 miejscami po przecinku, więc generalnie więcej nie jest wymagane. W GMP i rcdd pakiety czynienia z wieloma precyzji arytmetyki (poprzez interace do biblioteki GMP), ale jest to związane głównie z dużych liczb całkowitych zamiast większej ilości miejsc po przecinku dla swoich sobowtórów.
Mathematica lub Maple pozwolą ci podać tyle miejsc po przecinku, ile dusza zapragnie.
EDYCJA:
Warto pomyśleć o różnicy między miejscami dziesiętnymi a cyframi znaczącymi. Jeśli wykonujesz testy statystyczne, które opierają się na różnicach wykraczających poza piętnastą cyfrę znaczącą, to Twoja analiza jest prawie na pewno śmieciowa.
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.
W pierwszym przypadku różnice między liczbami pojawiają się dopiero po wielu cyfrach znaczących, więc dane są „prawie stałe”. W drugim przypadku, chociaż wielkość różnic między liczbami jest taka sama, w porównaniu z wielkością samych liczb są one duże.
Jak wspomniano w e3bo, możesz używać liczb zmiennoprzecinkowych o dużej precyzji używając
Rmpfr
pakietu.Są wolniejsze i wymagają więcej pamięci niż zwykłe
numeric
wektory (o podwójnej precyzji) , ale mogą być przydatne, jeśli masz źle uwarunkowany problem lub niestabilny algorytm.źródło
Jeśli sam produkujesz całość, możesz użyć
sprintf()
npOkreśla, że należy sformatować liczbę zmiennoprzecinkową z dziesięciu miejsc po przecinku (w jest dla pływaka oraz wyszczególnia dziesięć miejsc po przecinku).
%.10f
f
.10
Nie znam żadnego sposobu na zmuszenie funkcji wyższego poziomu R do wypisywania dokładnej liczby cyfr.
Wyświetlanie 100 cyfr nie ma sensu, jeśli drukujesz zwykłe liczby R, ponieważ najlepsza dokładność, jaką można uzyskać za pomocą 64-bitowych podwójnych liczb, to około 16 cyfr dziesiętnych (spójrz na .Machine $ double.eps w twoim systemie). Pozostałe cyfry będą po prostu śmieciami.
źródło
Jeszcze jedno rozwiązanie pozwalające kontrolować, ile cyfr dziesiętnych ma zostać wydrukowanych w zależności od potrzeb (jeśli nie chcesz drukować zbędnych zer)
Na przykład, jeśli masz wektora jak
elements
i chciałby uzyskaćsum
od niegoNajwyraźniej ostatnia cyfra
1
została obcięta, idealny wynik powinien być-876.54321
, ale jeśli jest ustawiony jako stała opcja drukowania dziesiętnego, np.sprintf("%.10f", sum(elements))
Nadmiarowe zero (s) generuje jako-876.5432100000
Postępując zgodnie z samouczkiem tutaj: drukowanie liczb dziesiętnych , jeśli
-876.54321
jesteśmy w stanie określić, ile cyfr dziesiętnych w określonej liczbie liczbowej, tak jak tutaj , jest 5 cyfr dziesiętnych do wydrukowania, możemy ustawić parametr dlaformat
funkcji, jak poniżej:Możemy zmienić na
decimal_length
podstawie każdego zapytania czasowego, aby spełniał różne wymagania dotyczące drukowania dziesiętnego.źródło