Pourquoi les puissances de 10 impriment-elles en notation scientifique à la 5ème puissance?

Je voudrais savoir si et comment les pouvoirs de 10 sont liés à l’impression de la notation scientifique dans la console. J’ai cherché dans R docs et n’ai rien trouvé de pertinent, ou que je comprends vraiment.

Tout d’abord, mes parameters de scipen et de digits sont

 unlist(options("scipen", "digits")) # scipen digits # 0 7 

Maintenant, les puissances de 10 sont imprimées normalement jusqu’à la 4ème puissance, puis l’impression passe à la notation scientifique à la 5ème puissance.

 10^(1:4) # [1] 10 100 1000 10000 10^(1:5) # [1] 1e+01 1e+02 1e+03 1e+04 1e+05 

Fait intéressant, cela ne se produit pas pour d’autres nombres supérieurs à 10.

 11^(1:5) # [1] 11 121 1331 14641 161051 

D’après ce qui suit, 5 chiffres semblent significatifs.

 100^(1:2) # [1] 100 10000 100^(1:3) # [1] 1e+02 1e+04 1e+06 

Donc mes questions sont alors:

Pourquoi la notation scientifique est-elle activée entre la 4ème et la 5ème puissance pour 10 et pas pour d’autres nombres? Le numéro 5 est-il significatif? En outre, pourquoi 5 et pas un nombre plus proche de l’option de chiffres maximum de 22?

Eh bien, la réponse est en fait là dans la définition de scipen in ?options , bien qu’il soit difficile de comprendre ce que cela signifie sans jouer avec quelques exemples:

‘scipen’: entier. Une pénalité à appliquer lors de la décision d’imprimer des valeurs numériques en notation fixe ou exponentielle. Les valeurs positives biaisent vers la notation fixe et négative vers la notation scientifique: la notation fixe sera préférée à moins d’être plus large que les chiffres «scipen».

Pour voir ce que cela signifie, examinez les trois paires suivantes de nombres exactement identiques. Dans les deux premiers cas, la largeur en caractères de la notation fixe qui est inférieure ou égale à la largeur de la notation scientifique, donc fixe, est préférable .

Dans le troisième cas, cependant, la notation fixe est plus large (c.-à-d. “Plus de 0 chiffres plus large”), car les 5 zéros représentent plus de caractères que les 4 caractères utilisés pour représenter la même valeur avec e+nn . En conséquence, la notation scientifique est préférable .

 1e+03 1000 # [1] 1000 1e+04 10000 # [1] 10000 1e+05 100000 ## <- wider # [1] 1e+05 

Ensuite, examinez certains nombres qui se terminent également par de nombreux zéros, mais dont la représentation en notation scientifique nécessitera l'utilisation d'un . . Pour ces nombres, la notation scientifique sera utilisée une fois que vous avez 6 zéros ou plus (c.-à-d. Plus que les 5 caractères pris par un et les caractères e+nn ).

 1.1e+06 1100000 # [1] 1100000 1.1e+07 11000000 ## <- wider # [1] 1.1e+07 

Le raisonnement sur le compromis devient un peu plus compliqué pour la plupart des autres nombres, pour lesquels les valeurs des deux options("scipen") et des options("digits") entrent en jeu, mais l'idée générale est exactement la même.

Pour voir certaines des complications légèrement surprenantes qui entrent en jeu, vous pouvez coller les éléments suivants dans votre console (peut-être après avoir essayé de prédire où dans chaque série le passage à la notation scientifique se produira).

 100001 1000001 10000001 100000001 1000000001 10000000001 100000000001 1000000000001 111111 1111111 11111111 111111111 1111111111 11111111111 111111111111 1111111111111 

Je suis confus quant à savoir quelle est exactement votre question. ou, plus particulièrement, comment vous utiliseriez une réponse à cette question pour changer / contrôler en quelque sorte le comportement de R. Vous essayez de formater les nombres d’une certaine façon? Il y a de meilleures façons de le faire.

Lorsque vous tapez des valeurs comme celles-là, les résultats sont implicitement exécutés si l’une des commandes print() doit être formatée “joliment” sur la console. Chaque fois que les choses doivent avoir l’air “sympa” à l’écran, le code à faire est souvent laid. La plus grande partie de ce code est prise en charge par la fonction formatReal et la fonction scientifique d’ assistance. Ce dernier suit les informations suivantes pour un numéro

 /* for a number x , determine * sgn = 1_{x < 0} {0/1} * kpower = Exponent of 10; * nsig = min(R_print.digits, #{significant digits of alpha}) * roundingwidens = 1 if rounding causes x to increase in width, 0 otherwise * * where |x| = alpha * 10^kpower and 1 <= alpha < 10 */ 

Ensuite, la fonction précédente utilise ces informations pour essayer de créer des nombres "agréables" en équilibrant les valeurs à gauche et à droite de la décimale. C'est une combinaison de nombreuses choses comme l'ordre de grandeur du nombre et le nombre de chiffres significatifs, ainsi que les influences environnementales qui constituent l'option de scipen , etc.

print() est uniquement destiné à rendre les choses "agréables". Ce qui est agréable dépend de toutes les valeurs d'un vecteur. Vous trouverez quelques coupures dans ce code; c'est très adaptatif. Il n'y a pas de moyen facile de décrire de manière concise tout ce qu'il fait dans le cas général (c'est ce que vous voulez dire).

La seule chose certaine est que si vous devez formater vos numéros d'une certaine manière, utilisez une fonction comme sprintf() ou formatC() qui permet un contrôle précis.

Bien sûr, ce comportement dépend de la class() et j'ai indiqué le formatReal car c'est là que les choses les plus délicates se produisent. Mais observez la différence lorsque vous utilisez des entiers

 c(10, 100, 1000, 10000, 100000) # [1] 1e+01 1e+02 1e+03 1e+04 1e+05 c(10L, 100L, 1000L, 10000L, 100000L) # [1] 10 100 1000 10000 100000