Tak więc @James i @Brian wyjaśnili, co oznacza 3L. Ale dlaczego miałbyś go używać?
W większości przypadków nie ma to znaczenia - ale czasami można go użyć, aby kod działał szybciej i zużywał mniej pamięci . Wektor podwójny („numeryczny”) zajmuje 8 bajtów na element. Wektor liczb całkowitych wykorzystuje tylko 4 bajty na element. W przypadku dużych wektorów oznacza to mniej zmarnowanej pamięci i mniej czasu na przejście procesora (więc jest zwykle szybszy).
Dotyczy to głównie pracy z indeksami. Oto przykład, w którym dodanie 1 do wektora liczb całkowitych zamienia go w wektor podwójny:
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)
... ale pamiętaj również, że nadmierna praca z liczbami całkowitymi może być niebezpieczna:
1e9L*2L# Works fine; fast lean and mean!1e9L*4L# Ooops, overflow!
... i jak zauważył @Gavin, zakres dla liczb całkowitych wynosi mniej więcej od -2e9 do 2e9.
Zastrzeżenie jest jednak takie, że dotyczy to aktualnej wersji R (2.13). R może to zmienić w pewnym momencie (64-bitowe liczby całkowite byłyby słodkie, co mogłoby umożliwić wektory o długości> 2e9). Aby być bezpiecznym, powinieneś używać .Machine$integer.maxzawsze, gdy potrzebujesz maksymalnej wartości całkowitej (i zaneguj ją dla minimum).
Myślę, że wymagania dotyczące pamięci przez R są takie same niezależnie od typu, przynajmniej według object.size. Przydatne jest przekazywanie do kodu Fortran lub C, który może wymagać danych określonego typu.
James,
2
Nie, spróbuj object.size(1:100)vs. object.size(1:100+0)to 400 bajtów + trochę narzutu vs 800 bajtów + trochę narzutu. Zaktualizowałem powyższy przykład.
Tommy
2
Warto wspomnieć, że przepełnienie liczb całkowitych wynika z użycia 32-bitowych liczb całkowitych ze znakiem, stąd jest ograniczone do około +/- 2 * 10 ^ 9, nawet na 64-bitowym R ...
Gavin Simpson
1
@Zach jest też o wiele krótszy do wpisania :-)
Gavin Simpson
1
@Gavin Simpson oczywiście. Byłem naprawdę myśleć o sytuacji, w której tworzysz cały wektor, jak c(1L, 2L, 3L, 4L,...100L)vs as.integer(c(1, 2, 3, 4,...100)).
Możemy użyć sufiksu „L”, aby zakwalifikować dowolną liczbę z zamiarem uczynienia z niej jawnej liczby całkowitej. Więc „0x10L” tworzy liczbę całkowitą 16 z reprezentacji szesnastkowej. Stała 1e3L daje 1000 jako liczbę całkowitą, a nie wartość liczbową i jest równoważna 1000L. (Zwróć uwagę, że „L” jest traktowane jako kwalifikujące termin 1e3, a nie 3). Jeśli zakwalifikujemy wartość za pomocą „L”, która nie jest liczbą całkowitą, np. 1e-3L, otrzymamy ostrzeżenie, a wartość liczbowa to Utworzony. Ostrzeżenie jest również tworzone, jeśli w liczbie występuje niepotrzebna kropka dziesiętna, np. 1.L.
1 == 1L
dajeTRUE
, aleidentical(1, 1L)
dajeFALSE
.Odpowiedzi:
Tak więc @James i @Brian wyjaśnili, co oznacza 3L. Ale dlaczego miałbyś go używać?
W większości przypadków nie ma to znaczenia - ale czasami można go użyć, aby kod działał szybciej i zużywał mniej pamięci . Wektor podwójny („numeryczny”) zajmuje 8 bajtów na element. Wektor liczb całkowitych wykorzystuje tylko 4 bajty na element. W przypadku dużych wektorów oznacza to mniej zmarnowanej pamięci i mniej czasu na przejście procesora (więc jest zwykle szybszy).
Dotyczy to głównie pracy z indeksami. Oto przykład, w którym dodanie 1 do wektora liczb całkowitych zamienia go w wektor podwójny:
... ale pamiętaj również, że nadmierna praca z liczbami całkowitymi może być niebezpieczna:
... i jak zauważył @Gavin, zakres dla liczb całkowitych wynosi mniej więcej od -2e9 do 2e9.
Zastrzeżenie jest jednak takie, że dotyczy to aktualnej wersji R (2.13). R może to zmienić w pewnym momencie (64-bitowe liczby całkowite byłyby słodkie, co mogłoby umożliwić wektory o długości> 2e9). Aby być bezpiecznym, powinieneś używać
.Machine$integer.max
zawsze, gdy potrzebujesz maksymalnej wartości całkowitej (i zaneguj ją dla minimum).źródło
object.size
. Przydatne jest przekazywanie do kodu Fortran lub C, który może wymagać danych określonego typu.object.size(1:100)
vs.object.size(1:100+0)
to 400 bajtów + trochę narzutu vs 800 bajtów + trochę narzutu. Zaktualizowałem powyższy przykład.c(1L, 2L, 3L, 4L,...100L)
vsas.integer(c(1, 2, 3, 4,...100))
.Z Stałe sekcji w definicji R Język :
źródło
L określa typ liczby całkowitej, a nie dwukrotność standardowej klasy liczbowej.
źródło
Aby jawnie utworzyć wartość całkowitą dla stałej, możesz wywołać funkcję as.integer lub po prostu użyć sufiksu "L".
źródło