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 |
浮動小数点型は2種類あり、一方はもう一方よりも精度が高くなっています。
デフォルトの浮動小数点型はFloat64です。
to_f<bit>メソッドを使うと、異なる浮動小数点型の間で変換できます。
to_fメソッドは、デフォルトの浮動小数点型であるFloat64に変換します。
ESA(Exercism宇宙機関)は、火星の衛星であるフォボスへの新しいミッションの計画を急ピッチで進めています。 このミッションの目標は、探査機をフォボスの表面に着陸させ、表面に関するデータを送り返すことです。 ESAは、探査機のナビゲーションコンピューターの開発への協力を求めています。 ナビゲーションコンピューターのメモリは限られているので、メモリの使用量はできるだけ抑える必要があります。 そのため、適切なデータ型を使う必要があります。
ナビゲーションコンピューターが正しい計算を行うには、宇宙にあるいくつかの物体の間の距離を知る必要があります。距離はkmで表されます。
次の定数を定義しましょう。
NEPTUNE_DISTANCE:値は4_400_000_000で、Int64として保存しますMARS_DISTANCE:値は227_940_000で、Int32として保存しますATMOSPHERE_DISTANCE:値は10_000で、Int16として保存しますナビゲーションコンピューターが正しい計算を行うには、宇宙にあるいくつかの物体の面積を知る必要があります。 面積が負になることはありません。 エンジニアたちは、面積が負になったときにオーバーフローエラーが発生するようにプログラムを設計していました。 しかし、符号付き整数を符号なし整数に変更するのを忘れていました。
そこで、符号付き整数を符号なし整数に変換するプログラムが必要になりました。
measurementを引数として受け取り、面積を32ビットの符号なし整数として返すNavigation#correct_area_analysisメソッドを実装しましょう。
与えられる面積は、常に32ビットの符号なし整数に収まります。
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
ナビゲーションコンピューターは、探査機の速度を知る必要があります。 速度はm/sで表されます。
速度を計算するには、移動した距離と、その距離を移動するのにかかった時間を知る必要があります。 そして、距離を時間で割ります。
速度は正確とは限らず、極端に大きな数値になることもありません。
そのため、Float32を使えます。
distanceとtimeを引数として受け取り、速度を32ビットのFloatとして返すNavigation#calculate_velocityメソッドを実装しましょう。
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32