রুবি 2.4 মার্জ করা হয়েছে Fixnum &Bignum একই ক্লাসে (Integer ) তাই আমি মনে করি রুবিতে বিভিন্ন সংখ্যার ধরন পর্যালোচনা করার জন্য এটি একটি ভাল সময়!
এই পোস্টে আমরা এই বিষয়ে কথা বলতে যাচ্ছি 🙂
সংখ্যার প্রকারের একটি ওভারভিউ
রুবি-তে সমস্ত নম্বর সম্পর্কিত ক্লাসের ক্লাস হায়ারার্কি দেখে শুরু করা যাক:
সংখ্যাসূচক পূর্ণসংখ্যা ফিক্সনাম বিগনাম ফ্লোট কমপ্লেক্স মূলদ বিগডেসিমাল (স্ট্যান্ডার্ড লাইব্রেরি)
আপনি দেখতে পাচ্ছেন, Numeric ক্লাস হল সমস্ত নম্বর ক্লাসের জন্য অভিভাবক। মনে রাখবেন আপনি ancestors ব্যবহার করতে পারেন যে কোনো ক্লাসের জন্য প্যারেন্ট ক্লাস আবিষ্কার করার পদ্ধতি।
উদাহরণ :
Fixnum.ancestors - Fixnum.included_modules[Fixnum, Integer, Numeric, Object, BasicObject]
এখন টেবিল আকারে এই ক্লাসগুলি দেখি:
| ক্লাস | বর্ণনা | উদাহরণ |
|---|---|---|
| পূর্ণসংখ্যা | Fixnum-এর প্যারেন্ট ক্লাস &Bignum | 1 |
| Fixnum | সম্পূর্ণ সংখ্যা যা OS পূর্ণসংখ্যার প্রকারের (32 বা 64 বিট) সাথে ফিট করে | 1 |
| Bignum | বড় সংখ্যার জন্য ব্যবহৃত হয় | 111111111111 |
| ফ্লোট | অস্পষ্ট দশমিক সংখ্যা | 5.0 |
| জটিল | কাল্পনিক সংখ্যা সহ গণিতের জন্য ব্যবহৃত হয় | (1+0i) |
| যৌক্তিক | ভগ্নাংশের প্রতিনিধিত্ব করতে ব্যবহৃত হয় | (2/3) |
| BigDecimal | নিখুঁত নির্ভুল দশমিক সংখ্যা | 3.0 |
ফ্লোট ইমপ্রিসিশন
Float রুবিতে ক্লাসকে অফিসিয়াল রুবি ডকুমেন্টেশনে "অসম্পূর্ণ" হিসাবে বর্ণনা করা হয়েছে।
এটা কেন?
আমি আপনাকে একটি উদাহরণ দেখাই :
0.2 + 0.1 ==0.3# মিথ্যা
কেন এটা মিথ্যা?
চলুন 0.2 + 0.1 এর ফলাফল দেখি :
0.30000000000000004
হুবহু ! অসম্পূর্ণতা বলতে আমরা এটাই বুঝি।
এটি একটি ফ্লোট সংরক্ষিত হওয়ার কারণে ঘটে। আপনার যদি সর্বদা নির্ভুল দশমিক সংখ্যার প্রয়োজন হয় তবে আপনি BigDecimal ব্যবহার করতে পারেন ক্লাস।
ফ্লোট বনাম BigDecimal
BigDecimal হল এমন একটি ক্লাস যা আপনাকে নির্ভুল-নির্ভুল দশমিক সংখ্যা দেয়।
উদাহরণ :
'bigdecimal'BigDecimal("0.2") + BigDecimal("0.1") ==0.3# সত্য প্রয়োজন
কেন আমরা সবসময় BigDecimal ব্যবহার করি না তাহলে? কারণ এটি অনেক ধীর!
এখানে একটি বেঞ্চমার্ক আছে :
গণনা করা হচ্ছে ------------------------ বিগডেসিমেল 21.559k i/100ms float 79.336k i/ 100ms--------------------------------------------------- bigdecimal 311.721k (± 7.4%) i/s - 1.552M float 3.817M (±11.7%) i/s - 18.803MC তুলনা:ফ্লোট:3817207.2 i/s bigdecimal:3117207.2 i/2s slow.
BigDecimalFloatথেকে 12 গুণ ধীর , এবং সেই কারণেই এটি ডিফল্ট নয় 🙂ফিক্সনাম বনাম বিগনাম
এই বিভাগে, আমি
Fixnumএর মধ্যে পার্থক্যগুলি অন্বেষণ করতে চাই৷ এবংBignumরুবি 2.4 এর আগে।কিছু কোড দিয়ে শুরু করা যাক :
1.class# Fixnum100000000000.class# Bignumরুবি আমাদের জন্য সঠিক ক্লাস তৈরি করে, এবং এটি স্বয়ংক্রিয়ভাবে একটি
Fixnumপ্রচার করবে একটিBignumএ যখন প্রয়োজন।দ্রষ্টব্য :একটি
Bignumপেতে আপনার একটি বড় সংখ্যার প্রয়োজন হতে পারে৷ অবজেক্ট যদি আপনার কাছে একটি 64-বিট রুবি ইন্টারপ্রেটার থাকে।কেন আমরা বিভিন্ন ক্লাস প্রয়োজন? উত্তর হল যে বড় সংখ্যার সাথে কাজ করার জন্য আপনার একটি ভিন্ন বাস্তবায়নের প্রয়োজন, এবং বড় সংখ্যার সাথে কাজ করা ধীরগতির, তাই আমরা
Floatএর জন্য একই রকম পরিস্থিতির সাথে শেষ করি। বনামBigDecimal.Fixnums এর বিশেষ গুণাবলী
Fixnumক্লাসেরও কিছু বিশেষ বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, অবজেক্ট আইডি একটি সূত্র ব্যবহার করে গণনা করা হয়।1.object_id# 320.object_id# 41সূত্রটি হল:
(number * 2) + 1.কিন্তু আপনি যখন একটি
Fixnumব্যবহার করেন তখন এর আরও কিছু আছে কোনো বস্তুই তৈরি হচ্ছে না।Fixnumএ সংরক্ষণ করার জন্য কোন ডেটা নেই , কারণ মানটি অবজেক্ট আইডি থেকে নেওয়া হয়েছে।এটি শুধুমাত্র একটি বাস্তবায়নের বিশদ, কিন্তু আমি মনে করি এটি জানা আকর্ষণীয় 🙂
MRI (Matz's Ruby Interpreter) মান এবং অবজেক্ট আইডির মধ্যে রূপান্তর করতে এই দুটি ম্যাক্রো ব্যবহার করে:
INT2FIX(i) ((VALUE)((SIGNED_VALUE)(i))<<1 | FIXNUM_FLAG))FIX2LONG(x) ((দীর্ঘ)RSHIFT((SIGNED_VALUE)(x),1))এখানে যা হয় তাকে "বিট শিফটিং" বলা হয়, যা সমস্ত বিটকে বাম বা ডান দিকে নিয়ে যায়।
একটি অবস্থান বামে স্থানান্তর করা 2 দ্বারা গুণ করার সমতুল্য এবং সেই কারণে সূত্রটি হল
(number * 2) + 1. +1 আসেFIXNUM_FLAGথেকে .বিপরীতে,
Bignumএকটি সাধারণ ক্লাসের মতো কাজ করে এবং সাধারণ অবজেক্ট আইডি ব্যবহার করে:11111111111111.object_id# 23885808এই সব মানে হল যে
Fixnumবস্তুগুলি দোভাষী স্তরে কীভাবে কাজ করে তার পরিপ্রেক্ষিতে প্রতীকের কাছাকাছি, যখনBignumবস্তু স্ট্রিং কাছাকাছি হয়.2.4 এ পূর্ণসংখ্যা
যেহেতু Ruby 2.4 Fixnum এবং Bignum বন্ধ করা হয়েছে, কিন্তু পর্দার আড়ালে তারা এখনও একইভাবে কাজ করে।
রুবি স্বয়ংক্রিয়ভাবে এক প্রকার থেকে অন্য প্রকারে সুইচ করে।
ক্লাস পরিবর্তন না করেই .
এর মানে হল ছোট
Integerসংখ্যাগুলি এখনওFixnumএর মতোই কাজ করে .সারাংশ
এই পোস্টে, আপনি রুবিতে বিদ্যমান বিভিন্ন সংখ্যা-সম্পর্কিত ক্লাস সম্পর্কে শিখেছেন।
আপনি শিখেছেন যে ফ্লোটগুলি অসম্পূর্ণ এবং আপনি
BigDecimalব্যবহার করতে পারেন যদি পারফরম্যান্সের চেয়ে নির্ভুলতা অনেক বেশি গুরুত্বপূর্ণ হয়। আপনি এটাও শিখেছেন যেFixnumবস্তু দোভাষী স্তরে বিশেষ, কিন্তুBignums শুধুমাত্র নিয়মিত বস্তু।আপনি যদি এই পোস্টটিকে আকর্ষণীয় মনে করেন তবে নীচের ফর্মে আমার নিউজলেটারে সাইন আপ করতে ভুলবেন না 🙂