Contrôle du nombre de chiffres décimaux dans la sortie d’impression en R

Il y a une option dans R pour contrôler l’affichage des chiffres. Par exemple:

options(digits=10) 

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

digits: contrôle le nombre de chiffres à imprimer lors de l’impression de valeurs numériques. C’est une suggestion seulement. Les valeurs valides sont 1 … 22 avec la valeur par défaut 7

Donc, il dit que c’est une suggestion seulement. Et si j’aime toujours afficher 10 chiffres, pas plus ou moins?

Ma deuxième question est la suivante: et si j’aime afficher plus de 22 chiffres, c.-à-d. Pour des calculs plus précis comme 100 chiffres? Est-ce possible avec la base R, ou ai-je besoin d’un package / d’une fonction supplémentaire pour cela?

Edit: Grâce à la suggestion de jmoy, j’ai essayé le sprintf("%.100f",pi) et cela a donné

 [1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 

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

La seule raison est que vous pourriez 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 des options par défaut.

En ce qui concerne la deuxième question, puisque R utilise une arithmétique de précision finie, vos réponses ne sont pas exactes au-delà de 15 ou 16 décimales. Les paquets gmp et rcdd traitent l’arithmétique de précision multiple (via un interace à la bibliothèque gmp), mais ceci est principalement lié aux grands nombres entiers plutôt qu’à davantage de décimales pour vos doubles.

Mathematica ou Maple vous permettront de donner autant de décimales que vous le souhaitez.

MODIFIER:
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 dépassant le 15ème chiffre significatif, votre parsing est presque certainement indésirable.

D’un autre côté, si vous ne traitez que de très petits nombres, cela pose moins de problème, car R peut gérer un nombre aussi petit que .Machine$double.xmin (généralement 2e-308).

Comparez ces deux parsings.

 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 ne se produisent 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 à l’ampleur des chiffres eux-mêmes, ils sont importants.


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

 mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825") 

Celles-ci sont plus lentes et plus gourmandes en mémoire à utiliser que numeric vecteurs numeric classiques (double précision), mais peuvent être utiles si vous avez un problème mal conditionné ou un algorithme instable.

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

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

spécifie que vous voulez formater un nombre à virgule flottante avec dix décimales (dans %.10f le f 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.

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