Crystal برای کاربردهای گوناگون، نوعهای عددی مختلفی دارد. برای مثال، بعضی از نوعها سریعترند اما بازهی مقادیر ممکنشان از بقیه کوچکتر است. بعضی دیگر بازهی گستردهتری از مقادیر ممکن دارند اما کندترند.
در Crystal هم نوعهای عدد صحیح علامتدار وجود دارد و هم نوعهای عدد صحیح بدون علامت. نوعهای عدد صحیح علامتدار میتوانند مثبت یا منفی باشند. نوعهای عدد صحیح بدون علامت فقط میتوانند مثبت باشند.
اینها نوعهای عدد صحیح علامتدار در Crystal هستند:
| نوع | اندازه (بیت) | بازه |
|---|---|---|
Int8 |
۸ | از -۱۲۸ تا ۱۲۷ |
Int16 |
۱۶ | از -۳۲_۷۶۸ تا ۳۲_۷۶۷ |
Int32 |
۳۲ | از -۲_۱۴۷_۴۸۳_۶۴۸ تا ۲_۱۴۷_۴۸۳_۶۴۷ |
Int64 |
۶۴ | از -۹_۲۲۳_۳۷۲_۰۳۶_۸۵۴_۷۷۵_۸۰۸ تا ۹_۲۲۳_۳۷۲_۰۳۶_۸۵۴_۷۷۵_۸۰۷ |
Int128 |
۱۲۸ | از -۱۷۰_۱۴۱_۱۸۳_۴۶۰_۴۶۹_۲۳۱_۷۳۱_۶۸۷_۳۰۳_۷۱۵_۸۸۴_۱۰۵_۷۲۸ تا ۱۷۰_۱۴۱_۱۸۳_۴۶۰_۴۶۹_۲۳۱_۷۳۱_۶۸۷_۳۰۳_۷۱۵_۸۸۴_۱۰۵_۷۲۷ |
نوعهای کوچکتر حافظهی کمتری مصرف میکنند و از نوعهای بزرگتر سریعترند، اما بازهی کوچکتری از مقادیر ممکن دارند.
اگر بدانید که مقادیر در بازهی مشخصی قرار میگیرند، بهترین کار استفاده از کوچکترین نوع ممکن است تا در حافظه صرفهجویی شود و کارایی بهبود یابد.
نوع پیشفرض عدد صحیح 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 |
۳۲ | از ۱.۲E-۳۸ تا ۳.۴E+۳۸ |
Float64 |
۶۴ | از ۲.۳E-۳۰۸ تا ۱.۷E+۳۰۸ |
دو نوع ممیز شناور متفاوت وجود دارد که یکی از دیگری دقیقتر است.
نوع پیشفرض ممیز شناور Float64 است.
میتوانید از متد to_f<bit> برای تبدیل میان نوعهای مختلف ممیز شناور استفاده کنید.
متد to_f به نوع پیشفرض ممیز شناور، Float64، تبدیل میکند.
آژانس فضایی Exercism (ESA) با تمام سرعت در حال برنامهریزی برای مأموریتی تازه به فوبوس است، قمری از مریخ. هدف این مأموریت نشاندن یک کاوشگر بر سطح فوبوس و فرستادن دادههایی دربارهی سطح آن است. ESA از شما خواسته است که در ساخت رایانهی ناوبری کاوشگر به آن کمک کنید. حافظهی رایانهی ناوبری محدود است، پس باید مصرف حافظه را تا حد امکان پایین نگه داریم. به همین دلیل باید از انواع دادهی مناسب استفاده کنیم.
رایانهی ناوبری برای انجام محاسبات درست باید فاصلهی میان بعضی از اجرام فضایی را بداند؛ این فاصله بر حسب کیلومتر اندازهگیری میشود.
ثابتهای زیر را تعریف کنید:
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
رایانهی ناوبری باید سرعت کاوشگر را بداند. سرعت بر حسب متر بر ثانیه اندازهگیری میشود.
برای محاسبهی سرعت باید مسافت پیمودهشده و زمانی را که برای پیمودن آن مسافت صرف شده است بدانیم. سپس مسافت را بر زمان تقسیم کنید.
سرعت میتواند کمی نادقیق باشد و هرگز عدد بزرگی نخواهد بود.
بنابراین میتوانیم از یک 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