In R gibt es eine Option, um die Kontrolle über die Ziffernanzeige zu erlangen. Beispielsweise:
options(digits=10)
soll die Berechnungsergebnisse bis zum Ende der R-Sitzung in 10 Ziffern angeben. In der Hilfedatei von R lautet die Definition für den Ziffernparameter wie folgt:
Ziffern: Steuert die Anzahl der Ziffern, die beim Drucken numerischer Werte gedruckt werden sollen. Es ist nur ein Vorschlag. Gültige Werte sind 1 ... 22 mit Standard 7
Es heißt also, dies sei nur ein Vorschlag. Was ist, wenn ich immer 10 Ziffern anzeigen möchte, nicht mehr oder weniger?
Meine zweite Frage ist, was ist, wenn ich mehr als 22 Stellen anzeigen möchte, dh für genauere Berechnungen wie 100 Stellen? Ist es mit Base R möglich oder brauche ich dafür ein zusätzliches Paket / eine zusätzliche Funktion?
Edit: Dank jmoys Vorschlag habe ich es versucht sprintf("%.100f",pi)
und es gab
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
Das hat 48 Dezimalstellen. Ist dies die maximale Grenze, die R bewältigen kann?
python -c "import math; print(format(math.pi, '.100f'))"
. Das Ergebnis sindpi
48 "echte" Dezimalstellen, die für die verbleibenden 52 Ziffern mit Nullen gefüllt sind.Antworten:
Der Grund, warum dies nur ein Vorschlag ist, ist, dass Sie ganz einfach eine Druckfunktion schreiben können, die den Optionswert ignoriert. Die integrierten Druck- und Formatierungsfunktionen verwenden
options
standardmäßig den Wert.Was die zweite Frage betrifft, da R eine Arithmetik mit endlicher Genauigkeit verwendet, sind Ihre Antworten nicht mehr als 15 oder 16 Dezimalstellen genau, sodass im Allgemeinen keine weiteren erforderlich sind. Die Pakete gmp und rcdd verarbeiten Arithmetik mit mehrfacher Genauigkeit (über eine Schnittstelle zur gmp-Bibliothek), dies hängt jedoch hauptsächlich mit großen Ganzzahlen zusammen und nicht mit mehr Dezimalstellen für Ihre Doubles.
Mit Mathematica oder Maple können Sie so viele Dezimalstellen angeben, wie Ihr Herz begehrt.
BEARBEITEN:
Es kann nützlich sein, über den Unterschied zwischen Dezimalstellen und signifikanten Zahlen nachzudenken. Wenn Sie statistische Tests durchführen, die auf Unterschieden beruhen, die über die 15. signifikante Zahl hinausgehen, ist Ihre Analyse mit ziemlicher Sicherheit Junk.
Wenn Sie dagegen nur mit sehr kleinen Zahlen arbeiten, ist dies weniger problematisch, da R mit Zahlen von bis zu
.Machine$double.xmin
(normalerweise 2e-308) umgehen kann .Vergleichen Sie diese beiden Analysen.
Im ersten Fall treten Unterschiede zwischen Zahlen erst nach vielen signifikanten Zahlen auf, sodass die Daten "nahezu konstant" sind. Im zweiten Fall sind die Unterschiede zwischen den Zahlen zwar gleich groß, aber im Vergleich zur Größe der Zahlen selbst sind sie groß.
Wie von e3bo erwähnt, können Sie mit dem
Rmpfr
Paket Gleitkommazahlen mit mehrfacher Genauigkeit verwenden .Diese sind langsamer und speicherintensiver als normale
numeric
Vektoren (mit doppelter Genauigkeit) , können jedoch nützlich sein, wenn Sie ein schlecht konditioniertes Problem oder einen instabilen Algorithmus haben.quelle
Wenn Sie die gesamte Ausgabe selbst produzieren, können Sie
sprintf()
zgibt an, dass Sie eine Fließkommazahl mit zehn Dezimalstellen formatiert werden soll (in
%.10f
derf
für Schwimmer ist und die.10
gibt an zehn Dezimalstellen).Ich kenne keine Möglichkeit, die übergeordneten Funktionen von R zu zwingen, eine genaue Anzahl von Ziffern zu drucken.
Das Anzeigen von 100 Stellen ist nicht sinnvoll, wenn Sie die üblichen Zahlen von R drucken, da die beste Genauigkeit, die Sie mit 64-Bit-Doppel erhalten können, bei 16 Dezimalstellen liegt (siehe .Machine $ double.eps auf Ihrem System). Die restlichen Ziffern sind nur Junk.
quelle
Eine weitere Lösung, mit der Sie steuern können, wie viele Dezimalstellen je nach Bedarf ausgedruckt werden sollen (wenn Sie keine redundanten Nullen drucken möchten).
Zum Beispiel, wenn Sie einen Vektor , wie
elements
und möchten bekommensum
davonAnscheinend sollte das letzte Digital als
1
abgeschnitten abgeschnitten werden, das ideale Ergebnis sollte sein-876.54321
, aber wenn es als feste Druckdezimaloption eingestellt ist, z. B.sprintf("%.10f", sum(elements))
erzeugen redundante Nullen als-876.5432100000
Folgen Sie dem Tutorial hier: Drucken von Dezimalzahlen Wenn Sie feststellen können, wie viele Dezimalstellen in einer bestimmten numerischen Zahl enthalten sind, wie hier in
-876.54321
, müssen 5 Dezimalstellen gedruckt werden, können Sie einen Parameter für die folgendeformat
Funktion einrichten :Wir können die
decimal_length
basierend auf jeder Zeitabfrage ändern , so dass unterschiedliche Anforderungen an den Dezimaldruck erfüllt werden können.quelle