2013-07-15 38 views
8

長いスクリプトでは、ベクトルA(2614)の長さにデータフレームB(1456000)の行数を掛けなければなりません。R:単純な乗算は整数オーバーフローを引き起こす

2614 * 1456000 
[1] 3805984000 

仕事に乗算を取得する唯一の方法はround(length(A)) * nrow(B)length(A) * round(nrow(B))です:私はlength(A) * nrow(B)とその直接行う場合、私は同じ番号を掛けたときには問題ありませんが、私はメッセージNAs produced by integer overflowを取得します。しかし、lengthnrowで生成される数値は、何とか整数でなければなりません!また、私は

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

...機能is.integerのヘルプページに提案し、以下の機能でこれをテストした...そして、もちろん、彼らは整数です。では、なぜ私はここで松葉杖が「丸い」必要がありますか?非常に混乱している...誰かがバックグラウンドで何が起こっているのか考えている?両方のオペランドが実際にクラスnumericのであるため、

+2

'* 2614 1456000'です**ない**整数...'>クラス(1456000) [1] "数値" >クラス(1456000L) [1] "整数" 'のおかげ@Michele – Michele

+0

、私はこのコメントのために私の答えを少し更新しました。 –

答えて

10

うまくいけば、何が起こっているかのグラフィック表現....

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 * 1456000numericです。オーバーフローは、nrowlengthの両方がintegerの結果を返すため結果が整数ですが、結果がintegerクラス(+/- 2 * 10^9)で表される最大サイズを超えているために発生します。 numericまたはdouble2e-308 to 2e+308を保持できます。したがって、問題を解決するには、as.numeric(length(A))またはas.double(length(A))を使用してください。

関連する問題