Crystal ha diversi tipi di numeri per vari scopi. Per esempio, alcuni tipi sono più veloci ma hanno un intervallo di valori possibili più piccolo rispetto ad altri. Altri hanno un intervallo di valori possibili più ampio ma sono più lenti.
In Crystal esistono sia tipi interi con segno che tipi interi senza segno. I tipi interi con segno possono essere positivi o negativi. I tipi interi senza segno possono essere solo positivi.
Questi sono i tipi interi con segno in Crystal:
| Type | Size (bits) | Range |
|---|---|---|
Int8 |
8 | -128 to 127 |
Int16 |
16 | -32_768 to 32_767 |
Int32 |
32 | -2_147_483_648 to 2_147_483_647 |
Int64 |
64 | -9_223_372_036_854_775_808 to 9_223_372_036_854_775_807 |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728 to 170_141_183_460_469_231_731_687_303_715_884_105_727 |
I tipi più piccoli usano meno memoria e sono più veloci di quelli più grandi, ma hanno un intervallo di valori possibili più piccolo.
Quando sai che i valori rientreranno in un certo intervallo, la cosa migliore è usare il tipo più piccolo possibile per risparmiare memoria e migliorare le prestazioni.
Il tipo intero predefinito è Int32.
Per dichiarare un intero con un tipo specifico, puoi usare il nome del tipo come suffisso aggiungendo <number>_I <bit>.
1_i8.class
# => Int8
Puoi usare il metodo to_i<bit> per convertire tra tipi interi diversi.
Il metodo to_i converte al tipo intero predefinito, Int32.
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
Questi sono i tipi interi senza segno in Crystal:
UInt8, UInt16, UInt32, UInt64, UInt128
L'unica differenza tra interi con segno e interi senza segno è che quelli senza segno possono essere solo positivi.
Per dichiarare un intero senza segno con un tipo specifico, puoi usare il nome del tipo come suffisso aggiungendo <number>_u<bit>.
Puoi usare il metodo to_u<bit> per convertire tra tipi interi senza segno diversi.
Il metodo to_u converte al tipo intero senza segno predefinito, UInt32.
1_u8.to_u16.class
# => UInt16
Questi sono i tipi in virgola mobile in Crystal:
| Type | Size (bits) | Range |
|---|---|---|
Float32 |
32 | 1.2E-38 to 3.4E+38 |
Float64 |
64 | 2.3E-308 to 1.7E+308 |
Esistono due tipi in virgola mobile diversi, uno è più preciso dell'altro.
Il tipo in virgola mobile predefinito è Float64.
Puoi usare il metodo to_f<bit> per convertire tra tipi in virgola mobile diversi.
Il metodo to_f converte al tipo in virgola mobile predefinito, Float64.
L'ESA (Exercism Space Agency) sta pianificando a pieno ritmo una nuova missione verso Phobos, una luna di Marte. L'obiettivo della missione è far atterrare una sonda sulla superficie di Phobos e inviare dati sulla superficie. L'ESA ha chiesto il tuo aiuto per costruire il computer di navigazione della sonda. Il computer di navigazione ha memoria limitata, quindi dobbiamo mantenere l'utilizzo della memoria il più basso possibile. Per questo, dobbiamo usare i tipi di dati adatti.
Il computer di navigazione deve conoscere la distanza tra alcuni oggetti nello spazio per eseguire i calcoli corretti. La distanza è misurata in km.
Definisci le seguenti costanti:
NEPTUNE_DISTANCE con il valore 4_400_000_000, che dovrebbe essere memorizzato come Int64
MARS_DISTANCE con il valore 227_940_000, che dovrebbe essere memorizzato come Int32
ATMOSPHERE_DISTANCE con il valore 10_000, che dovrebbe essere memorizzato come Int16
Il computer di navigazione deve conoscere l'area di alcuni oggetti nello spazio per eseguire i calcoli corretti. Un'area NON può essere negativa. Gli ingegneri avevano progettato il programma in modo che generasse un errore di overflow quando l'area era negativa. Tuttavia, gli ingegneri hanno dimenticato di cambiare l'intero con segno in un intero senza segno.
Perciò, gli ingegneri vorrebbero un programma che converta un intero con segno in un intero senza segno.
Implementa il metodo Navigation#correct_area_analysis che prende measurement come argomento e restituisce l'area come intero senza segno a 32 bit.
L'area fornita rientrerà sempre in un intero senza segno a 32 bit.
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
Il computer di navigazione deve conoscere la velocità della sonda. La velocità è misurata in m/s.
Per calcolare la velocità, dobbiamo conoscere la distanza percorsa e il tempo impiegato per percorrerla. Poi, prendi la distanza e dividila per il tempo.
La velocità può non essere precisa e non sarà mai un numero considerevole.
Perciò, possiamo usare un Float32.
Implementa il metodo Navigation#calculate_velocity che prende distance e time come argomenti e restituisce la velocità come Float a 32 bit.
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.