কম্পিউটার টিউটোরিয়াল

রুবিতে ফ্র্যাকশন এবং রেশনাল নম্বর দক্ষতা: একটি প্র্যাক্টিক্যাল গাইড

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

129.95 * 100 # => 12994.999999999998

এটি কেবল গাণিতিক সৌন্দর্যের বিরুদ্ধে নয়, এটি খারাপ UX-ও।

যদি একটি রেসিপি আপনাকে বলে ০.৩৭২১১৯২৭৮৪৩ কাপ আটা মাপতে, তবে আপনি সম্ভবত লেখকের বোকামি নিয়ে হেসে এক-তৃতীয় কাপ মাপবেন।

বেশির ভাগ মানুষ ভগ্নাংশের तुलনায় নির্বিচারে দশমিক সংখ্যা সহজে চিন্তা করতে পারে। তাই যদি আপনার অ্যাপ মানুষের সাথে সংখ্যা কমিউনিকেট করতে চায়, তবে সেগুলো ভগ্নাংশ হিসেবে এক্সপ্রেস করার উপায় খুঁজে বের করা অর্থহীন নয়।

রুবির Rational ক্লাস রেশনাল নম্বর নিয়ে কাজ করার জন্য একটি চমৎকার টুল। এটি শুধু রেশনাল ম্যাথের ক্ষমতা দেয় না, বরন জটিল ফ্লোটিং-পয়েন্ট নম্বরগুলোকে সহজ ভগ্নাংশে অনুমান করার সুযোগ ও দেয়। চলুন দেখি!

রেশনাল কী?

আমাদের উদ্দেশ্যে, "রেশনাল নম্বর" শুধু "ভগ্নাংশ" বলতে একটি ফ্যান্সি উপায়। এর দুটি অংশ থাকে: সংখ্যালঘু (numerator) এবং হর (denominator)।

1/2 # সংখ্যালঘু ১। হর ২।
5   # সংখ্যালঘু ৫। হর ১।

রুবিতে, রেশনাল নম্বরদের ইন্টিজার এবং ফ্লোটিং-পয়েন্ট নম্বরের মতো নিজস্ব ডেটা টাইপ আছে। নতুন রেশনাল তৈরি করার כמה উপায় আছে:

3/2r       # এই সিনট্যাক্স রুবি ২.১-এ আসল
1.5.to_r   # ফ্লোট `to_r` দিয়ে রেশনালে কনভার্ট করা যায়
"3/2".to_r # ...স্ট্রিংও পারেন
Rational('3/2') # পুরনো দিনে এভাবে করতাম
Rational(3, 2)  # ...দেখুন জীবন কত কঠিন ছিল!

সহজ গণিত

দুটি রেশনাল নম্বর যোগ, বিয়োগ, গুণ, বা ভাগ করলে ফলাফলও রেশনাল হয়।

2/3r + 1/3r # => (1/1)
2/3r - 1/3r # => (1/3)
2/3r * 1/3r # => (2/9)
(2/3r) / (1/3r) # পারেনথেসিস লাগে ইন্টারপ্রেটার বিভ্রান্ত না হয়
# => (2/1)

অন্য সব ম্যাথ অপারেটরও প্রায় একইভাবে আচরণ করে: **, >, <, ইত্যাদি।

সাধারণ নিয়ম হলো ফলাফল রেশনাল হবার জন্য দুটি ইনপুটই ভগ্নাংশ হতে হবে। একমাত্র ব্যতিক্রম যা আমি খুঁজে পেলাম তা হলো ইন্টিজারের সাথে। যেহেতু সব ইন্টিজার রেশনাল, রুবি স্মার্টভাবে কাজ করে এবং রেশনাল আউটপুট ধরে নেয়:

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

অনুমান

রেশনাল নম্বরের সবচেয়ে উপকারী দিক হচ্ছে এটি অনুমান করতে দেয় এবং আমরা সহজে মাথায় हिसাব করতে পারি। এর জন্য আমাদের ভগ্নাংশগুলো সহজ রাখতে হবে। 3/2 বরং 3320774221237909/2251799813685248।

খুশির কথা, রুবি আমাদের একটি সহজ উপায় দিয়েছে এই সঠিক-কিন্তু-কুরূপ নম্বরগুলোকে অনুমানিত-কিন্তু-সুন্দর নম্বরতে কনভার্ট করার। আমি কথা বলছি rationalize মেথডের।

দেখুন কেমন দেখায়:

# সঠিক কিন্তু কুরূপ
(1.47472).to_r # => (3320774221237909/2251799813685248)

# কম সঠিক, কিন্তু সুন্দর
(1.47472).to_r.rationalize(0.05) # => (3/2)

rationalize মেথডের একটি আর্গুমেন্ট থাকে। এটি টলারেন্স নির্দেশ করে—আপনি কতটুকু প্রিসিশন সাদगीর জন্য লেট고를 করতে চান।

মেথডটি আপনার টলারেন্সের মধ্যে সবচেয়ে কম হর वाला নম্বর খুঁজে বের করে। এখানে আমার মানে:

# 5/10 এবং 7/10-এর মধ্যে সবচেয়ে কম হর वाला নম্বর কী?
(6/10r).rationalize(1/10r) # => (1/2)

# 11/20 এবং 13/20-এর মধ্যে সবচেয়ে কম হর वाला নম্বর কী?
(6/10r).rationalize(1/20r) # => (3/5)

# ..এবং 1/10 এবং 11/10-এর মধ্যে?
(6/10r).rationalize(1/2r) # => (1/1)

ক্রুডার অনুমান

যদি আপনার শুধু ভগ্নাংশের সমতুল্য ইন্টিজার বা ফ্লোটিং-পয়েন্ট নম্বর খুঁজে বের করতে হয়, তবে আপনার কাছে কিছু অপশন আছে।

# নিকটতম ইন্টিজার রিটার্ন করুন
(6/10r).round # => 1

# নিচের দিকে রাউন্ড
(12/10r).to_i # => 1

রেশনালের সীমাবদ্ধতা

রুবিতে রেশনাল নম্বর নিয়ে কাজ করার সময় কিছু সীমাবদ্ধতা আছে जिनके बारेে জানা দরকার। অবশ্যই আপনি শূন্য দিয়ে ভাগ করতে পারবেন না:

4/0r
ZeroDivisionError: divided by 0

এবং আপনি যদি Ирরেশনাল নম্বরকে রেশনাল হিসেবে ট्रीট করার চেষ্টা করেন তবে কিছু অদ্ভুত আচরণ দেখবেন।

# উম, ২-এর বর্গমূল তো Ирরেশনাল?
Rational(Math.sqrt(2)) # => (6369051672525773/4503599627370496)

# এবং আমার মনে হয় PIও Ирরেশনাল।
Rational(Math::PI) # => (884279719003555/281474976710656)

আমরা আশা করতাম Ирরেশনাল নম্বরকে রেশনাল হিসেবে ট्रीট করতে কলে রুবি এক্সসেপশন raise করবে। কিন্তু দুর্ভাগ্যবশত রুবি এত স্মার্ট নয়। এর বদলে, এটি Ирরেশনাল নম্বরের ফ্লোটিং-পয়েন্ট অনুমানগুলোকে রেশনালে কনভার্ট করে দেয়। এটি বড় সমস্যা নয়, কিন্তু জানা থাকা ভালো।

  1. প্রাইরে এক্সেপশন হ্যান্ডলিং মাস্টার করুন: রেলস কনসোলে অ্যাডভান্সড টেকনিক

  2. রুবি লগিং মাস্টারি: Logger এবং Lograge-এ এক্সপার্ট গাইড

  3. রুবিতে মার্জ সর্ট মাস্টার করুন: স্টেপ-বাই-স্টেপ গাইড

  4. Command Prompt Basic: ফাইল ও ফোল্ডার অপারেশন মাস্টার করুন