2010-02-18 24 views
77

Il existe une option dans R pour contrôler l'affichage des chiffres. Par exemple:Contrôle du nombre de chiffres décimaux dans la sortie d'impression dans R

options(digits=10) 

est supposé donner les résultats de calcul en 10 chiffres jusqu'à la fin de la session 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 à imprimer lors de l'impression des valeurs numériques. C'est une suggestion seulement. Les valeurs valides sont 1 ... 22 par défaut

Ainsi, 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: que se passe-t-il si je souhaite 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 paquet/fonction supplémentaire pour cela?

Edit: 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 que R peut gérer? En fait pi a un nombre infini de décimales.

+4

Seuls les 15 premiers chiffres de pi sont précis. Comparez à la vraie valeur http://joyofpi.com/pi.html –

+1

Vous avez raison. Pourquoi est-ce différent en R? –

+3

Voir la FAQ sur R http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f –

Répondre

38

La raison pour laquelle ce n'est qu'une suggestion, c'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 valeur options par défaut. En ce qui concerne la deuxième question, puisque R utilise l'arithmétique à précision finie, vos réponses ne sont pas précises au-delà de 15 ou 16 décimales, donc en général, d'autres ne sont pas nécessaires. Les paquets gmp et rcdd traitent de l'arithmétique de précision multiple (via un interace à la bibliothèque gmp), mais ceci est principalement lié à de grands entiers plutôt qu'à plus de décimales pour vos doubles.

Mathematica ou Maple vous permettra 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 faites des tests statistiques qui reposent sur des différences au-delà du 15e chiffre significatif, alors votre analyse est presque certainement indésirable.D'autre part, si vous ne faites que de très petits nombres, cela pose moins de problèmes, puisque R peut gérer un nombre aussi petit que .Machine$double.xmin (habituellement 2e-308).

Comparez ces deux analyses. Dans le premier cas, les différences entre les nombres n'apparaissent qu'après de nombreuses figures significatives, 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 à l'ampleur des nombres eux-mêmes, ils sont grands.


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 gourmandes en mémoire à utiliser que régulière (double précision) numeric vecteurs, mais peut être utile si vous avez un problème mal conditionné ou algorithme instable.

+3

Comme le montre [cette page Rwiki] (http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:high_precision_arithmetic), le [package Rmpfr] (http: //cran.at.r-project. org/web/packages/Rmpfr/index.html) permet une arithmétique à virgule flottante de haute précision dans R. – e3bo

+0

Mais Rmpfr peut-il être utilisé par n'importe quel paquet R pour améliorer sa précision? Ou il peut seulement utiliser les fonctions codées en interne sur lui? – skan

+2

Je pensais juste que, "Si vous faites des tests statistiques qui reposent sur des différences au-delà du 15e chiffre significatif, alors votre analyse est presque certainement indésirable." mais je me demandais quel serait le nombre de chiffres à partir de laquelle je conclurais que c'est de la camelote, et je pensais que 5, mais je serais heureux d'être corrigé. – PatrickT

29

Si vous produisez la sortie entière vous-même, vous pouvez utiliser sprintf

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

Je ne connais aucun moyen de forcer les fonctions de niveau supérieur de R pour imprimer un nombre exact de chiffres.

L'affichage de 100 chiffres n'a pas de sens si vous imprimez les nombres habituels de R, car la meilleure précision que vous pouvez obtenir avec des doubles 64 bits est d'environ 16 chiffres décimaux (regardez .Machine $ double.eps sur votre système). Les chiffres restants seront juste indésirables.

+0

En fait, certains tests spéciaux de khi-deux que j'avais appliqués nécessitaient des centaines de décimales pour donner des résultats précis. Aussi pi a des milliers de décimales. C'est pourquoi je me demandais environ 100 chiffres ou plus. –

+12

pi a un nombre infini de décimales; Cela ne signifie pas qu'un ordinateur peut les stocker. – Shane

+0

Je suppose que c'est un scénario où Mathematica est supérieur à R. – skan