Il existe une option dans R pour contrôler l'affichage des chiffres. Par exemple:
options(digits=10)
est censé donner les résultats du calcul en 10 chiffres jusqu'à la fin de la session R. Dans le fichier d'aide de R, la définition du paramètre digits est la suivante:
chiffres: contrôle le nombre de chiffres à imprimer lors de l'impression de valeurs numériques. Ce n'est qu'une suggestion. Les valeurs valides sont 1 ... 22 avec la valeur par défaut 7
Donc, il dit que ce n'est qu'une suggestion. Que faire si j'aime toujours afficher 10 chiffres, ni plus ni moins?
Ma deuxième question est: que faire si j'aime afficher plus de 22 chiffres, c'est-à-dire pour des calculs plus précis comme 100 chiffres? Est-ce possible avec la base R, ou ai-je besoin d'un package / fonction supplémentaire pour cela?
Edit: grâce à la suggestion de jmoy, j'ai essayé sprintf("%.100f",pi)
et ça a donné
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
qui a 48 décimales. Est-ce la limite maximale que R peut gérer?
python -c "import math; print(format(math.pi, '.100f'))"
. Le résultat estpi
avec 48 décimales "réelles", remplies de zéros pour les 52 chiffres restants.Réponses:
La raison pour laquelle ce n'est qu'une suggestion est que vous pouvez facilement écrire une fonction d'impression qui ignore la valeur des options. Les fonctions d'impression et de formatage intégrées utilisent la
options
valeur par défaut.Quant à la deuxième question, étant donné que R utilise l'arithmétique de précision finie, vos réponses ne sont pas précises au-delà de 15 ou 16 décimales, donc en général, il n'est pas nécessaire d'en avoir plus. Les paquets gmp et rcdd traitent de l'arithmétique à précision multiple (via une interace à la bibliothèque gmp), mais cela est principalement lié aux grands entiers plutôt qu'à plus de décimales pour vos doubles.
Mathematica ou Maple vous permettront de donner autant de décimales que votre cœur le désire.
EDIT:
Il peut être utile de réfléchir à la différence entre les décimales et les chiffres significatifs. Si vous effectuez des tests statistiques qui reposent sur des différences au-delà du 15e chiffre significatif, alors votre analyse est presque certainement inutile.
D'un autre côté, si vous avez affaire à de très petits nombres, c'est moins un problème, puisque R peut gérer des nombres aussi petits que
.Machine$double.xmin
(généralement 2e-308).Comparez ces deux analyses.
Dans le premier cas, les différences entre les nombres n'apparaissent qu'après de nombreux chiffres significatifs, de sorte que les données sont "presque constantes". Dans le second cas, bien que la taille des différences entre les nombres soit la même, comparée à la grandeur des nombres eux-mêmes, elles sont importantes.
Comme mentionné par e3bo, vous pouvez utiliser des nombres à virgule flottante à précision multiple à l'aide du
Rmpfr
package.Ils sont plus lents et plus gourmands en mémoire à utiliser que les
numeric
vecteurs réguliers (double précision) , mais peuvent être utiles si vous avez un problème mal conditionné ou un algorithme instable.la source
Si vous produisez vous-même l'intégralité de la sortie, vous pouvez utiliser
sprintf()
, par exemplespécifie que vous souhaitez mettre en forme un nombre à virgule flottante avec dix décimales (dans
%.10f
lef
est pour float et le.10
spécifie dix décimales).Je ne connais aucun moyen de forcer les fonctions de niveau supérieur de R à imprimer un nombre exact de chiffres.
Afficher 100 chiffres n'a pas de sens si vous imprimez les nombres habituels de R, car la meilleure précision que vous pouvez obtenir en utilisant des doubles 64 bits est d'environ 16 chiffres décimaux (regardez .Machine $ double.eps sur votre système). Les chiffres restants seront simplement indésirables.
la source
Une autre solution capable de contrôler le nombre de chiffres décimaux à imprimer en fonction des besoins (si vous ne voulez pas imprimer des zéro (s) redondants)
Par exemple, si vous avez un vecteur
elements
et souhaitez obtenirsum
de celui - ciApparemment, le dernier numérique a
1
été tronqué, le résultat idéal devrait être-876.54321
, mais s'il est défini comme une option décimale d'impression fixe, par exemplesprintf("%.10f", sum(elements))
, des zéros redondants sont générés comme-876.5432100000
En suivant le didacticiel ici: impression de nombres décimaux , si vous pouvez identifier le nombre de chiffres décimaux dans le certain nombre numérique, comme ici
-876.54321
, il y a 5 chiffres décimaux à imprimer, nous pouvons alors configurer un paramètre pour laformat
fonction comme ci-dessous:Nous pouvons changer le
decimal_length
basé sur chaque requête de temps, afin qu'il puisse satisfaire différentes exigences d'impression décimale.la source