Question

Il y a une option dans R pour obtenir le contrôle de l'affichage des chiffres. Par exemple:

options(digits=10)

est censé donner les résultats de calcul à 10 chiffres jusqu'à la fin de la session de R. Dans le fichier d'aide de R, la définition des paramètres chiffres est la suivante:

  

chiffres: contrôle le nombre de chiffres   d'imprimer lors de l'impression des valeurs numériques.   Il est une suggestion. Les valeurs valides   sont 1 ... 22 par défaut 7

Alors, il dit que c'est une suggestion. Que faire si j'aime toujours afficher 10 chiffres, pas plus ou moins?

Ma deuxième question est, si j'aime afficher plus de 22 chiffres, à savoir pour des calculs plus précis comme 100 chiffres? Est-il possible avec la base R, ou ai-je besoin d'un paquet supplémentaire / fonction pour cela?

Modifier Merci à la suggestion de jmoy, j'ai essayé sprintf("%.100f",pi) et il a donné

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

qui a 48 décimales. Est-ce la limite maximale R peut gérer?

Était-ce utile?

La solution

La raison pour laquelle il est seulement une suggestion est que vous pouvez écrire assez facilement une fonction d'impression qui a ignoré la valeur des options. L'impression intégrées et les fonctions de formatage font utiliser la valeur options par défaut.

Quant à la deuxième question, puisque 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, plus ne sont pas nécessaires. et gmp RCDD paquets traiter avec de multiples arithmétique de précision (via un interace à la bibliothèque gmp), mais cela est principalement lié à grands entiers plutôt que des endroits plus décimales pour vos doubles.

Mathematica ou Maple vous permettra de donner autant de décimales que votre coeur désire.

EDIT:
Il pourrait être utile de réfléchir à la différence entre les décimales et les chiffres significatifs. Si vous faites des tests statistiques qui reposent sur des différences au-delà du 15 chiffre significatif, votre analyse est certainement indésirable.

Par contre, si vous êtes affaire très petit nombre, qui est moins un problème, puisque R peut gérer un grand nombre aussi petit que .Machine$double.xmin (généralement 2e-308).

Comparez ces deux analyses.

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

Dans le premier cas, les différences entre les nombres se produisent seulement après beaucoup de chiffres significatifs, de sorte que les données sont « presque constante ». Dans le second cas, bien que la taille des différences entre les chiffres sont les mêmes, par rapport à l'ampleur des chiffres eux-mêmes, ils sont grandes.


Comme mentionné par e3bo, vous pouvez utiliser des nombres à virgule flottante précision multiple en utilisant le package Rmpfr.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

Ce sont plus lents et plus de mémoire intensive à utiliser que régulière (double précision) vecteurs de numeric, mais peut être utile si vous avez un problème mal conditionné ou algorithme instable.

Autres conseils

Si vous produisez vous-même toute sortie, vous pouvez utiliser sprintf(), par exemple.

> sprintf("%.10f",0.25)
[1] "0.2500000000"

indique que vous souhaitez formater un nombre à virgule flottante avec dix points décimaux (en %.10f le f est pour flotteur et le .10 spécifie dix chiffres après la virgule).

Je ne sais pas d'aucune façon de forcer les fonctions de niveau supérieur de R pour imprimer un nombre exact de chiffres.

Affichage 100 chiffres n'a pas de sens si vous imprimez des numéros habituels de R, puisque la meilleure précision que vous pouvez obtenir en utilisant 64 bits double est d'environ 16 chiffres décimaux (regardez .Machine $ double.eps sur votre système). Les chiffres restants seront juste indésirable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top