2013-07-15 24 views
8

Daha uzun bir komut dosyasında, bir A (2614) uzunluğunun bir veri çerçevesinin B (1456000) satır sayısı ile çarpması gerekiyor.R: basit çarpım, tamsayı taşmasına neden oluyor

2614 * 1456000 
[1] 3805984000 

işe çarpma almak için tek yol round(length(A)) * nrow(B) veya length(A) * round(nrow(B)): Ben length(A) * nrow(B) o doğrudan yaparsanız ben aynı numaraları çarpın zaman hiçbir sorun olmamasına rağmen ben mesajı NAs produced by integer overflow olsun. Ancak length ve nrow tarafından üretilen sayılar her zaman tamsayı olmalıdır! Üstelik ben ... fonksiyon is.integer yardım sayfasındaki önerilen aşağıdaki işlevi ile

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

bu test ... ve tabii ki, bunlar tam sayılardır. O zaman neden burada "yuvarlak" koltuk değneklerine ihtiyacım var? Çok kafa karıştırıcı ... Birinin arka planda neler olduğuna dair bir fikri var mı? işlenenler hem aslında sınıfın numeric vardır çünkü

+2

'2614 * 1456000' olan ** değil ** tamsayıdır ...'> sınıfı (1.456.000) [1] "sayısal" > sınıfı (1456000L) [1] "tam sayı" ' – Michele

+0

sayesinde @Michele, Bu yorum nedeniyle cevabımı biraz güncelledim. –

cevap

10

Umarım olup bitenlerin bir grafik gösterimi ....

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 bir numeric olduğunu. Taşma, nrow ve length'un her ikisi de integer 'u döndürdüğü ve dolayısıyla sonuç bir tamsayı olduğundan, sonuç integer sınıfı (+/- 2 * 10^9) tarafından temsil edilen maksimum boyutu aştığı için oluşur. Bir numeric veya double, 2e-308 to 2e+308'u tutabilir. Sorununuzu çözmek için, sadece as.numeric(length(A)) veya as.double(length(A))'u kullanın.