কম্পিউটার

রুবিতে সংখ্যাগুলি কীভাবে কাজ করে:পূর্ণসংখ্যা, ফ্লোট এবং বিগডেসিমাল বোঝা

রুবি 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. 

BigDecimal Float থেকে 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 বস্তু দোভাষী স্তরে বিশেষ, কিন্তু Bignum s শুধুমাত্র নিয়মিত বস্তু।

আপনি যদি এই পোস্টটিকে আকর্ষণীয় মনে করেন তবে নীচের ফর্মে আমার নিউজলেটারে সাইন আপ করতে ভুলবেন না 🙂


  1. কিভাবে Rbenv, RubyGems এবং Bundler একসাথে কাজ করে তা বোঝা

  2. রুবিতে স্টেট মেশিন তৈরি করতে AASM রত্নটি কীভাবে ব্যবহার করবেন

  3. রুবি 2.6-এ MJIT কী এবং এটি কীভাবে কাজ করে?

  4. রুবির অ্যারে ক্লাস কীভাবে ব্যবহার করবেন (উদাহরণ + দরকারী পদ্ধতি)