Sự khác biệt giữa `1L` và` 1` là gì?


152

Tôi thường thấy các biểu tượng 1L(hoặc 2L, 3L, vv) xuất hiện trong mã R. Sự khác biệt giữa 1Lvà là 1gì? 1==1Lđánh giá để TRUE. Tại sao được 1Lsử dụng trong mã R?


18
Lưu ý: 1 == 1Lcho TRUE, nhưng identical(1, 1L)cho FALSE.
CJB

Câu trả lời:


129

Vì vậy, @James và @Brian đã giải thích ý nghĩa của 3L. Nhưng tại sao bạn lại sử dụng nó?

Hầu hết thời gian nó không có sự khác biệt - nhưng đôi khi bạn có thể sử dụng nó để mã của bạn chạy nhanh hơn và tiêu thụ ít bộ nhớ hơn . Một vectơ kép ("số") sử dụng 8 byte cho mỗi phần tử. Một vectơ số nguyên chỉ sử dụng 4 byte cho mỗi phần tử. Đối với các vectơ lớn, đó là bộ nhớ ít lãng phí hơn và ít phải lội qua CPU hơn (vì vậy nó thường nhanh hơn).

Chủ yếu là điều này áp dụng khi làm việc với các chỉ số. Đây là một ví dụ trong đó việc thêm 1 vào một vectơ số nguyên biến nó thành một vectơ kép:

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) 

... nhưng cũng lưu ý rằng làm việc quá mức với số nguyên có thể nguy hiểm:

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

... và như @Gavin đã chỉ ra, phạm vi cho các số nguyên là khoảng -2e9 đến 2e9.

Một điều lưu ý là điều này áp dụng cho phiên bản R hiện tại (2.13). R có thể thay đổi điều này tại một số điểm (số nguyên 64 bit sẽ rất ngọt, có thể cho phép các vectơ có độ dài> 2e9). Để an toàn, bạn nên sử dụng .Machine$integer.maxbất cứ khi nào bạn cần giá trị số nguyên tối đa (và phủ nhận giá trị đó ở mức tối thiểu).


1
Tôi nghĩ rằng các yêu cầu bộ nhớ của R là như nhau bất kể loại nào, ít nhất là theo object.size. Những gì nó hữu ích cho việc chuyển đến mã Fortran hoặc C có thể yêu cầu dữ liệu của một loại cụ thể.
James

2
Không, hãy thử object.size(1:100)so với object.size(1:100+0)400 byte + một số chi phí so với 800 byte + một số chi phí chung. Tôi đã cập nhật ví dụ trên.
Tommy

2
Đáng nói là tràn số nguyên là do sử dụng các số nguyên có chữ ký 32 bit, do đó bị giới hạn ở khoảng +/- 2 * 10 ^ 9, ngay cả trên 64 bit R ...
Gavin Simpson

1
@Zach nó cũng ngắn hơn rất nhiều để gõ :-)
Gavin Simpson

1
@Gavin Simpson tất nhiên. Tôi đã thực sự suy nghĩ của tình huống mà bạn tạo ra toàn bộ một véc tơ, giống như c(1L, 2L, 3L, 4L,...100L)vs as.integer(c(1, 2, 3, 4,...100)).
Zach

54

Từ phần Hằng số của Định nghĩa Ngôn ngữ R :

Chúng ta có thể sử dụng hậu tố 'L' để đủ điều kiện cho bất kỳ số nào với mục đích biến nó thành một số nguyên rõ ràng. Vì vậy, '0x10L' tạo giá trị nguyên 16 từ biểu diễn thập lục phân. Hằng số 1e3L cho 1000 dưới dạng số nguyên thay vì giá trị số và tương đương với 1000L. (Lưu ý rằng 'L' được coi là đủ điều kiện 1e3 chứ không phải 3.) Nếu chúng tôi đủ điều kiện một giá trị với 'L' không phải là giá trị nguyên, ví dụ: 1e-3L, chúng tôi nhận được cảnh báo và giá trị số là tạo. Một cảnh báo cũng được tạo nếu có một số thập phân không cần thiết trong số, ví dụ: 1.L.


46

L chỉ định một kiểu số nguyên, thay vì gấp đôi lớp số chuẩn.

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

2

Để rõ ràng tạo một giá trị số nguyên cho hằng số, bạn có thể gọi hàm as.integer hoặc đơn giản hơn là sử dụng hậu tố "L".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.