Crystal dispose de divers types de nombres pour des usages variés. Par exemple, certains types sont plus rapides, mais couvrent une plage de valeurs possibles plus petite que d'autres. D'autres couvrent une plage de valeurs plus étendue, mais sont plus lents.
En Crystal, il existe à la fois des types entiers signés et des types entiers non signés. Les types entiers signés peuvent être positifs ou négatifs. Les types entiers non signés ne peuvent être que positifs.
Voici les types entiers signés en Crystal :
| Type | Taille (bits) | Plage |
|---|---|---|
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 |
Les types les plus petits utilisent moins de mémoire et sont plus rapides que les plus grands, mais leur plage de valeurs possibles est plus restreinte.
Quand on sait que les valeurs resteront dans une certaine plage, le mieux est d'utiliser le plus petit type possible, afin d'économiser de la mémoire et d'améliorer les performances.
Le type entier par défaut est Int32.
Pour déclarer un entier d'un type précis, tu peux utiliser le nom du type comme suffixe en ajoutant <number>_I <bit>.
1_i8.class
# => Int8
Tu peux utiliser la méthode to_i<bit> pour convertir un type entier en un autre.
La méthode to_i convertit vers le type entier par défaut, Int32.
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
Voici les types entiers non signés en Crystal :
UInt8, UInt16, UInt32, UInt64, UInt128
La seule différence entre les entiers signés et les entiers non signés est que les entiers non signés ne peuvent être que positifs.
Pour déclarer un entier non signé d'un type précis, tu peux utiliser le nom du type comme suffixe en ajoutant <number>_u<bit>.
Tu peux utiliser la méthode to_u<bit> pour convertir un type entier non signé en un autre.
La méthode to_u convertit vers le type entier non signé par défaut, UInt32.
1_u8.to_u16.class
# => UInt16
Voici les types à virgule flottante en Crystal :
| Type | Taille (bits) | Plage |
|---|---|---|
Float32 |
32 | 1.2E-38 à 3.4E+38 |
Float64 |
64 | 2.3E-308 à 1.7E+308 |
Il existe deux types à virgule flottante différents, l'un étant plus précis que l'autre.
Le type à virgule flottante par défaut est Float64.
Tu peux utiliser la méthode to_f<bit> pour convertir un type à virgule flottante en un autre.
La méthode to_f convertit vers le type à virgule flottante par défaut, Float64.
L'ESA (Exercism Space Agency) est en pleine préparation d'une nouvelle mission vers Phobos, une lune de Mars. L'objectif de la mission est de poser une sonde à la surface de Phobos et de renvoyer des données sur cette surface. L'ESA a demandé ton aide pour construire l'ordinateur de navigation de la sonde. L'ordinateur de navigation dispose d'une mémoire limitée, on doit donc garder une utilisation de la mémoire aussi faible que possible. C'est pourquoi on doit utiliser les types de données adaptés.
L'ordinateur de navigation a besoin de connaître la distance entre certains objets de l'espace pour effectuer les bons calculs ; cette distance se mesure en km.
Définis les constantes suivantes :
NEPTUNE_DISTANCE avec la valeur 4_400_000_000, qui doit être stockée dans un Int64
MARS_DISTANCE avec la valeur 227_940_000, qui doit être stockée dans un Int32
ATMOSPHERE_DISTANCE avec la valeur 10_000, qui doit être stockée dans un Int16
L'ordinateur de navigation a besoin de connaître l'aire de certains objets de l'espace pour effectuer les bons calculs. Une aire ne peut PAS être négative. Les ingénieurs avaient prévu que le programme génère une erreur de dépassement lorsque l'aire était négative. Cependant, ils ont oublié de convertir l'entier signé en entier non signé.
Par conséquent, les ingénieurs aimeraient un programme qui convertit un entier signé en entier non signé.
Implémente la méthode Navigation#correct_area_analysis qui prend un measurement en argument et renvoie l'aire sous la forme d'un entier non signé de 32 bits.
L'aire donnée tiendra toujours dans un entier non signé de 32 bits.
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
L'ordinateur de navigation a besoin de connaître la vitesse de la sonde. La vitesse se mesure en m/s.
Pour calculer la vitesse, on doit connaître la distance parcourue et le temps mis pour parcourir cette distance. Il suffit alors de prendre la distance et de la diviser par le temps.
La vitesse peut manquer de précision et ne sera jamais un nombre considérable.
On peut donc utiliser un Float32.
Implémente la méthode Navigation#calculate_velocity qui prend distance et time en arguments et renvoie la vitesse sous la forme d'un Float de 32 bits.
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
Inscris-toi sur Exercism pour apprendre et maîtriser Crystal avec 26 concepts142 exercices, et un vrai mentorat humain, le tout gratuitement.