Hay una opción en R para controlar la visualización de dígitos. Por ejemplo:
options(digits=10)
se supone que da los resultados del cálculo en 10 dígitos hasta el final de la sesión R. En el archivo de ayuda de R, la definición del parámetro de dígitos es la siguiente:
dígitos: controla el número de dígitos que se imprimirán al imprimir valores numéricos. Es solo una sugerencia. Los valores válidos son 1 ... 22 con el valor predeterminado 7
Entonces, dice que esto es solo una sugerencia. ¿Qué pasa si me gusta mostrar siempre 10 dígitos, ni más ni menos?
Mi segunda pregunta es, ¿qué pasa si me gusta mostrar más de 22 dígitos, es decir, para cálculos más precisos como 100 dígitos? ¿Es posible con la base R, o necesito un paquete / función adicional para eso?
Editar: Gracias a la sugerencia de jmoy, lo intenté sprintf("%.100f",pi)
y me dio
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
que tiene 48 decimales. ¿Es este el límite máximo que R puede manejar?
python -c "import math; print(format(math.pi, '.100f'))"
. El resultado espi
con 48 decimales "reales", rellenos de ceros para los 52 dígitos restantes.Respuestas:
La razón por la que es solo una sugerencia es que podría escribir fácilmente una función de impresión que ignorara el valor de las opciones. Las funciones de impresión y formato integradas utilizan el
options
valor como predeterminado.En cuanto a la segunda pregunta, dado que R usa aritmética de precisión finita, sus respuestas no son precisas más allá de 15 o 16 lugares decimales, por lo que, en general, no se requieren más. Los paquetes gmp y rcdd tratan con aritmética de precisión múltiple (a través de una interfaz a la biblioteca gmp), pero esto se relaciona principalmente con números enteros grandes en lugar de más lugares decimales para sus dobles.
Mathematica o Maple te permitirán dar tantos lugares decimales como tu corazón desee.
EDITAR:
Podría ser útil pensar en la diferencia entre lugares decimales y cifras significativas. Si está haciendo pruebas estadísticas que se basan en diferencias más allá de la decimoquinta cifra significativa, es casi seguro que su análisis es basura.
Por otro lado, si solo está tratando con números muy pequeños, eso es un problema menor, ya que R puede manejar números tan pequeños como
.Machine$double.xmin
(generalmente 2e-308).Compare estos dos análisis.
En el primer caso, las diferencias entre números solo ocurren después de muchas cifras significativas, por lo que los datos son "casi constantes". En el segundo caso, aunque el tamaño de las diferencias entre números es el mismo, en comparación con la magnitud de los números en sí, son grandes.
Como lo menciona e3bo, puede usar números de punto flotante de precisión múltiple usando el
Rmpfr
paquete.Son más lentos y de uso más intensivo en memoria que los
numeric
vectores regulares (precisión doble) , pero pueden ser útiles si tiene un problema mal acondicionado o un algoritmo inestable.fuente
Si está produciendo la salida completa usted mismo, puede usar
sprintf()
, por ejemploespecifica que desea formatear un número de punto flotante con diez puntos decimales (en
%.10f
elf
es para flotante y.10
especifica diez puntos decimales).No conozco ninguna forma de obligar a las funciones de nivel superior de R a imprimir un número exacto de dígitos.
Mostrar 100 dígitos no tiene sentido si está imprimiendo los números habituales de R, ya que la mejor precisión que puede obtener usando dobles de 64 bits es alrededor de 16 dígitos decimales (mire .Machine $ double.eps en su sistema). Los dígitos restantes serán simplemente basura.
fuente
Una solución más capaz de controlar cuántos dígitos decimales imprimir según las necesidades (si no desea imprimir ceros redundantes)
Por ejemplo, si usted tiene un vector como
elements
y le gustaría obtenersum
de ellaAparentemente, el último digital como
1
truncado, el resultado ideal debería ser-876.54321
, pero si se establece como una opción decimal de impresión fija, por ejemplosprintf("%.10f", sum(elements))
, cero redundante generar como-876.5432100000
Siguiendo el tutorial aquí: imprimiendo números decimales , si es capaz de identificar cuántos dígitos decimales en un determinado número numérico, como aquí en
-876.54321
, hay 5 dígitos decimales que se deben imprimir, entonces podemos configurar un parámetro para laformat
función como se muestra a continuación:Podemos cambiar el
decimal_length
basado en cada consulta de tiempo, por lo que puede satisfacer diferentes requisitos de impresión decimal.fuente