Rational numbers হলো এমন ভগ্নাংশ, যার লব একটি ইন্টিজার আর হরও একটি ইন্টিজার।
উদাহরণস্বরূপ, আনুমানিক Float64 মান 0.6666...-এর বদলে আমরা 2//3-কে একটি সঠিক ভগ্নাংশ হিসেবে সংরক্ষণ করতে পারি।
এর সুবিধা হলো, (ইন্টিজার ওভারফ্লো-র চরম পরিস্থিতি ছাড়া) একটি র্যাশনাল সংখ্যা নির্ভুল থাকে, ফলে ফ্লোটিং-পয়েন্ট সংখ্যায় যে রাউন্ডিং এরর প্রায়শই অনিবার্য হয়ে দাঁড়ায়, তা এড়ানো যায়।
র্যাশনাল সংখ্যা একটি বেশ সরল সংখ্যার টাইপ, আর আপনি যেমনটা আশা করবেন ঠিক তেমনভাবেই কাজ করার লক্ষ্য নিয়ে এগুলো তৈরি।
Julia-র প্রথম দিকের সংস্করণগুলো থেকেই এগুলো একটি স্ট্যান্ডার্ড টাইপ, তাই বেশিরভাগ ফাংশনই ইন্টিজার আর ফ্লোটের মতোই এগুলোকে ইনপুট হিসেবে গ্রহণ করে।
তৈরি করা ততটাই সহজ: দুটি ইন্টিজারের মাঝে শুধু // ব্যবহার করলেই হয়।
julia> 3//4
3//4
julia> a = 3; b = 4;
julia> a//b
3//4
কমন গুণনীয়কগুলো স্বয়ংক্রিয়ভাবে বাদ পড়ে, আর ভগ্নাংশটি চলে আসে তার "লঘিষ্ঠ আকারে": অর্থাৎ সবচেয়ে ছোট সেই ইন্টিজারগুলো, যারা ভগ্নাংশটিকে নির্ভুলভাবে প্রকাশ করে, এবং হরটি হয় অ-ঋণাত্মক।
julia> 5//15
1//3
julia> 5//-15
-1//3
সাধারণ arithmetic operators + - * / ^ % র্যাশনালের সাথে কাজ করে, মূলত অন্য যেকোনো সংখ্যার টাইপের মতোই।
ইন্টিজার আর অন্যান্য Rational-ও এতে রাখা যায়, আর ফলাফল আসে একটি Rational হিসেবে।
এক্সপ্রেশনে একটি float রাখলে ফলাফল আসে float হিসেবে, আর তার ফলে নির্ভুলতা (হতে পারে) কমে যায়।
float চাইলে শুধু float() ফাংশনটি দিয়ে র্যাশনালকে রূপান্তর করে নিন।
একটি লম্বা হিসাব জুড়ে নির্ভুলতা ধরে রাখতে র্যাশনাল সংখ্যা ব্যবহার করা, আর একেবারে শেষে সেটিকে ফ্লোটে রূপান্তর করা, বেশ স্বাভাবিক ব্যাপার।
julia> 3//4 + 1//3 # addition
13//12
julia> 3//4 * 1//3 # multiplication
1//4
julia> 3//4 / 1//3 # division
9//4
julia> 3//4 ^ 2 # exponentiation
3//16
julia> 3//4 + 5 # rational and int => rational
23//4
julia> 3//4 + 5.3 # rational and float => float
6.05
julia> float(3//4) # casting
0.75
Julia-তে র্যাশনাল সংখ্যা আসলে সাধারণ সংখ্যাই। কম্পাইলার সাধারণত প্রয়োজন অনুযায়ী টাইপগুলো রূপান্তর করে নেয়।
তবে মনে রাখবেন, সসীম দশমিক রূপ আছে এমন ভগ্নাংশের ক্ষেত্রে তুলনা কাজ করে:
julia> 3//4 == 0.75
true
julia> 3//4 < 0.74
false
কিন্তু তা ছাড়া, তুলনার জন্য একটি Rational-কে Float-এ রূপান্তর করতে হবে:
julia> 1//3 == 1/3
false
julia> float(1//3) == 1/3
true
গাণিতিক ফাংশন র্যাশনালকে ইনপুট হিসেবে নেয়, তবে ফলাফল দিতে পারে ফ্লোটিং-পয়েন্ট সংখ্যা:
julia> sqrt(9//16)
0.75
একটি গবেষণা প্রতিষ্ঠান লক্ষ্য করেছে যে তাদের কিছু জুনিয়র গবেষক তাদের বিশ্লেষণে আদর্শের চেয়ে কম ভালো কিছু পদ্ধতি ব্যবহার করছেন। এমন একটি পদ্ধতি হলো, আরও হিসাব করার আগে বিচ্ছিন্ন সম্ভাবনাগুলোকে সঙ্গে সঙ্গে ফ্লোটে (অর্থাৎ বাস্তব সংখ্যায়) রূপান্তর করে ফেলা।
সিনিয়র গবেষকরা হিসাবের সময় মূলদ সংখ্যা ব্যবহার করতে পছন্দ করেন, যা আরও বেশি নির্ভুলতা দিতে পারে, এবং জানতে চান জুনিয়র গবেষকদের এই দুর্বল চর্চা গবেষণাগুলোর ফলাফলে প্রভাব ফেলেছে কি না।
দুই ধরনের গবেষণা করা হয়েছিল:
সিনিয়র গবেষকরা আপনাকে এমন ফাংশন লিখতে বলছেন, যা দিয়ে তারা নির্ধারণ করতে পারবেন ফ্লোট ব্যবহারের কারণে বিশ্লেষণে রাউন্ডিং এরর আছে কি না, আর যদি এরর থাকে তবে ফলাফলের জন্য একটি নির্ভুল মূলদ সংখ্যা দিতে বলছেন।
rationalize(successes, trials) ফাংশনটি দুটি অ্যারে নেয়, successes এবং trials।
কোনো ইনডেক্স i হলে, successes[i] বোঝায় trials[i] সংখ্যক ট্রায়ালে যতবার সফলতা এসেছে তার সংখ্যা।
ফাংশনটি সফলতা ও ট্রায়ালের সংখ্যার অনুপাতের মূলদ সংখ্যাগুলোর একটি অ্যারে রিটার্ন করে, ইনপুট অ্যারে দুটির মতো একই ক্রমে।
julia> rationalize([1, 2, 3], [4, 5, 6])
3-element Vector{Rational{Int64}}:
1//4
2//5
1//2
একইভাবে, probabilities(successes, trials) ফাংশনটিও দুটি অ্যারে নেয়, successes এবং trials।
এটি সফলতা ও ট্রায়ালের সংখ্যার অনুপাতের ফ্লোটগুলোর একটি অ্যারে রিটার্ন করে, ইনপুট অ্যারে দুটির মতো একই ক্রমে।
julia> probabilities([1, 2, 3], [4, 5, 6])
3-element Vector{Float64}:
0.25
0.4
0.5
checkmean(successes, trials) দুটি অ্যারে নেয়, successes এবং trials।
এটি বাস্তব সম্ভাবনাগুলোর গড়ের সাথে মূলদ সম্ভাবনাগুলোর গড় মিলিয়ে দেখে।
checkmean true রিটার্ন করেcheckmean মূলদ সম্ভাবনাটি রিটার্ন করে।julia> successes, trials = [9, 4, 7, 8, 6], [22, 22, 11, 17, 12];
julia> checkmean(successes, trials)
true
julia> successes, trials = [6, 5, 9, 8, 9], [21, 19, 13, 25, 22];
julia> checkmean(successes, trials)
1873629//4754750
checkprob(successes, trials) দুটি অ্যারে নেয়, successes এবং trials।
এটি ফ্লোট সম্ভাবনাগুলোর মোট সম্ভাবনার সাথে মূলদ সম্ভাবনাগুলোর মোট সম্ভাবনা মিলিয়ে দেখে।
checkprob true রিটার্ন করেcheckprob মূলদ সম্ভাবনাটি রিটার্ন করে।julia> successes, trials = [2, 9, 4, 4, 5], [15, 11, 17, 19, 15];
julia> checkprob(successes, trials)
true
julia> successes, trials = [9, 8, 5, 4, 3], [22, 14, 19, 25, 18];
julia> checkprob(sucesses, trials)
12//7315
Exercism-এ সাইন আপ করুন, Julia ট্র্যাকের 35টি কনসেপ্ট128টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।