У Crystal є різноманітні типи чисел для різних потреб. Наприклад, одні типи працюють швидше, але мають менший діапазон можливих значень, ніж інші. Інші мають ширший діапазон можливих значень, але працюють повільніше.
У Crystal існують як цілі числа зі знаком, так і беззнакові цілі числа. Цілі числа зі знаком можуть бути додатними або відʼємними. Беззнакові цілі числа можуть бути лише додатними.
Ось типи цілих чисел зі знаком у Crystal:
| Тип | Розмір (біти) | Діапазон |
|---|---|---|
Int8 |
8 | від -128 до 127 |
Int16 |
16 | від -32_768 до 32_767 |
Int32 |
32 | від -2_147_483_648 до 2_147_483_647 |
Int64 |
64 | від -9_223_372_036_854_775_808 до 9_223_372_036_854_775_807 |
Int128 |
128 | від -170_141_183_460_469_231_731_687_303_715_884_105_728 до 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 до 3.4E+38 |
Float64 |
64 | від 2.3E-308 до 1.7E+308 |
Існують два різні типи чисел з плаваючою комою, один із них точніший за інший.
Типовим типом чисел з плаваючою комою є Float64.
Щоб перетворювати різні типи чисел з плаваючою комою, можна використати метод to_f<bit>.
Метод to_f перетворює значення на типовий тип чисел з плаваючою комою, Float64.
ESA (Космічне агентство Exercism) на повній швидкості планує нову місію до Фобоса, супутника Марса. Мета місії - посадити зонд на поверхню Фобоса й надіслати назад дані про цю поверхню. ESA попросила нас допомогти створити навігаційний компʼютер для зонда. Навігаційний компʼютер має обмежену памʼять, тож нам потрібно якомога зменшити використання памʼяті. Тому нам потрібно використовувати відповідні типи даних.
Навігаційному компʼютеру потрібно знати відстань між деякими обʼєктами в космосі, щоб виконувати правильні обчислення; відстань вимірюється в кілометрах.
Визначте такі константи:
NEPTUNE_DISTANCE зі значенням 4_400_000_000, яке потрібно зберігати як Int64
MARS_DISTANCE зі значенням 227_940_000, яке потрібно зберігати як Int32
ATMOSPHERE_DISTANCE зі значенням 10_000, яке потрібно зберігати як Int16
Навігаційному компʼютеру потрібно знати площу деяких обʼєктів у космосі, щоб виконувати правильні обчислення. Площа НЕ може бути відʼємною. Інженери планували, що програма генеруватиме помилку переповнення, коли площа відʼємна. Однак інженери забули змінити ціле число зі знаком на беззнакове ціле число.
Тому інженери хочуть програму, яка перетворює ціле число зі знаком на беззнакове ціле число.
Реалізуйте метод Navigation#correct_area_analysis, який приймає measurement як аргумент і повертає площу як беззнакове ціле число з 32 бітами.
Надана площа завжди поміститься в беззнакове ціле число з 32 бітами.
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 з 32 бітами.
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 вправи та справжнє наставництво від людей, і все це безкоштовно.