मुझे कबूल करना है। मुझे फ्लोटिंग-पॉइंट नंबरों से नफरत है। निश्चित रूप से, यदि आप एक कंप्यूटर हैं, तो वे उपयोगी हैं, लेकिन यदि आप एक इंसान हैं तो आप इस तरह की स्थितियों में अपना सिर खुजलाते हैं:
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)
हम उम्मीद कर सकते हैं कि रूबी को एक अपरिमेय संख्या का इलाज करने के लिए कहना तर्कसंगत है, किसी प्रकार का अपवाद होगा। लेकिन दुर्भाग्य से रूबी ऐसा करने के लिए पर्याप्त स्मार्ट नहीं लगती है। इसके बजाय, यह इन अपरिमेय संख्याओं के फ़्लोटिंग-पॉइंट सन्निकटन को परिमेय में परिवर्तित करता है। यह कोई बड़ी समस्या नहीं है, लेकिन इसके बारे में पता होना चाहिए।