2012-01-10 28 views
24

मैं कुछ गणना चल रहा है और निम्नलिखित चेतावनी (अर्थात नहीं एक त्रुटि) मिलता है:आर में पूर्णांक ओवरफ़्लो क्या है और यह कैसे हो सकता है?

Warning messages: 
1: In sum(myvar, na.rm = T) : 
Integer overflow - use sum(as.numeric(.)) 

इस thread लोगों में राज्य है कि पूर्णांक बस overflows साथ नहीं होती। या तो आर अत्यधिक आधुनिक नहीं है या वे सही नहीं हैं। हालांकि, मुझे यहां क्या करना चाहिए? अगर मैं as.numeric का उपयोग करता हूं क्योंकि चेतावनी से पता चलता है कि मैं इस तथ्य के लिए जिम्मेदार नहीं हूं कि जानकारी पहले से खो गई है। myvar एक .csv फ़ाइल के रूप में पढ़ा जाता है, तो क्या यह पता नहीं होना चाहिए कि कुछ बड़े क्षेत्र की आवश्यकता है? क्या यह पहले से ही कुछ काटता है?

integer या numeric की अधिकतम लंबाई क्या है? क्या आप किसी अन्य फ़ील्ड प्रकार/मोड का सुझाव देंगे?

संपादित करें: मैं चलाएँ:

आर संस्करण 2.13.2 (2011-09-30) प्लेटफार्म: x86_64-सेब के darwin9.8.0/x86_64 (64-बिट) आर स्टूडियो के भीतर

उत्तर

35

सहायता पृष्ठ ?integer पढ़कर आप अपने कई प्रश्नों का उत्तर दे सकते हैं। इसे कहते हैं:

आर पूर्णांक वैक्टर के लिए 32-बिट पूर्णांकों का उपयोग करता है, तो प्रदर्शनीय पूर्णांकों की सीमा के बारे में +/- 2 * 10^9 तक ही सीमित है।

बड़े पूर्णांक में विस्तार करना आर कोर द्वारा विचार किया जा रहा है लेकिन यह निकट भविष्य में नहीं होने वाला है।

यदि आप "बिग्नम" क्षमता चाहते हैं तो मार्टिन माचलर के Rmpfr package [पीडीएफ] स्थापित करें। मैं अपने लेखक की प्रतिष्ठा के कारण 'आरएमपीआरएफ' पैकेज की अनुशंसा करता हूं। मार्टिन माचलर भी मैट्रिक्स पैकेज विकास, और आर कोर में भी शामिल है। 'Gmp', 'Brobdingnag' और 'Ryacas' पैकेज (बाद वाला भी एक प्रतीकात्मक गणित इंटरफ़ेस प्रदान करता है) जैसे अंकगणितीय पैकेज सहित विकल्प हैं।

अगला, आपके द्वारा लिंक किए गए उत्तर में महत्वपूर्ण टिप्पणियों का जवाब देने के लिए, और आपके काम की प्रासंगिकता का आकलन कैसे करें, इस पर विचार करें: यदि वहां की "आधुनिक" भाषाओं में से एक में समान सांख्यिकीय कार्यक्षमता उपलब्ध थी आर में है, आप शायद उस दिशा में एक उपयोगकर्ता प्रवासन देखेंगे। लेकिन मैं कहूंगा कि माइग्रेशन, और निश्चित रूप से विकास, इस समय आर दिशा में है। आंकड़ों के आंकड़ों के लिए सांख्यिकीविदों द्वारा बनाया गया था।

एक समय में एक आंकड़ा पैकेज, Xlisp-Stat के साथ एक लिस्प संस्करण था, लेकिन इसका मुख्य डेवलपर और समर्थक अब आर-कोर का सदस्य है। दूसरी ओर सबसे शुरुआती आर डेवलपर्स में से एक, रॉस इहाका, suggests working toward development in a Lisp-like language [पीडीएफ]। Clojure नामक एक संकलित भाषा है (अंग्रेजी वक्ताओं के रूप में उच्चारण एक प्रयोगात्मक इंटरफ़ेस, Rincanter के साथ "बंद" कहेंगे।

अद्यतन:

आर (। 3.0 +) के नए संस्करणों के एक प्रकार के (numeric अपूर्णांश का प्रयोग करके) के 53 बिट पूर्णांक है। जब एक "पूर्णांक" वेक्टर तत्व को 'माचिन $ integer.max' से अधिक मान दिया जाता है, तो पूरे वेक्टर को "न्यूमेरिक", ए.के.ए. "डबल" के लिए मजबूर किया जाता है। integers के लिए अधिकतम मान तब भी बना हुआ है, हालांकि, पूर्ववर्ती उत्पन्न होने वाले मामलों में सटीकता को संरक्षित रखने के लिए पूर्णांक वाले वैक्टरों का दोगुना हो सकता है। दुर्भाग्यवश, सूचियों, मैट्रिक्स और सरणी आयामों की लंबाई, और वैक्टर अभी भी integer.max पर सेट हैं।

फ़ाइलों से बड़े मूल्यों में पढ़ते समय, चरित्र-वर्ग को लक्ष्य के रूप में उपयोग करना और फिर कुशलतापूर्वक उपयोग करना सुरक्षित है। यदि एनए मूल्यों पर मजबूती है, तो एक चेतावनी होगी।

+0

+1! –

+0

'gmp' पैकेज भी ब्याज का हो सकता है – James

+0

मैं एक डीटी कर रहा हूं [, sapply (.SD, sum, na.rm = T)] 0,1 और NA से भरे डेटाटेबल के साथ, 2 मिलियन के साथ पंक्तियों। और मुझे अतिप्रवाह संदेश मिलता है, लेकिन उत्पन्न अधिकतम संख्या 2 मिलियन से कम होनी चाहिए। क्या हो सकता है? – skan

17

में लघु, integer सीमित सीमा के साथ एक सटीक प्रकार है, और numeric एक फ़्लोटिंग-पॉइंट प्रकार है जो मूल्य की एक विस्तृत श्रृंखला का प्रतिनिधित्व कर सकता है लेकिन यह अचूक है। अधिक जानकारी के लिए सहायता पृष्ठ देखें (?integer और ?numeric)। कुछ बहुत बड़े पूर्णांक -

इसका मतलब है कि आप मतलब ले जा रहे हैं [@aix, योग आपके मामले में]:

अतिप्रवाह के रूप में, यहाँ ब्रायन डी रिप्ले से एक explanation है , और गणना बहती जा रही है। यह सिर्फ एक चेतावनी है।

इस नदी का मुहाना अगली फिल्म में नहीं होगी

आप निर्दिष्ट कर सकते कि एक नंबर के रूप में 1 करने का विरोध किया,, प्रत्यय L दे रही है उदाहरण के लिए, 1L पूर्णांक में से एक है द्वारा एक पूर्णांक है जो "numeric" वर्ग के साथ एक फ़्लोटिंग पॉइंट है।

आपकी मशीन पर सबसे बड़ा पूर्णांक जो आप बना सकते हैं .Machine$integer.max द्वारा दिया गया है।

> .Machine$integer.max 
[1] 2147483647 
> class(.Machine$integer.max) 
[1] "integer" 

एक सकारात्मक पूर्णांक इस को जोड़ना, एक अतिप्रवाह का कारण बनता है NA लौटने।

> .Machine$integer.max + 1L 
[1] NA 
Warning message: 
In .Machine$integer.max + 1L : NAs produced by integer overflow 
> class(.Machine$integer.max + 1L) 
[1] "integer" 

आप इसके बजाय फ़्लोटिंग पॉइंट मान जोड़कर इस सीमा को पार कर सकते हैं।

> .Machine$integer.max + 1 
[1] 2147483648 
> class(.Machine$integer.max + 1) 
[1] "numeric" 

के बाद से अपने मामले में चेतावनी sum द्वारा जारी किया जाता है, इसका मतलब है कि अतिप्रवाह होता है जब संख्याओं को एक साथ जोड़ रहे हैं। सुझाए गए वर्कअराउंड sum(as.numeric(.)) को चाल चलनी चाहिए।

+1

ठीक है, अगर मैं सटीक गणना करना चाहता हूं और बड़ी संख्याएं हैं?वास्तव में, संख्याओं को जोड़े जाने पर ओवरफ्लो बनाए जाते हैं। क्या मुझे वैसे भी एक सटीक परिणाम मिल सकता है? –

+0

मैंने वर्णन किया है कि जब आप सबसे बड़े पूर्णांक में संख्या जोड़ते हैं तो क्या होता है। –

+0

... लेकिन इसे आज़माएं: 'कक्षा (योग (सी (.Machine $ integer.max, as.integer (1))))' मेरे लिए मुझे एक पूर्णांक ओवरफ़्लो (2.14 का उपयोग करके) मिलता है। – Dason

4

पूर्णांक या संख्यात्मक की अधिकतम लंबाई क्या है?

वेक्टर वर्तमान में एक पूर्णांक के साथ अनुक्रमित हैं, इसलिए अधिकतम लंबाई .Machine$integer.max द्वारा दी गई है। जैसा कि डीडब्ल्यूएन ने नोट किया है, आर के सभी संस्करण वर्तमान में 32-बिट पूर्णांक का उपयोग करते हैं, इसलिए यह 2^31 - 1 होगा, या 2 बिलियन से थोड़ा अधिक होगा।

जब तक कि आप कुछ गंभीर हार्डवेयर पैक नहीं कर रहे हैं (या आप भविष्य में इसे पढ़ रहे हैं; 2012 से हैलो) आपके पास लंबे समय तक वैक्टर आवंटित करने के लिए पर्याप्त स्मृति नहीं होगी।

मुझे एक ऐसी चर्चा याद है जहां आर-कोर (ब्रायन रिपली, मुझे लगता है) ने सुझाव दिया कि अगला कदम युगल के मंथिसा के साथ वैक्टरों को इंडेक्स करना या उस तरह से कुछ चालाक हो सकता है, जो सूचकांक के 48-बिट्स को प्रभावी ढंग से दे रहा है। अफसोस की बात है, मुझे वह चर्चा नहीं मिल रही है।


Rmpfr पैकेज के अलावा, यदि आप पूर्णांक अतिप्रवाह पीड़ित हैं, तो आप int64 पैकेज की कोशिश करना चाहते हो सकता है।

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

  • कोई संबंधित समस्या नहीं^_^