'1L` ve `1` arasındaki fark nedir?


152

Sık sık sembolü görülen 1L(veya 2L, 3Lvs.) R kodu görünür. Nedir arasındaki fark 1Lve 1? 1==1Lolarak değerlendirir TRUE. 1LR kodunda neden kullanılır?


18
Not: 1 == 1Lverir TRUE, identical(1, 1L)verir FALSE.
CJB

2
Ayrıca bkz R L açıklık
Henrik

Yanıtlar:


129

Böylece @James ve @Brian 3L'nin ne anlama geldiğini açıkladı . Ama neden kullanasın ki?

Çoğu zaman fark etmez - ancak bazen kodunuzun daha hızlı çalışmasını ve daha az bellek tüketmesini sağlamak için kullanabilirsiniz . Bir çift ("sayısal") vektör, eleman başına 8 bayt kullanır. Bir tamsayı vektörü eleman başına sadece 4 bayt kullanır. Büyük vektörler için, bu daha az boşa harcanan ve CPU için daha az harcanan şeydir (bu yüzden genellikle daha hızlıdır).

Çoğunlukla bu, endekslerle çalışırken geçerlidir. Bir tamsayı vektörüne 1 eklemenin onu bir çift vektöre dönüştürdüğü bir örnek:

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) 

... ancak tamsayılarla aşırı çalışmanın tehlikeli olabileceğini de unutmayın:

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

... ve @Gavin'in işaret ettiği gibi, tamsayıların aralığı kabaca -2e9 ila 2e9'dur.

Ancak bir uyarı, bunun mevcut R versiyonu (2.13) için geçerli olmasıdır. R bunu bir noktada değiştirebilir (64 bit tamsayılar tatlı olacaktır, bu da> 2e9 uzunluk vektörlerini etkinleştirebilir). Güvende .Machine$integer.maxolmak için, maksimum tamsayı değerine ihtiyaç duyduğunuzda (ve minimum değeri reddettiğinizde) kullanmalısınız.


1
Bence R'nin bellek gereksinimleri türüne bakılmaksızın aynı, en azından buna göre object.size. Faydalı olan, belirli bir tipte veri gerektirebilecek Fortran veya C koduna geçmektir.
James

2
Hayır, denemek object.size(1:100)vs object.size(1:100+0)400 bayt + bazı havai vs 800 bayt + bazı havai bu. Yukarıdaki örneği güncelledim.
Tommy

2
Tamsayı taşmasının 32-bit işaretli tamsayıların kullanımından kaynaklandığını belirtmek gerekir, bu nedenle 64-bit R'de bile +/- 2 * 10 ^ 9 ile sınırlıdır ...
Gavin Simpson

1
@Zach da yazmak için çok daha kısa :-)
Gavin Simpson

1
@ Galin Simpson elbette. Gerçekten, c(1L, 2L, 3L, 4L,...100L)vs gibi tüm bir vektörü oluşturduğunuz durumu düşünüyordum as.integer(c(1, 2, 3, 4,...100)).
Zach

54

Gönderen Sabitler Bölüm ait R Dili Tanımı :

Herhangi bir sayıyı açık bir tamsayı yapmak amacıyla nitelendirmek için 'L' sonekini kullanabiliriz. Böylece '0x10L', onaltılı gösterimden 16 tam sayı değerini oluşturur. 1e3L sabiti, sayısal bir değer yerine 1000'i bir tamsayı olarak verir ve 1000L'ye eşdeğerdir. ('L' değerinin 3 yerine 1e3 terimini nitelediği kabul edilir.) 'L' ile bir tamsayı değeri olmayan bir değeri (örneğin 1e-3L) kabul edersek, bir uyarı alırız ve sayısal değer yarattı. Sayıda gereksiz bir ondalık nokta varsa, örneğin 1.L de bir uyarı oluşturulur.


46

L, standart sayısal sınıfın iki katı değil, bir tamsayı türü belirtir.

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

2

Bir sabit için açıkça bir tamsayı değeri oluşturmak için bu işlevi işlev olarak adlandırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.