¿Por qué las potencias de 10 se imprimen en notación científica en la 5ª potencia?


Me gustaría saber si y cómo las potencias de 10 están relacionadas con la impresión de notación científica en la consola. He buscado R docs y no he encontrado nada relevante, o que realmente entiendo.

En primer lugar, mis ajustes 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 5ª 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 sucede para algunos otros números mayores que 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 la 4ta y la 5ta potencia para 10 y no para otros números? ¿El número 5 es significativo? Además, ¿por qué 5 y no un número más cercano a la opción de dígitos máximos de 22?

Author: FXQuantTrader, 2014-09-16

2 answers

Bueno, la respuesta está realmente ahí en la definición de scipen en ?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. Positivo sesgo de valores hacia fijo y negativo hacia científico notación: se preferirá la notación fija a menos que sea más de 'scipen dígitos amplio.

Para ver lo que eso significa, examine los siguientes tres pares de números exactamente idénticos. En los dos primeros casos, el ancho en caracteres de la notación fija que es menor o igual al ancho de la notación científica, por lo que se prefiere la notación 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 anchos"), porque los 5 ceros equivalen a más caracteres que los 4 caracteres utilizados para representar el mismo valor utilizando 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 un .. Para estos números, la notación científica se utilizará una vez que tenga 6 o más ceros (es decir, más de los 5 caracteres tomados 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 que los valores de options("scipen") y options("digits") entran en juego, 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 su consola (tal vez después de intentar predecir dónde dentro de cada serie se producirá el cambio a la notación científica).

100001
1000001
10000001
100000001
1000000001
10000000001
100000000001
1000000000001

111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111
 42
Author: Josh O'Brien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-16 05:26:49

Estoy confundido en cuanto a cuál es exactamente su pregunta; o, más especialmente, cómo usaría una respuesta a esta pregunta para cambiar/controlar de alguna manera el comportamiento de R. ¿Está tratando de formatear los números de cierta manera? Hay mejores maneras de hacerlo.

Cuando escribe valores como ese, los resultados se ejecutan implícitamente a través de uno de los comandos print() que se formatearán "bien" en la consola. Siempre que las cosas tienen que verse "bien" en la pantalla, el código para hacerlo es a menudo feo. Aquí la mayoría de los ese código es atendido por la función formatReal , y la función helper scientific . 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
 */

Entonces la función anterior usa esta información para tratar de hacer números de aspecto "agradable" equilibrando valores a la izquierda y a la derecha del lugar decimal. Es una combinación de muchas cosas como el orden de magnitud del número y el número de dígitos significativos, así como la forma de influencias ambientales la opción scipen, etc.

print() sólo tiene la intención de hacer que las cosas se vean "agradables"."Lo que es exactamente bueno depende de todos los valores en un vector. Encontrarás pocos cortes duros en ese código; es muy adaptable. No hay una manera fácil de describir concisamente todo lo que hace en el caso general (que es lo que parece que estás pidiendo).

Lo único que es seguro es que si necesita tener sus números formateados de cierta manera, use una función como sprintf() o formatC() que permita para un control preciso.

Por supuesto, este comportamiento depende de class() y he señalado las cosas formatReal ya que es donde suceden las cosas más complicadas. Pero observe la diferencia cuando se utilizan 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
 8
Author: MrFlick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-06 00:10:44