147 votes

Le contrôle de chiffres dans la R

Il y a une option dans R pour obtenir le contrôle sur l'afficheur. Par exemple:

options(digits=10)

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

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

Donc, il dit que c'est seulement une suggestion. Que faire si j'aime toujours d'affichage 10 chiffres, n'est pas plus ou moins?

Ma deuxième question est, est ce que si je les aime pour afficher plus de 22 chiffres, c'est à dire avec plus de précision les calculs de 100 chiffres? Est-il possible avec la base de R, ou dois-je besoin d'un forfait supplémentaire de la fonction/pour qui?

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

qui a 48 décimales. Est-ce la limite maximale de R peut-il gérer? En fait pi a un nombre infini de décimales.

62voto

Richie Cotton Points 35365

La raison pour laquelle elle n'est qu'une suggestion est que vous pouvez très facilement écrire une fonction d'impression, qui ignorait les options de valeur. L'impression et les fonctions de mise en forme ne l'utilisation de l' options de la valeur en tant que par défaut.

Quant à la deuxième question, puisque R utilise précision finie arithmétique, vos réponses ne sont pas exacts au-delà de 15 ou 16 décimales, donc, en général, plus ne sont pas nécessaires. Le gmp et rcdd paquets de traiter avec de multiples précision de l'arithmétique (par l'intermédiaire d'une interface à la librairie gmp), mais c'est surtout liée à de grands entiers plutôt que plus de décimales pour vos doubles.

Mathematica (et éventuellement d'Érable) 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 s'appuient sur les différences au-delà de la 15e chiffre significatif, votre analyse est presque certainement indésirable.

D'autre part, si vous êtes juste de traiter avec de très petits nombres, qui est moins un problème, puisque R peut gérer nombre aussi petit que .Machine$double.xmin (généralement 2e-308).

Comparer 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 ne surviennent qu'après beaucoup de chiffres significatifs, de sorte que les données sont "à peu près constant". Dans le second cas, Bien que la taille des différences entre les nombres sont les mêmes, par rapport à l'ampleur des chiffres eux-mêmes, ils sont de grande taille.


Comme mentionné par e3bo, vous pouvez utiliser de multiples précision des nombres à virgule flottante à l'aide de l' Rmpfr package.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

Ces sont plus lents et plus gourmande en mémoire pour une utilisation plus régulière (double précision) numeric vecteurs, mais peut être utile si vous avez un mal conditionné problème ou instable de l'algorithme.

60voto

Si vous êtes à la production de l'ensemble de la sortie vous-même, vous pouvez utiliser sprintf

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

Je ne connais pas de moyen de forcer les R aux fonctions de haut niveau pour imprimer un nombre exact de chiffres.

L'affichage de 100 chiffres ne prennent de sens que si vous imprimez la R habituelle du nombre, puisque la meilleure précision que vous pouvez obtenir à l'aide de 64 bits double est d'environ 16 chiffres décimaux (regardez .Machine$en occupation double.pc sur votre système). Les chiffres restants seront simplement indésirable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X