171 votes

Ce qui ' la différence entre "1 L" et "1" ?

J’ai souvent vu le symbole (ou , , etc.) apparaissent dans le code R. Quelle est la différence entre et ?a la valeur . Pourquoi est utilisé dans le code de la R ?

143voto

Tommy Points 16323

Donc, @James et @Brian a expliqué ce qu' 3L moyens. Mais pourquoi voulez-vous l'utiliser?

La plupart du temps il ne fait aucune différence, mais parfois vous pouvez utiliser pour obtenir votre code de courir plus vite et consomme moins de mémoire. Un double ("numérique") vecteur utilise 8 octets par élément. Un entier vecteur utilise seulement 4 octets par élément. Pour les grands vecteurs, c'est moins de perte de mémoire et de moins en moins à parcourir pour le CPU (de sorte qu'il est généralement plus rapide).

La plupart du temps il s'applique lorsque l'on travaille avec des indices. Voici un exemple où l'ajout de 1 à un nombre entier de vecteur en fait un double vecteur:

x <- 1:100
typeof(x) # integer

y <- x+1
typeof(y) # double, twice the memory size
object.size(y) # 840 bytes (on win64) 

z <- x+1L
typeof(z) # still integer
object.size(z) # 440 bytes (on win64) 

...mais aussi de noter que le travail excessivement avec les nombres entiers peuvent être dangereux:

1e9L * 2L # Works fine; fast lean and mean!
1e9L * 4L # Ooops, overflow!

...et comme @Gavin souligné, la gamme pour les entiers est à peu près -2e9 pour 2e9.

Une mise en garde cependant, c'est que cela s'applique à la version R (2.13). R peut le changer à un certain point (les entiers 64 bits serait doux, ce qui pourrait permettre de vecteurs de longueur > 2e9). Pour être sûr, vous devez utiliser .Machine$integer.max quand vous avez besoin le maximum de valeur de type entier (et nier que pour le minimum).

57voto

Brian Gordon Points 2551

À partir de la Section Constantes du Langage R Définition:

Nous pouvons utiliser le ‘L' suffixe pour qualifier n'importe quel nombre avec l'intention d'en faire une entière explicite. Si "0x10L' crée la valeur de l'entier 16 de la représentation hexadécimale. La constante 1e3L donne 1000 comme un entier plutôt qu'une valeur numérique et est équivalent à 1000L. (Notez que l' "L" est considérée comme éligible, le terme 1e3 et pas le 3.) Si nous nous qualifions d'une valeur avec un " L " qui est pas un nombre entier, par exemple 1e-3L, nous obtenons un message d'avertissement et la valeur numérique est créé. Un avertissement est également créé si il n'y est inutile, du point décimal du nombre, par exemple 1.L'.

48voto

James Points 24725

L spécifie un type entier, plutôt qu'un double de la classe numérique standard.

 > str(1)
 num 1
> str(1L)
 int 1
 

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