Sự khác biệt giữa lớp số nguyên và lớp số trong R


93

Tôi muốn mở đầu điều này bằng cách nói rằng tôi là một người mới bắt đầu lập trình tuyệt đối, vì vậy, xin miễn phí cho câu hỏi này cơ bản như thế nào.

Tôi đang cố gắng hiểu rõ hơn về các lớp "nguyên tử" trong R và có thể điều này áp dụng cho các lớp trong lập trình nói chung. Tôi hiểu sự khác biệt giữa các lớp dữ liệu ký tự, lôgic và phức tạp, nhưng tôi đang đấu tranh để tìm ra sự khác biệt cơ bản giữa lớp số và lớp số nguyên.

Giả sử tôi có một vectơ đơn giản x <- c(4, 5, 6, 6)gồm các số nguyên, nó sẽ hợp lý nếu đây là một lớp số nguyên. Nhưng khi class(x)tôi nhận được [1] "numeric". Sau đó, nếu tôi chuyển đổi vectơ này thành một lớp số nguyên x <- as.integer(x). Nó trả về cùng một danh sách chính xác các số ngoại trừ lớp là khác nhau.

Câu hỏi của tôi là tại sao lại như vậy và tại sao lớp mặc định cho một tập hợp các số nguyên là một lớp số, và những ưu và nhược điểm của việc có một tập hợp số nguyên là số thay vì số nguyên là gì.


4
as.integer(c(4.1, 5.2, 6.3, 6.4))giúp bạn hiểu sự khác biệt? Bạn cần hiểu rằng phần biểu diễn bên trong và phần được in ra không giống nhau chút nào. Dù sao, hãy đọc về các kiểu dữ liệu trong ngôn ngữ máy tính.
Roland

Trong cột "Có liên quan" ở bên phải là câu hỏi này: stackoverflow.com/questions/8804779/…
Matthew Lundberg

1
x <- 1; is.integer(x); is.numeric(x)Sau đó, hãy thử x <- 1L; is.integer(x); is.numeric(x)và bạn có thể thấy một chút khác biệt. Các lớp số nguyên được sử dụng nhiều hơn để chuyển các biến từ cấu trúc C và cả trong cấu trúc R. Tuy nhiên, còn rất nhiều điều khác về điều này.
Rich Scriven

@Roland Tôi không nghĩ về các lớp chỉ định độ chính xác. Tôi đã quen với việc sử dụng các phương thức float để thao tác với các lớp số nguyên. Nó có lý.
Keon

Câu trả lời:


82

Có nhiều lớp được nhóm lại với nhau dưới dạng lớp "số", 2 lớp phổ biến nhất là lớp kép (đối với số dấu phẩy động chính xác kép) và số nguyên. R sẽ tự động chuyển đổi giữa các lớp số khi cần thiết, vì vậy, đối với hầu hết người dùng thông thường, việc số 3 hiện được lưu trữ dưới dạng số nguyên hay số kép không quan trọng đối với người dùng. Hầu hết các phép toán được thực hiện bằng cách sử dụng độ chính xác kép, vì vậy đó thường là bộ nhớ mặc định.

Đôi khi bạn có thể muốn lưu trữ cụ thể một vectơ dưới dạng số nguyên nếu bạn biết rằng chúng sẽ không bao giờ được chuyển đổi thành số đôi (được sử dụng làm giá trị ID hoặc lập chỉ mục) vì số nguyên yêu cầu ít dung lượng lưu trữ hơn. Nhưng nếu chúng sẽ được sử dụng trong bất kỳ phép toán nào sẽ chuyển chúng thành nhân đôi, thì có lẽ sẽ nhanh nhất chỉ cần lưu trữ chúng dưới dạng nhân đôi.


45

Trước hết, việc sử dụng R thành công trong nhiều năm là hoàn toàn khả thi và không cần biết câu trả lời cho câu hỏi này. R xử lý sự khác biệt giữa số (thông thường) và số nguyên cho bạn trong nền.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Đặt chữ 'L' viết hoa sau một số nguyên buộc nó phải được lưu trữ dưới dạng số nguyên.)

Như bạn có thể thấy "số nguyên" là một tập hợp con của "số".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Các số nguyên chỉ lớn hơn 2 tỷ một chút, trong khi các số khác có thể lớn hơn nhiều. Chúng có thể lớn hơn vì chúng được lưu trữ dưới dạng số dấu chấm động chính xác gấp đôi. Điều này có nghĩa là số được lưu trữ trong hai phần: số mũ (như 308 ở trên, ngoại trừ trong cơ số 2 chứ không phải cơ số 10) và "ý nghĩa" (như 1.797693 ở trên).

Lưu ý rằng 'is.integer' không phải là bài kiểm tra xem bạn có một số nguyên hay không mà là bài kiểm tra cách dữ liệu được lưu trữ.

Một điều cần chú ý là toán tử dấu hai chấm :, sẽ trả về số nguyên nếu điểm đầu và điểm cuối là số nguyên. Ví dụ: 1:5tạo một integervectơ gồm các số từ 1 đến 5. Bạn không cần phải nối thêm chữ cái L.

> class(1:5)
[1] "integer"

Tham khảo: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R


11
Lấy chính xác từ bài đăng Quora Đúng không? Bạn có thể chỉ cần đề cập đến tài liệu tham khảo!
Srujan Barai


4

Để trích dẫn trang trợ giúp (thử ?integer), phần in đậm của tôi:

Các vectơ số nguyên tồn tại để dữ liệu có thể được chuyển tới mã C hoặc Fortran mà chúng mong đợi và để dữ liệu số nguyên (nhỏ) có thể được biểu diễn chính xác và gọn gàng .

Lưu ý rằng các triển khai hiện tại của R sử dụng số nguyên 32 bit cho các vectơ số nguyên, do đó, phạm vi số nguyên có thể biểu diễn được giới hạn trong khoảng +/- 2 * 10 ^ 9: double có thể chứa chính xác các số nguyên lớn hơn nhiều.

Giống như trang trợ giúp đã nói, chữ R là integercác số 32 bit có chữ ký, do đó có thể chứa từ -2147483648 đến +2147483647 và chiếm 4 byte.

R numericgiống hệt với 64 bit doubletuân theo tiêu chuẩn IEEE 754. R không có kiểu dữ liệu chính xác duy nhất. (nguồn: các trang trợ giúp của numericdouble). Double có thể lưu trữ chính xác tất cả các số nguyên từ -2 ^ 53 đến 2 ^ 53 mà không làm mất độ chính xác.

Chúng ta có thể thấy các kích thước kiểu dữ liệu, bao gồm cả chi phí của một vectơ ( nguồn ):

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes

1

Theo hiểu biết của tôi - chúng tôi không khai báo một biến có kiểu dữ liệu nên theo mặc định R đã đặt bất kỳ số nào không có L là số. Nếu bạn đã viết:

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

Ví dụ về Số nguyên:

> x<- 2L
> print(x)

Ví dụ về Numeric (giống như double / float từ các ngôn ngữ lập trình khác)

> x<-3.4
> print(x)

xem ra một phạm vi như 1:5sẽ tạo ra số nguyên.
qwr
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.