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

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

यह इस तरह दिखता है:

# Precise but ugly
(1.47472).to_r
=> (3320774221237909/2251799813685248)

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

युक्तिकरण विधि का एक तर्क है। यह सहिष्णुता को निर्दिष्ट करता है - सटीकता की वह मात्रा जिसे आप सरलता के लिए व्यापार करने के इच्छुक हैं।

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

# 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. लॉगर और लॉगरेज के साथ रूबी में लॉगिंग

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

  1. रूबी के साथ मर्ज सॉर्ट की खोज

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

  1. कमांड प्रॉम्प्ट मूल बातें:फाइलों और फ़ोल्डरों के साथ कार्य करना

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