Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी में फ्रैक्शन और रेशनल में महारत हासिल करें: एक व्यावहारिक गाइड

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

129.95 * 100 # => 12994.999999999998 

यह न केवल गणितीय सद्भाव के विपरीत है, बल्कि यह खराब UX भी है।

यदि कोई रेसिपी आपको 0.37211927843 कप आटा मापने के लिए कहे, तो आप शायद लेखक की बेवकूफी पर हंसेंगे और एक तिहाई कप माप लेंगे।

अधिकांश लोग मनमाने दशमलव संख्याओं की तुलना में फ्रैक्शन के बारे में अधिक आसानी से सोच सकते हैं। इसलिए यदि आपका ऐप लोगों को संख्याएं संप्रेषित करने की कोशिश कर रहा है, तो उन्हें फ्रैक्शन के रूप में व्यक्त करने के तरीकों का पता लगाना समझदारी हो सकती है।

रूबी का Rational क्लास रेशनल नंबर के साथ काम करने के लिए एक बेहतरीन उपकरण है। यह न केवल आपको रेशनल गणित करने की क्षमता देता है, बल्कि यह आपको जटिल फ्लोटिंग-पॉइंट नंबरों का अनुमान लगाने वाले सरल फ्रैक्शन खोजने की भी अनुमति देता है। आइए एक नज़र डालें!

रेशनल क्या हैं?

हमारे उद्देश्यों के लिए, "रेशनल नंबर" सिर्फ "फ्रैक्शन" कहने का एक फैंसी तरीका है। उनके दो भाग होते हैं: अंश और हर।

1/2 # Numerator is 1. Denominator is 2. 5 # Numerator is 5. Denominator is 1. 

रूबी में, रेशनल नंबर को पूर्णांक और फ्लोटिंग-पॉइंट नंबर की तरह ही अपना डेटा प्रकार मिलता है। एक नया रेशनल बनाने के कुछ तरीके हैं:

3/2r # This syntax was introduced in Ruby 2.1 1.5.to_r # Floats can be converted to rationals via `to_r` "3/2".to_r # ...so can strings Rational('3/2') # This is how we had to do things in the olden days Rational(3, 2) # ...see how hard life was? 

सरल गणित

जब आप दो रेशनल नंबर को जोड़ते, घटाते, गुणा करते हैं, या विभाजित करते हैं तो परिणाम भी रेशनल होता है।

2/3r + 1/3r # => (1/1) 2/3r - 1/3r # => (1/3) 2/3r * 1/3r # => (2/9) (2/3r) / (1/3r) # We need parens here to avoid confusing the interpreter # => (2/1) 

अन्य सभी गणित ऑपरेटर भी बहुत हद तक वैसा ही व्यवहार करते हैं जैसा आप उम्मीद करेंगे: **, >, <, आदि।

सामान्य नियम यह है कि परिणाम के रेशनल होने के लिए दोनों इनपुट फ्रैक्शन होने चाहिए। मुझे जो एक अपवाद मिला वह पूर्णांक के साथ है। चूंकि सभी पूर्णांक रेशनल हैं, रूबी स्मार्ट चीज करता है और रेशनल आउटपुट मान लेता है:

2/3r + 2 # => (8/3) 

अनुमान

रेशनल नंबर के बारे में सबसे उपयोगी चीजों में से एक यह है कि वे हमें अनुमान लगाने और अपने सिर में आसानी से गणना करने की अनुमति देते हैं। इसका लाभ उठाने के लिए हमें अपने फ्रैक्शन को सरल रखने की आवश्यकता है। 3/2 के बजाय 3320774221237909/2251799813685248।

सौभाग्य से, रूबी हमें इन सटीक-लेकिन-बदसूरत संख्याओं को अनुमानित लेकिन सुंदर संख्याओं में बदलने का एक आसान तरीका देता है। मैं rationalize मेथड की बात कर रहा हूँ।

यहाँ यह कैसा दिखता है:

# Precise but ugly (1.47472).to_r => (3320774221237909/2251799813685248) # Less precise, but pretty (1.47472).to_r.rationalize(0.05) => (3/2) 

rationalize मेथड का एक आर्गुमेंट होता है। यह सहनशीलता निर्दिष्ट करता है - सटीकता की वह मात्रा जिसे आप सादगी के लिए त्यागने को तैयार हैं।

मेथड आपके सहनशीलता के भीतर सबसे कम हर वाली संख्या ढूंढता है। यहाँ मेरा मतलब है:

# What's the number with the lowest denominator between 5/10 and 7/10? (6/10r).rationalize(1/10r) # => (1/2) # What's the number with the lowest denominator between 11/20 and 13/20? (6/10r).rationalize(1/20r) # => (3/5) # ..and between 1/10 and 11/10? (6/10r).rationalize(1/2r) # => (1/1) 

क्रूडर अनुमान

यदि आपको केवल एक पूर्णांक या फ्लोटिंग-पॉइंट नंबर ढूंढना है जो फ्रैक्शन से मेल खाता है, तो आपके पास कई विकल्प हैं।

# Return the nearest integer. (6/10r).round # => 1 # Round down (12/10r).to_i # => 1 

रेशनल की सीमाएं

रूबी में रेशनल नंबर के साथ काम करते समय कुछ सीमाओं के बारे में पता होना चाहिए। बेशक आप शून्य से विभाजित नहीं कर सकते:

4/0r ZeroDivisionError: divided by 0 

और यदि आप अपरिमेय संख्याओं को रेशनल के रूप में व्यवहार करने का प्रयास करते हैं तो आप कुछ अजीब व्यवहार में पड़ जाएंगे।

# Umm, isn't the square root of 2 irrational? Rational(Math.sqrt(2)) # => (6369051672525773/4503599627370496) # And I'm pretty sure PI is irrational as well. Rational(Math::PI) # => (884279719003555/281474976710656) 

हम उम्मीद कर सकते हैं कि रूबी से किसी अपरिमेय संख्या को रेशनल के रूप में व्यवहार करने के लिए कहने पर कोई अपवाद उठाया जाएगा। लेकिन दुर्भाग्य से रूबी ऐसा करने के लिए पर्याप्त स्मार्ट नहीं लगता। इसके बजाय, यह इन अपरिमेय संख्याओं के फ्लोटिंग-पॉइंट अनुमानों को रेशनल में परिवर्तित कर देता है। यह कोई बड़ी समस्या नहीं है, लेकिन इसके बारे में पता होना चाहिए।


  1. रूबी लॉगिंग में महारत हासिल करें: Logger और Lograge के साथ विशेषज्ञ गाइड रूबी लॉगिंग में महारत हासिल करें: Logger और Lograge के साथ विशेषज्ञ गाइड

    रूबी में लॉग्स के साथ काम करना लॉगिंग उन प्राथमिक कार्यों में से एक है जिसे एक एप्लिकेशन आमतौर पर संबोधित करता है। लॉग्स का उपयोग तब किया जाता है जब आपको आवश्यकता होती है, उदाहरण के लिए, अपने ऐप्स के अंदर क्या हो रहा है, यह देखने के लिए, उनकी निगरानी करने के लिए, या कुछ विशिष्ट डेटा के लिए मेट्रिक्

  1. Ruby में मर्ज सॉर्ट मास्टर करें: एक चरण-दर-चरण मार्गदर्शिका Ruby में मर्ज सॉर्ट मास्टर करें: एक चरण-दर-चरण मार्गदर्शिका

    यह Ruby के साथ विभिन्न सॉर्टिंग एल्गोरिदम को लागू करने पर एक श्रृंखला का भाग 3 है। भाग 1 ने बबल सॉर्ट का पता लगाया, और भाग 2 ने सिलेक्शन सॉर्ट का पता लगाया। जैसा कि हमने इस श्रृंखला के पिछले पोस्ट्स में चर्चा की है, डेटा को कैसे सॉर्ट किया जाए यह समझना किसी भी सॉफ्टवेयर इंजीनियर के टूलकिट का अभ

  1. कमांड प्रॉम्प्ट बेसिक्स: फाइल और फोल्डर ऑपरेशन में मास्टर करें कमांड प्रॉम्प्ट बेसिक्स: फाइल और फोल्डर ऑपरेशन में मास्टर करें

    कमांड प्रॉम्प्ट बेसिक्स: फाइलों और फ़ोल्डरों के साथ काम करना फाइल एक्सप्लोरर का उपयोग करके अपनी फाइलों को नेविगेट करने से थक गए हैं? ठीक है, हो सकता है कि यह आप न हों, जब तक कि आप एक डेवलपर या आईटी पेशेवर न हों। डेवलपर हों या नहीं, बुनियादी कमांड लाइन ज्ञान हमेशा अच्छा होता है। इस गाइड में, हम कुछ स