কম্পিউটার

রুবিতে ভগ্নাংশ এবং যুক্তির সাথে কাজ করা

আমার একটা স্বীকারোক্তি আছে। আমি ফ্লোটিং-পয়েন্ট সংখ্যাকে ঘৃণা করি। অবশ্যই, আপনি যদি একজন কম্পিউটার হয়ে থাকেন তবে এগুলি দরকারী, তবে আপনি যদি একজন মানুষ হন তবে এইরকম পরিস্থিতিতে আপনার বাম দিকে মাথা চুলকায়:

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)

যুক্তিযুক্ত পদ্ধতির একটি যুক্তি আছে। এটি সহনশীলতা নির্দিষ্ট করে – আপনি যে পরিমাণ নির্ভুলতা সরলতার জন্য ট্রেড করতে ইচ্ছুক।

পদ্ধতিটি আপনার সহনশীলতার মধ্যে সর্বনিম্ন হর সহ একটি সংখ্যা খুঁজে পায়। এখানে আমি যা বলতে চাইছি:

# 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. Pry এ ব্যতিক্রমের সাথে কাজ করা

  2. Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন

  3. রুবির সাথে মার্জ সাজানোর অন্বেষণ

  4. কমান্ড প্রম্পটের মূল বিষয়গুলি:ফাইল এবং ফোল্ডারগুলির সাথে কাজ করা