2013-07-15 44 views
8

Trong tập lệnh dài hơn, tôi phải nhân chiều dài của vectơ A (2614) với số hàng của một khung dữ liệu B (1456000). Nếu tôi làm điều đó trực tiếp với length(A) * nrow(B) Tôi nhận được thông báo NAs produced by integer overflow mặc dù không có vấn đề khi tôi nhân lên những con số giống nhau:R: phép nhân đơn giản gây ra tràn số nguyên

2614 * 1456000 
[1] 3805984000 

Cách duy nhất để có được những nhân để làm việc là round(length(A)) * nrow(B) hoặc length(A) * round(nrow(B)). Nhưng các con số được tạo ra bởi lengthnrow phải là số nguyên dù sao đi nữa! Hơn nữa, tôi đã thử nghiệm tính năng này với chức năng sau được đề xuất trên trang trợ giúp cho hàm is.integer ...

is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x-round(x)) < tol 

... và tất nhiên, chúng là số nguyên. Vậy tại sao tôi cần nạng "tròn" ở đây? Rất khó hiểu ... Ai đó đã có một ý tưởng những gì đang xảy ra trong nền?

+2

'2614 * 1456000' là ** không ** số nguyên ... '> lớp (1.456.000) [1] "số" > lớp (1456000L) [1] "số nguyên"' – Michele

+0

@Michele cảm ơn, Tôi đã cập nhật câu trả lời của tôi một chút vì nhận xét này. –

Trả lời

10

Hy vọng rằng một đại diện đồ họa của những gì đang xảy ra ....

2614 * 1456000 
#[1] 3805984000 

## Integers are actually represented as doubles 
class(2614 * 1456000) 
#[1] "numeric" 

# Force numbers to be integers 
2614L * 1456000L 
#[1] NA 
#Warning message: 
#In 2614L * 1456000L : NAs produced by integer overflow 

## And the result is an integer with overflow warning 
class(2614L * 1456000L) 
#[1] "integer" 
#Warning message: 
#In 2614L * 1456000L : NAs produced by integer overflow 

2614 * 1456000 là một numeric vì cả hai toán hạng là thực sự của lớp numeric. Các tràn xảy ra bởi vì cả hai nrowlength trả lại integer 's và do đó kết quả là một số nguyên nhưng kết quả vượt quá kích thước tối đa đại diện bởi lớp integer (+/- 2 * 10^9). A numeric hoặc double có thể giữ 2e-308 to 2e+308. Vì vậy, để giải quyết vấn đề của bạn, chỉ cần sử dụng as.numeric(length(A)) hoặc as.double(length(A)).

Các vấn đề liên quan