R में प्रिंट आउटपुट में दशमलव अंकों की संख्या नियंत्रित करना


110

डिजिट डिस्प्ले पर नियंत्रण पाने के लिए आर में एक विकल्प है। उदाहरण के लिए:

options(digits=10)

आर सत्र के अंत तक 10 अंकों में गणना परिणाम देने वाला है। R की मदद फ़ाइल में, अंक पैरामीटर की परिभाषा इस प्रकार है:

अंक: संख्यात्मक मूल्यों को प्रिंट करने के लिए अंकों की संख्या को नियंत्रित करता है। यह केवल एक सुझाव है। डिफ़ॉल्ट मान 1 ... 22 डिफ़ॉल्ट 7 के साथ हैं

तो, यह कहता है कि यह केवल एक सुझाव है। क्या होगा अगर मुझे हमेशा 10 अंक प्रदर्शित करना पसंद है, कम या ज्यादा नहीं?

मेरा दूसरा सवाल है, क्या होगा अगर मुझे 22 अंकों से अधिक प्रदर्शित करना पसंद है, यानी 100 अंकों की तरह अधिक सटीक गणना के लिए? क्या यह आधार आर के साथ संभव है, या क्या मुझे उसके लिए एक अतिरिक्त पैकेज / फ़ंक्शन की आवश्यकता है?

संपादित करें: jmoy के सुझाव के लिए धन्यवाद, मैंने कोशिश की sprintf("%.100f",pi)और यह दिया

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

जिसमें 48 डेसीमल हैं। क्या यह अधिकतम सीमा R को संभाल सकता है?


5
पीआई के पहले 15 अंक सटीक हैं। असली मूल्य joyofpi.com/pi.html
रिची कॉटन

1
आप सही हे। यह R में अलग क्यों है?
मेहपर सी। पलुवज़लर


2
मेहपर: मुझे लगता है कि आप R में संख्याओं के कम्प्यूटेशनल प्रतिनिधित्व का गलत अर्थ लगा रहे हैं। आप en.wikipedia.org/wiki/Floating_point को पढ़ना चाह सकते हैं ।
शेन

एक तुलना के रूप में, पायथन बिल्कुल वैसा ही करता है: कोशिश करो python -c "import math; print(format(math.pi, '.100f'))"। परिणाम pi48 "वास्तविक" दशमलव के साथ है, शेष 52 अंकों के लिए शून्य द्वारा भरा गया है।
वाक्यविन्यास

जवाबों:


49

कारण यह है कि यह केवल एक सुझाव है कि आप बहुत आसानी से एक प्रिंट फ़ंक्शन लिख सकते हैं जिसने विकल्पों के मूल्य को अनदेखा किया है। अंतर्निहित मुद्रण और स्वरूपण फ़ंक्शन optionsडिफ़ॉल्ट के रूप में मान का उपयोग करते हैं ।

दूसरे सवाल के रूप में, चूंकि आर परिमित सटीक अंकगणित का उपयोग करता है, इसलिए आपके उत्तर 15 या 16 दशमलव स्थानों से अधिक सटीक नहीं हैं, इसलिए सामान्य रूप से, अधिक आवश्यक नहीं हैं। जीएमपी और rcdd संकुल कई सटीक गणित (जीएमपी पुस्तकालय के लिए एक interace के माध्यम से) के साथ सौदा है, लेकिन यह ज्यादातर बजाय अपने डबल्स के लिए अधिक दशमलव स्थानों की तुलना में बड़ा पूर्णांक से संबंधित है।

गणितज्ञ या मेपल आपको अपनी दिल की इच्छाओं के रूप में कई दशमलव स्थानों को देने की अनुमति देगा।

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

दूसरी ओर, यदि आप बहुत छोटी संख्याओं के साथ काम कर रहे हैं, तो यह एक समस्या से कम है, क्योंकि आर संख्या को छोटे रूप में संभाल सकता है .Machine$double.xmin(आमतौर पर 2e-308)।

इन दो विश्लेषणों की तुलना करें।

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

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


जैसा कि e3bo द्वारा उल्लेख किया गया है, आप Rmpfrपैकेज का उपयोग करके कई-सटीक फ़्लोटिंग पॉइंट संख्याओं का उपयोग कर सकते हैं ।

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

ये नियमित (डबल सटीक) numericवैक्टर की तुलना में धीमी और अधिक मेमोरी के लिए उपयोग किए जाने वाले गहन हैं , लेकिन अगर आपके पास खराब हालत या अस्थिर एल्गोरिदम है, तो यह उपयोगी हो सकता है।


4
जैसा कि यह रविकि पृष्ठ प्रदर्शित करता है, Rmpfr पैकेज आर में उच्च परिशुद्धता फ्लोटिंग पॉइंट अंकगणित की अनुमति देता है
e3bo

लेकिन क्या Rmpfr का उपयोग किसी R पैकेज द्वारा इसकी शुद्धता में सुधार के लिए किया जा सकता है? या यह केवल आंतरिक रूप से कोडित कार्यों का उपयोग कर सकता है?
स्कान

2
मैं बस यही सोच रहा था, "यदि आप सांख्यिकीय परीक्षण कर रहे हैं जो 15 वें महत्वपूर्ण आंकड़े से परे मतभेदों पर भरोसा करते हैं, तो आपका विश्लेषण लगभग निश्चित रूप से नशे में है।" लेकिन मैंने सोचा कि अंकों की संख्या क्या होगी जिस पर मैं निष्कर्ष निकालूंगा कि यह कबाड़ है, और मैंने 5 सोचा, लेकिन मुझे सही खड़े होने में खुशी होगी।
PatrickT

46

यदि आप स्वयं पूरे उत्पादन का उत्पादन कर रहे हैं, तो आप इसका उपयोग कर सकते हैं sprintf(), जैसे

> sprintf("%.10f",0.25)
[1] "0.2500000000"

निर्दिष्ट करता है कि आप दस दशमलव अंक के साथ एक चल बिन्दु संख्या फ़ॉर्मेट करने के लिए (में चाहते नाव और के लिए है निर्दिष्ट दस दशमलव अंक)।%.10ff.10

मुझे सटीक संख्याओं को प्रिंट करने के लिए आर के उच्च स्तर के कार्यों को मजबूर करने के किसी भी तरीके का पता नहीं है।

यदि आप R की सामान्य संख्याओं को प्रिंट कर रहे हैं तो 100 अंकों को प्रदर्शित करने का कोई मतलब नहीं है, क्योंकि 64-बिट डबल्स का उपयोग करके आप प्राप्त कर सकते हैं सबसे अच्छी सटीकता 16 दशमलव अंकों के आसपास है (अपने सिस्टम पर। $ $ Double.eps देखें)। शेष अंक केवल रद्दी होंगे।


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

14
पीआई में दशमलव की एक अनंत संख्या है; इसका मतलब यह नहीं है कि एक कंप्यूटर उन्हें स्टोर कर सकता है।
शेन

मुझे लगता है कि यह एक ऐसा परिदृश्य है जहां गणितज्ञ आर। से बेहतर है
स्कन

1
@skan क्या आपको लगता है कि गणितज्ञ अनंत की संख्या को कम करता है?
ग्रेगर थॉमस

@Gregor बेशक नहीं, लेकिन आप उतने ही अंक ले सकते हैं जितनी आपकी मेमोरी आपको देती है।
स्कैन

1

जरूरतों के आधार पर प्रिंट करने के लिए कितने दशमलव अंक नियंत्रित करने में सक्षम एक और समाधान (यदि आप निरर्थक शून्य प्रिंट नहीं करना चाहते हैं)

उदाहरण के लिए, यदि आपके पास एक वेक्टर है elementsऔर sumइसे प्राप्त करना चाहते हैं

elements <- c(-1e-05, -2e-04, -3e-03, -4e-02, -5e-01, -6e+00, -7e+01, -8e+02)
sum(elements)
## -876.5432

जाहिरा तौर पर, अंतिम डिजिटल के रूप 1में छोटा किया गया है, आदर्श परिणाम होना चाहिए -876.54321, लेकिन अगर तय मुद्रण दशमलव विकल्प के रूप में सेट किया गया है, जैसे sprintf("%.10f", sum(elements)), निरर्थक शून्य (एस) के रूप में उत्पन्न-876.5432100000

यहाँ ट्यूटोरियल के बाद: दशमलव संख्याओं को प्रिंट करना , अगर यह निश्चित संख्या में कितने दशमलव अंकों की पहचान करने में सक्षम है, जैसे कि यहाँ -876.543215 दशमलव अंकों को प्रिंट करने की आवश्यकता है, तो हम formatनीचे दिए गए फ़ंक्शन के लिए एक पैरामीटर सेट कर सकते हैं:

decimal_length <- 5
formatC(sum(elements), format = "f", digits = decimal_length)
## -876.54321

हम decimal_lengthप्रत्येक समय क्वेरी के आधार पर परिवर्तन कर सकते हैं , इसलिए यह विभिन्न दशमलव मुद्रण आवश्यकता को पूरा कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.