2014-09-16 3 views
40

Ich würde gerne wissen, ob und wie die 10-Potenzen mit dem Ausdruck der wissenschaftlichen Notation in der Konsole verbunden sind. Ich habe R Docs durchsucht und habe nichts Relevantes gefunden oder das ich wirklich verstehe.Warum drucken Potenzen von 10 in wissenschaftlicher Notation bei der 5. Potenz?

Zunächst einmal, meine scipen und digits Einstellungen sind

unlist(options("scipen", "digits")) 
# scipen digits 
#  0  7 

nun Kräfte von 10 gedruckt werden normalerweise bis zur 4. Potenz, und schaltet dann auf dem wissenschaftliche Notation Druck auf der 5. Macht.

10^(1:4) 
# [1] 10 100 1000 10000 
10^(1:5) 
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05 

Interessanterweise ist diese nicht für einige andere Zahlen größer als 10.

11^(1:5) 
# [1]  11 121 1331 14641 161051 

Geht man von der folgenden geschehen ist, scheint 5 Stellen signifikant.

100^(1:2) 
# [1] 100 10000 
100^(1:3) 
# [1] 1e+02 1e+04 1e+06 

So sind meine Fragen dann:

Warum wissenschaftliche Schreibweise zwischen dem 4. und 5. Leistung für 10 und nicht für andere Zahlen aktiviert ist? Ist die Nummer 5 signifikant? Darüber hinaus, warum 5 und nicht eine Zahl näher an die maximale Anzahl von 22?

Antwort

42

Nun, die Antwort ist eigentlich dort in der Definition von scipen in ?options, obwohl es ziemlich schwierig ist, zu verstehen, was es bedeutet, ohne mit einigen Beispielen Herumspielen:

'scipen': Ganzzahl. Eine Strafe, die angewendet wird, wenn entschieden wird, numerische Werte in fester oder exponentieller Notation auszudrucken. Positive Werte Bias gegenüber festen und negativen gegenüber wissenschaftlichen Notation: feste Notation wird bevorzugt, es sei denn, es ist mehr als Scipen Ziffern breiter.

Um zu sehen, was das bedeutet, untersuchen Sie die folgenden drei Paare von genau identischen Nummern. In den ersten beiden Fällen ist die Breite in Zeichen der festen Notation, die kleiner oder gleich der Breite der wissenschaftlichen Notation ist, feste Notation bevorzugt. Im dritten Fall ist die feste Schreibweise jedoch breiter (d. H. "Mehr als 0 Ziffern breiter"), weil die 5 Nullen mehr Zeichen umfassen als die 4 Zeichen, die den gleichen Wert darstellen, unter Verwendung von e+nn. Als Ergebnis wird in diesem Fall wissenschaftliche Notation bevorzugt.

1e+03 
1000 
# [1] 1000 

1e+04 
10000 
# [1] 10000 

1e+05 
100000  ## <- wider 
# [1] 1e+05 

Als nächstes untersuchen einige Zahlen, die auch mit vielen Nullen enden, aber deren Darstellung in wissenschaftlicher Notation wird die Verwendung eines . erfordern. Für diese Zahlen wird wissenschaftliche Notation verwendet, sobald Sie 6 oder mehr Nullen haben (d. H. Mehr als die 5 Zeichen, die von einem . und den Zeichen e+nn eingenommen werden).

1.1e+06 
1100000 
# [1] 1100000 


1.1e+07 
11000000  ## <- wider 
# [1] 1.1e+07 

Reasoning über den Kompromiss bekommt ein bisschen schwieriger für die meisten anderen Zahlen, bei denen die Werte sowohl von options("scipen") und options("digits") ins Spiel kommen, aber die allgemeine Idee ist genau das gleiche.

Um einige der leicht überraschenden Komplikationen zu sehen, die ins Spiel kommen, können Sie Folgendes in Ihre Konsole einfügen (vielleicht nach dem ersten Versuch vorherzusagen, wo innerhalb jeder Serie der Wechsel zur wissenschaftlichen Notation erfolgen wird).

100001 
1000001 
10000001 
100000001 
1000000001 
10000000001 
100000000001 
1000000000001 

111111 
1111111 
11111111 
111111111 
1111111111 
11111111111 
111111111111 
1111111111111 
8

Ich bin verwirrt, was genau deine Frage ist; Oder, genauer gesagt, wie würden Sie eine Antwort auf diese Frage verwenden, um das Verhalten von R irgendwie zu verändern/zu kontrollieren. Sie versuchen, Zahlen auf eine bestimmte Art zu formatieren? Dafür gibt es bessere Möglichkeiten.

Wenn Sie solche Werte eingeben, werden die Ergebnisse implizit durch einen der print() Befehle ausgeführt, die "schön" für die Konsole formatiert werden sollen. Wenn Dinge auf dem Bildschirm "nett" aussehen sollen, ist der Code dafür oft hässlich. Hier wird der meiste Code von der formatReal Funktion und der Helfer Funktion erledigt. Letztere Spuren die folgenden Informationen für eine Reihe

/* for a number x , determine 
* sgn = 1_{x < 0} {0/1} 
* kpower = Exponent of 10; 
* nsig = min(R_print.digits, #{significant digits of alpha}) 
* roundingwidens = 1 if rounding causes x to increase in width, 0 otherwise 
* 
* where |x| = alpha * 10^kpower and 1 <= alpha < 10 
*/ 

Dann wird die frühere Funktion diese Informationen benutzen, um zu versuchen, „nett“ suchen Zahlen zu machen, indem Werte nach links und rechts neben der Dezimalstelle balanciert. Es ist eine Kombination von vielen Dingen wie die Größenordnung der Anzahl und der Anzahl der signifikanten Stellen sowie Umwelteinflüsse die scipen Option bilden usw.

print() nur gemeint, um die Dinge aussehen „schön.“ Was genau schön ist, hängt von allen Werten in einem Vektor ab. Sie werden in diesem Code einige harte Cutoffs finden; es ist sehr anpassungsfähig. Es gibt keinen einfachen Weg, um alles, was es im allgemeinen Fall tut (wie es klingt, wie Sie es wünschen), kurz zu beschreiben.

Die einzige Sache, die sicher ist, dass, wenn Sie Ihre Zahlen in einer bestimmten Weise formatiert haben müssen, verwenden Sie eine Funktion wie sprintf() oder formatC(), die für eine präzise Steuerung ermöglicht.

Natürlich ist dieses Verhalten abhängig von class() und ich habe die formatReal Zeug, da das ist, wo die meisten kniffligen Dinge passieren.Aber der Unterschied beobachten, wenn Sie ganze Zahlen verwenden

c(10, 100, 1000, 10000, 100000) 
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05 
c(10L, 100L, 1000L, 10000L, 100000L) 
# [1]  10 100 1000 10000 100000 
+0

Um zu verdeutlichen, versuche ich nicht, das Verhalten zu ändern. Ich frage mich eher, warum dies nur für z. 10^(1: 5) und nicht für 11^(1: 5). Vielfache von 10 scheinen signifikant zu sein, und das gleiche gilt für 5 Ziffern, wenn die Zahl ein Vielfaches von 10 ist. Aber es macht Sinn, dass R die Zahlen "auffrischt". –

+0

Der Unterschied zwischen '10^(1: 5)' und '11^(1: 5)' ist hauptsächlich auf den Unterschied in der Anzahl der signifikanten Stellen zurückzuführen. Wenn Sie mit 10 arbeiten, verlieren Sie keine Informationen, wenn Sie zur wissenschaftlichen Notation springen. Aber wenn Sie 11 als Basis verwenden, würden Sie möglicherweise Ziffern verlieren. – MrFlick

Verwandte Themen