トラック
/
Crystal
Crystal
/
演習
/
航法コンピューター
航法コンピューター

航法コンピューター

学習演習

はじめに

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は、探査機のナビゲーションコンピューターの開発への協力を求めています。 ナビゲーションコンピューターのメモリは限られているので、メモリの使用量はできるだけ抑える必要があります。 そのため、適切なデータ型を使う必要があります。

1. ナビゲーションの定数

ナビゲーションコンピューターが正しい計算を行うには、宇宙にあるいくつかの物体の間の距離を知る必要があります。距離はkmで表されます。

次の定数を定義しましょう。

  • NEPTUNE_DISTANCE:値は4_400_000_000で、Int64として保存します
  • MARS_DISTANCE:値は227_940_000で、Int32として保存します
  • ATMOSPHERE_DISTANCE:値は10_000で、Int16として保存します

2. 正しい面積の計算

ナビゲーションコンピューターが正しい計算を行うには、宇宙にあるいくつかの物体の面積を知る必要があります。 面積が負になることはありません。 エンジニアたちは、面積が負になったときにオーバーフローエラーが発生するようにプログラムを設計していました。 しかし、符号付き整数を符号なし整数に変更するのを忘れていました。

そこで、符号付き整数を符号なし整数に変換するプログラムが必要になりました。

measurementを引数として受け取り、面積を32ビットの符号なし整数として返すNavigation#correct_area_analysisメソッドを実装しましょう。

Note

与えられる面積は、常に32ビットの符号なし整数に収まります。

measurement = 52554
measurement.class
# => Int32

Navigation.new.correct_area_analysis(measurement)
# => 52554

Navigation.new.correct_area_analysis(measurement).class
# => UInt32

3. 速度の計算

ナビゲーションコンピューターは、探査機の速度を知る必要があります。 速度は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
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Crystal Exercism

航法コンピューターを始める準備はできましたか?

Exercismに登録すれば、26個のコンセプト142個の演習、そして本物の人間によるメンタリングとともに、Crystalを学んでマスターできます。すべて無料です。