Crystal tiene una variedad de tipos de números diferentes para distintos propósitos. Por ejemplo, algunos tipos son más rápidos, pero tienen un rango de valores posibles más pequeño que otros. Otros tienen un rango de valores posibles más amplio, pero son más lentos.
En Crystal hay tipos de números enteros tanto con signo como 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 de 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 más grandes, pero tienen un rango de valores posibles más pequeño.
Cuando sabes que los valores estarán dentro de un rango determinado, 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 añadiendo <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 tipos de enteros sin signo de Crystal:
UInt8, UInt16, UInt32, UInt64, UInt128
La única diferencia entre enteros con signo y 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 añadiendo <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 coma flotante de 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 coma flotante distintos; uno es más preciso que el otro.
El tipo de coma flotante predeterminado es Float64.
Puedes usar el método to_f<bit> para convertir entre distintos tipos de coma flotante.
El método to_f convierte al tipo de coma flotante predeterminado, Float64.
La ESA (Exercism Space Agency) está a pleno rendimiento planificando una nueva misión a Fobos, una luna de Marte. El objetivo de la misión es posar una sonda en la superficie de Fobos y enviar datos sobre dicha superficie. La ESA ha solicitado tu ayuda para construir el ordenador de navegación de la sonda. El ordenador 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.
El ordenador 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
El ordenador 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 el programa para que generase un error de desbordamiento cuando el área fuese negativa. Sin embargo, los ingenieros olvidaron cambiar el entero con signo por un entero sin signo.
Por lo tanto, los ingenieros querrían un programa que convierta un entero con signo en un entero sin signo.
Implementa el método Navigation#correct_area_analysis, que toma una measurement como argumento y devuelve el área como un entero sin signo de 32 bits.
El área proporcionada 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
El ordenador 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 se tardó en recorrerla. Después, toma la distancia y divídela entre el tiempo.
La velocidad no tiene por qué ser exacta y nunca será un número considerable.
Por lo tanto, podemos usar un Float32.
Implementa el método Navigation#calculate_velocity, que toma 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.