Crystal tiene una variedad de tipos de números distintos para diversos propósitos. Por ejemplo, algunos tipos son más rápidos, pero tienen un rango más pequeño de valores posibles que otros. Otros tienen un rango más amplio de valores posibles, pero son más lentos.
En Crystal existen tanto tipos de enteros con signo como tipos de enteros sin signo. Los tipos de enteros con signo pueden ser positivos o negativos. Los tipos de enteros sin signo solo pueden ser positivos.
Estos son los tipos de enteros con signo en Crystal:
| Tipo | Tamaño (bits) | Rango |
|---|---|---|
Int8 |
8 | -128 a 127 |
Int16 |
16 | -32_768 a 32_767 |
Int32 |
32 | -2_147_483_648 a 2_147_483_647 |
Int64 |
64 | -9_223_372_036_854_775_808 a 9_223_372_036_854_775_807 |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728 a 170_141_183_460_469_231_731_687_303_715_884_105_727 |
Los tipos más pequeños usan menos memoria y son más rápidos que los tipos más grandes, pero tienen un rango más pequeño de valores posibles.
Cuando sabes que los valores van a estar dentro de cierto rango, lo mejor es usar el tipo más pequeño posible para ahorrar memoria y mejorar el rendimiento.
El tipo de entero predeterminado es Int32.
Para declarar un entero con un tipo específico, puedes usar el nombre del tipo como sufijo agregando <number>_I <bit>.
1_i8.class
# => Int8
Puedes usar el método to_i<bit> para convertir entre distintos tipos de enteros.
El método to_i convierte al tipo de entero predeterminado, Int32.
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
Estos son los enteros sin signo en Crystal:
UInt8, UInt16, UInt32, UInt64, UInt128
La única diferencia entre los enteros con signo y los enteros sin signo es que los enteros sin signo solo pueden ser positivos.
Para declarar un entero sin signo con un tipo específico, puedes usar el nombre del tipo como sufijo agregando <number>_u<bit>.
Puedes usar el método to_u<bit> para convertir entre distintos tipos de enteros sin signo.
El método to_u convierte al tipo de entero sin signo predeterminado, UInt32.
1_u8.to_u16.class
# => UInt16
Estos son los tipos de punto flotante en Crystal:
| Tipo | Tamaño (bits) | Rango |
|---|---|---|
Float32 |
32 | 1.2E-38 a 3.4E+38 |
Float64 |
64 | 2.3E-308 a 1.7E+308 |
Hay dos tipos de punto flotante distintos, uno es más preciso que el otro.
El tipo de punto flotante predeterminado es Float64.
Puedes usar el método to_f<bit> para convertir entre distintos tipos de punto flotante.
El método to_f convierte al tipo de punto flotante predeterminado, Float64.
La ESA (Exercism Space Agency) está a toda marcha planificando una nueva misión a Fobos, una luna de Marte. El objetivo de la misión es aterrizar una sonda en la superficie de Fobos y enviar datos sobre esa superficie. La ESA solicita tu ayuda para construir la computadora de navegación de la sonda. La computadora de navegación tiene memoria limitada, así que necesitamos mantener el uso de memoria lo más bajo posible. Por lo tanto, necesitamos usar los tipos de datos adecuados.
La computadora de navegación necesita conocer la distancia entre algunos objetos del espacio para hacer los cálculos correctos; la distancia se mide en km.
Define las siguientes constantes:
NEPTUNE_DISTANCE con el valor 4_400_000_000, que debe almacenarse como un Int64
MARS_DISTANCE con el valor 227_940_000, que debe almacenarse como un Int32
ATMOSPHERE_DISTANCE con el valor 10_000, que debe almacenarse como un Int16
La computadora de navegación necesita conocer el área de algunos objetos del espacio para hacer los cálculos correctos. Un área NO puede ser negativa. Los ingenieros planearon que el programa generara un error de desbordamiento cuando el área fuera negativa. Sin embargo, los ingenieros olvidaron cambiar el entero con signo por un entero sin signo.
Por lo tanto, los ingenieros quieren un programa que convierta un entero con signo en un entero sin signo.
Implementa el método Navigation#correct_area_analysis, que recibe measurement como argumento y devuelve el área como un entero sin signo de 32 bits.
El área dada siempre cabrá como un entero sin signo de 32 bits.
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
La computadora de navegación necesita conocer la velocidad de la sonda. La velocidad se mide en m/s.
Para calcular la velocidad, necesitamos conocer la distancia recorrida y el tiempo que tomó recorrer esa distancia. Luego, toma la distancia y divídela por el tiempo.
La velocidad puede no ser exacta y nunca será un número considerable.
Por lo tanto, podemos usar un Float32.
Implementa el método Navigation#calculate_velocity, que recibe distance y time como argumentos y devuelve la velocidad como 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
Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.