2013-07-15 6 views
8

एक लंबी स्क्रिप्ट में मुझे डेटाफ्रेम बी (1456000) की पंक्तियों की संख्या के साथ एक वेक्टर ए (2614) की लंबाई गुणा करना है।आर: सरल गुणा पूर्णांक ओवरफ्लो

2614 * 1456000 
[1] 3805984000 

काम करने के लिए गुणा प्राप्त करने के लिए एक ही रास्ता round(length(A)) * nrow(B) या length(A) * round(nrow(B)) है: वहाँ कोई समस्या नहीं है, हालांकि जब मैं एक ही संख्याओं को गुणा मैं संदेश NAs produced by integer overflow मिलता है मैं length(A) * nrow(B) साथ कि सीधे है। लेकिन length और nrow द्वारा उत्पादित संख्याओं को किसी भी तरह पूर्णांक होना चाहिए! इसके अलावा, मैं निम्नलिखित समारोह समारोह is.integer के लिए मदद पृष्ठ पर सुझाव के साथ इस परीक्षण किया ...

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

... और हां, वे पूर्णांक हैं। तो मुझे यहां "राउंड" क्रैच की आवश्यकता क्यों है? बहुत परेशान ... किसी को पता चला है कि पृष्ठभूमि में क्या चल रहा है?

+2

'2614 * 1456000' हैं ** नहीं ** पूर्णांक ...'> वर्ग (1,456,000) [1] "सांख्यिक" > वर्ग (1456000L) [1] "पूर्णांक" ' – Michele

+0

धन्यवाद @Michele, इस टिप्पणी के कारण मैंने अपना जवाब थोड़ा सा अपडेट किया। –

उत्तर

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 * 1456000 एक numeric क्योंकि दोनों ऑपरेंड वर्ग numeric की वास्तव में हो रहा है। ओवरफ्लो होता है क्योंकि nrow और length वापसी integer और इसलिए परिणाम एक पूर्णांक है लेकिन परिणाम integer वर्ग (+/- 2 * 10^9) द्वारा अधिकतम आकार से अधिक है। numeric या double2e-308 to 2e+308 रख सकता है। तो अपनी समस्या को हल करने के लिए, बस as.numeric(length(A)) या as.double(length(A)) का उपयोग करें।

संबंधित मुद्दे