Crystal-এ নানা কাজের জন্য বিভিন্ন রকমের সংখ্যার টাইপ রয়েছে। উদাহরণস্বরূপ, কিছু টাইপ দ্রুততর, কিন্তু সম্ভাব্য মানের পরিসর অন্য টাইপগুলোর চেয়ে ছোট। আবার কিছু টাইপের সম্ভাব্য মানের পরিসর অনেক বড়, কিন্তু সেগুলো ধীরগতির।
Crystal-এ সাইনড এবং আনসাইনড, দুধরনের ইন্টিজার টাইপই আছে। সাইনড ইন্টিজার টাইপ ধনাত্মক বা ঋণাত্মক হতে পারে। আনসাইনড ইন্টিজার টাইপ কেবল ধনাত্মক হতে পারে।
Crystal-এ এগুলো হলো সাইনড ইন্টিজার টাইপ:
| টাইপ | আকার (বিট) | পরিসর |
|---|---|---|
Int8 |
8 | -128 to 127 |
Int16 |
16 | -32_768 to 32_767 |
Int32 |
32 | -2_147_483_648 to 2_147_483_647 |
Int64 |
64 | -9_223_372_036_854_775_808 to 9_223_372_036_854_775_807 |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728 to 170_141_183_460_469_231_731_687_303_715_884_105_727 |
ছোট টাইপগুলো বড় টাইপের চেয়ে কম মেমরি ব্যবহার করে এবং দ্রুততর, তবে সম্ভাব্য মানের পরিসর ছোট।
যখন আপনি জানেন যে মানগুলো একটি নির্দিষ্ট পরিসরের মধ্যে থাকবে, তখন মেমরি বাঁচাতে ও পারফরম্যান্স বাড়াতে সম্ভব হলে সবচেয়ে ছোট টাইপ ব্যবহার করাই সবচেয়ে ভালো।
ডিফল্ট ইন্টিজার টাইপ হলো Int32.
নির্দিষ্ট টাইপের একটি ইন্টিজার ডিক্লেয়ার করতে, <number>_I <bit> যোগ করে টাইপের নামটি সাফিক্স হিসেবে ব্যবহার করতে পারেন।
1_i8.class
# => Int8
ভিন্ন ভিন্ন ইন্টিজার টাইপের মধ্যে রূপান্তর করতে আপনি to_i<bit> মেথড ব্যবহার করতে পারেন।
to_i মেথড ডিফল্ট ইন্টিজার টাইপ Int32-এ রূপান্তর করে।
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
Crystal-এ এগুলো হলো আনসাইনড ইন্টিজার টাইপ:
UInt8, UInt16, UInt32, UInt64, UInt128
সাইনড ও আনসাইনড ইন্টিজারের মধ্যে একমাত্র পার্থক্য হলো, আনসাইনড ইন্টিজার কেবল ধনাত্মক হতে পারে।
নির্দিষ্ট টাইপের একটি আনসাইনড ইন্টিজার ডিক্লেয়ার করতে, <number>_u<bit> যোগ করে টাইপের নামটি সাফিক্স হিসেবে ব্যবহার করতে পারেন।
ভিন্ন ভিন্ন আনসাইনড ইন্টিজার টাইপের মধ্যে রূপান্তর করতে আপনি to_u<bit> মেথড ব্যবহার করতে পারেন।
to_u মেথড ডিফল্ট আনসাইনড ইন্টিজার টাইপ UInt32-এ রূপান্তর করে।
1_u8.to_u16.class
# => UInt16
Crystal-এ এগুলো হলো ফ্লোটিং পয়েন্ট টাইপ:
| টাইপ | আকার (বিট) | পরিসর |
|---|---|---|
Float32 |
32 | 1.2E-38 to 3.4E+38 |
Float64 |
64 | 2.3E-308 to 1.7E+308 |
এখানে দুটি ভিন্ন ফ্লোটিং পয়েন্ট টাইপ আছে, যার একটি অন্যটির চেয়ে বেশি নির্ভুল।
ডিফল্ট ফ্লোটিং পয়েন্ট টাইপ হলো Float64.
ভিন্ন ভিন্ন ফ্লোটিং পয়েন্ট টাইপের মধ্যে রূপান্তর করতে আপনি to_f<bit> মেথড ব্যবহার করতে পারেন।
to_f মেথড ডিফল্ট ফ্লোটিং পয়েন্ট টাইপ Float64-এ রূপান্তর করে।
ESA (Exercism Space Agency) মঙ্গলগ্রহের একটি উপগ্রহ ফোবোস-এ নতুন একটি মিশনের পরিকল্পনায় পুরোদমে এগিয়ে চলেছে। মিশনের লক্ষ্য হলো ফোবোসের পৃষ্ঠে একটি প্রোব অবতরণ করানো এবং সেই পৃষ্ঠ সম্পর্কে ডেটা ফেরত পাঠানো। প্রোবটির নেভিগেশন কম্পিউটার তৈরিতে ESA আপনার সাহায্য চেয়েছে। নেভিগেশন কম্পিউটারের মেমরি সীমিত, তাই মেমরির ব্যবহার যতটা সম্ভব কম রাখতে হবে। তাই আমাদের উপযুক্ত ডেটা টাইপ ব্যবহার করতে হবে।
সঠিক হিসাব করার জন্য নেভিগেশন কম্পিউটারকে মহাকাশের কিছু বস্তুর মধ্যে দূরত্ব জানতে হয়। এই দূরত্ব মাপা হয় km-এ।
নিচের কনস্ট্যান্টগুলো ডিফাইন করুন:
NEPTUNE_DISTANCE নামে 4_400_000_000 মানের একটি কনস্ট্যান্ট, যা Int64 হিসেবে সংরক্ষণ করতে হবেMARS_DISTANCE নামে 227_940_000 মানের একটি কনস্ট্যান্ট, যা Int32 হিসেবে সংরক্ষণ করতে হবেATMOSPHERE_DISTANCE নামে 10_000 মানের একটি কনস্ট্যান্ট, যা Int16 হিসেবে সংরক্ষণ করতে হবেসঠিক হিসাব করার জন্য নেভিগেশন কম্পিউটারকে মহাকাশের কিছু বস্তুর ক্ষেত্রফল জানতে হয়। একটি ক্ষেত্রফল ঋণাত্মক হতে পারে না। ইঞ্জিনিয়াররা প্রোগ্রামটি এমনভাবে বানানোর পরিকল্পনা করেছিলেন যাতে ক্ষেত্রফল ঋণাত্মক হলে একটি ওভারফ্লো এরর তৈরি হয়। তবে ইঞ্জিনিয়াররা সাইনড ইন্টিজারটিকে আনসাইন্ড ইন্টিজারে বদলাতে ভুলে গিয়েছিলেন।
তাই ইঞ্জিনিয়াররা এমন একটি প্রোগ্রাম চান যা একটি সাইনড ইন্টিজারকে আনসাইন্ড ইন্টিজারে রূপান্তর করে।
Navigation#correct_area_analysis মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি measurement নেয় এবং ৩২ বিটের একটি আনসাইন্ড ইন্টিজার হিসেবে ক্ষেত্রফল রিটার্ন করে।
প্রদত্ত ক্ষেত্রফল সর্বদা ৩২ বিটের একটি আনসাইন্ড ইন্টিজার হিসেবে ধরে যাবে।
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
নেভিগেশন কম্পিউটারকে প্রোবের বেগ জানতে হবে। বেগ মাপা হয় m/s-এ।
বেগ হিসাব করতে হলে অতিক্রম করা দূরত্ব এবং সেই দূরত্ব অতিক্রম করতে যে সময় লেগেছে, তা জানতে হবে। তারপর দূরত্ব নিয়ে সেটিকে সময় দিয়ে ভাগ করুন।
বেগ সবসময় নিখুঁত নাও হতে পারে এবং কখনোই খুব বড় কোনো সংখ্যা হবে না। তাই আমরা একটি Float32 ব্যবহার করতে পারি।
Navigation#calculate_velocity মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে distance ও time নেয় এবং ৩২ বিটের একটি Float হিসেবে বেগ রিটার্ন করে।
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
Exercism-এ সাইন আপ করুন, Crystal ট্র্যাকের 26টি কনসেপ্ট142টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।