導航電腦

導航電腦

學習練習

簡介

Crystal 有各式各樣的數字型別,各有不同用途。舉例來說,有些型別速度較快,但可容納的值的範圍比其他的小。有些型別可容納的值的範圍較大,但速度較慢。

在 Crystal 中,帶號整數型別和無號整數型別都有。帶號整數型別可以是正數或負數。無號整數型別只能是正數。

帶號整數型別

以下是 Crystal 中的帶號整數型別:

Type Size (bits) Range
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 中的浮點數型別:

Type Size (bits) Range
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 請你協助打造探測器的導航電腦。 導航電腦的記憶體有限,所以我們得盡可能降低記憶體用量。 因此,我們需要選用合適的資料型態。

1. 導航常數

導航電腦需要知道太空中某些物體之間的距離,才能進行正確的計算,距離以公里為單位。

定義下列常數:

  • NEPTUNE_DISTANCE,值為 4_400_000_000,應以 Int64 儲存
  • MARS_DISTANCE,值為 227_940_000,應以 Int32 儲存
  • ATMOSPHERE_DISTANCE,值為 10_000,應以 Int16 儲存

2. 修正面積分析

導航電腦需要知道太空中某些物體的面積,才能進行正確的計算。 面積不可能是負值。 工程師原本規劃讓程式在面積為負值時產生溢位錯誤。 不過,工程師忘了把有號整數改成無號整數。

因此,工程師希望有一個能把有號整數轉換成無號整數的程式。

請實作 Navigation#correct_area_analysis 方法,它接受 measurement 作為引數,並以 32 位元的無號整數回傳面積。

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。

請實作 Navigation#calculate_velocity 方法,它接受 distance 和 time 作為引數,並以 32 位元的Float回傳速度。

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,全部免費。