scientific - ¿Por qué los poderes de 10 imprimen en notación científica en el quinto poder?
options scipen 6 (2)
Bueno, la respuesta está realmente en la definición de scipen
de scipen
in ?options
, aunque es bastante difícil entender lo que significa sin jugar con algunos ejemplos:
''scipen'': entero. Una penalización que se aplicará al decidir imprimir valores numéricos en notación fija o exponencial. Sesgo de valores positivos hacia notación fija y negativa hacia notación científica: la notación fija será preferible a menos que sea más que dígitos ''scipen'' más amplios.
Para ver lo que eso significa, examine los siguientes tres pares de números exactamente idénticos. En los primeros dos casos, se prefiere el ancho en caracteres de la notación fija que es menor o igual que el ancho de la notación científica, por lo que es fija .
En el tercer caso, sin embargo, la notación fija es más ancha (es decir, "más de 0 dígitos más ancha"), porque los 5 ceros equivalen a más caracteres que los 4 caracteres utilizados para representar el mismo valor usando e+nn
. Como resultado, en ese caso se prefiere la notación científica .
1e+03
1000
# [1] 1000
1e+04
10000
# [1] 10000
1e+05
100000 ## <- wider
# [1] 1e+05
A continuación, examine algunos números que también terminan con muchos ceros, pero cuya representación en notación científica requerirá el uso de a .
. Para estos números, la notación científica se usará una vez que tenga 6 o más ceros (es decir, más de los 5 caracteres ocupados por uno y los caracteres e+nn
).
1.1e+06
1100000
# [1] 1100000
1.1e+07
11000000 ## <- wider
# [1] 1.1e+07
El razonamiento sobre la compensación se vuelve un poco más complicado para la mayoría de los otros números, para lo cual entran en juego los valores de ambas options("scipen")
y las options("digits")
, pero la idea general es exactamente la misma.
Para ver algunas de las complicaciones ligeramente sorprendentes que entran en juego, es posible que desee pegar lo siguiente en la consola (quizás después de intentar predecir dónde ocurrirá dentro de cada serie el cambio a la notación científica).
100001
1000001
10000001
100000001
1000000001
10000000001
100000000001
1000000000001
111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111
Me gustaría saber si y cómo los poderes de 10 están relacionados con la impresión de notación científica en la consola. He buscado documentos R y no he encontrado nada relevante, o que realmente entiendo.
Primero, mi configuración de scipen
y digits
son
unlist(options("scipen", "digits"))
# scipen digits
# 0 7
Ahora, las potencias de 10 se imprimen normalmente hasta la 4ª potencia, y luego la impresión cambia a notación científica en la quinta potencia.
10^(1:4)
# [1] 10 100 1000 10000
10^(1:5)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05
Curiosamente, esto no ocurre con otros números mayores a 10.
11^(1:5)
# [1] 11 121 1331 14641 161051
A juzgar por lo siguiente, 5 dígitos parecen significativos.
100^(1:2)
# [1] 100 10000
100^(1:3)
# [1] 1e+02 1e+04 1e+06
Entonces mis preguntas son:
¿Por qué se activa la notación científica entre el 4º y 5º poder para 10 y no para otros números? ¿Es significativo el número 5? Además, ¿por qué 5 y no un número más cercano a la opción de dígitos máximos de 22?
Estoy confundido con cuál es exactamente tu pregunta; o, más especialmente, cómo usaría una respuesta a esta pregunta para cambiar / controlar de algún modo el comportamiento de R. ¿Está intentando formatear números de cierta manera? Hay mejores formas de hacer eso.
Cuando escribe valores como esos, los resultados se ejecutan implícitamente a través de uno de los comandos print()
para formatear "muy bien" en la consola. Cada vez que las cosas tienen que verse "bien" en la pantalla, el código para hacerlo suele ser feo. Aquí, la mayoría de ese código está cubierto por la función formatReal y la función científica auxiliar. Este último rastrea la siguiente información para un número
/* 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
*/
Luego, la función anterior usa esta información para intentar hacer números "agradables" al equilibrar los valores a la izquierda y la derecha del lugar decimal. Es una combinación de muchas cosas, como el orden de magnitud del número y la cantidad de dígitos significativos, así como las influencias ambientales de la opción de scipen
, etc.
print()
solo pretende hacer que las cosas se vean "bonitas". Lo que es bonito depende de todos los valores en un vector. Encontrará pocos cortes duros en ese código; es muy adaptativo. No hay una manera fácil de describir concisamente todo lo que hace en el caso general (que es lo que parece que está pidiendo).
Lo único seguro es que si necesita formatear sus números de cierta manera, use una función como sprintf()
o formatC()
que permita un control preciso.
Por supuesto, este comportamiento depende de la class()
y he apuntado el material de formatReal
ya que es donde ocurren las cosas más difíciles. Pero observe la diferencia cuando usa números enteros
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