web-dev-qa-db-fra.com

Quelle est la différence entre `1L` et` 1`?

J'ai souvent vu le symbole 1L (ou 2L, 3L, etc.) apparaissent dans le code R. Quelle est la différence entre 1L et 1? 1==1L est évalué à TRUE. Pourquoi est-ce 1L utilisé dans le code R?

139
Zach

Ainsi, @James et @Brian ont expliqué quoi 3L signifie. Mais pourquoi l'utiliseriez-vous?

La plupart du temps, cela ne fait aucune différence - mais vous pouvez parfois l'utiliser pour obtenir votre code plus rapidement et consommer ) moins de mémoire . Un vecteur double ("numérique") utilise 8 octets par élément. Un vecteur entier utilise seulement 4 octets par élément. Pour les gros vecteurs, cela représente moins de mémoire perdue et moins de temps à parcourir pour le processeur (donc, il est généralement plus rapide).

Cela s’applique généralement lorsque vous travaillez avec des index. Voici un exemple où ajouter 1 à un vecteur entier le transforme en 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 notez aussi que travailler de manière excessive avec des entiers peut être dangereux:

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

... et comme l'a souligné @Gavin, l'intervalle pour les entiers est d'environ -2e9 à 2e9.

Une mise en garde cependant est que cela s'applique à la version actuelle de R (2.13). R pourrait changer cela à un moment donné (les entiers 64 bits seraient doux, ce qui pourrait permettre des vecteurs de longueur> 2e9). Pour être en sécurité, vous devez utiliser .Machine$integer.max chaque fois que vous avez besoin de la valeur entière maximale (et la nier pour le minimum).

117
Tommy

De la Section des constantes de la Définition du langage R :

Nous pouvons utiliser le suffixe "L" pour qualifier un nombre avec l’intention de le transformer en un entier explicite. Donc, "0x10L" crée la valeur entière 16 à partir de la représentation hexadécimale. La constante 1e3L donne 1000 sous la forme d'un entier plutôt que d'une valeur numérique et équivaut à 1000L. (Notez que le "L" est traité comme qualifiant le terme 1e3 et non le 3.) Si nous qualifions une valeur avec "L" qui n’est pas une valeur entière, par ex. 1e-3L, nous recevons un avertissement et la valeur numérique est créée. Un avertissement est également créé s’il existe un point décimal inutile dans le nombre, par ex. 1.L.

54
Brian Gordon

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
44
James

Pour créer explicitement une valeur entière pour une constante, vous pouvez appeler la fonction as.integer ou plus simplement utiliser le suffixe "L".

1
Eddy Zavala