Paquete math en Go: Guía Completa con Ejemplos Avanzados
El paquete math en Go proporciona una amplia gama de funciones matemáticas esenciales para aplicaciones científicas, de ingeniería y análisis de datos. Esta guía ampliada incluye ejemplos prácticos, casos especiales y aplicaciones del mundo real.
Constantes Matemáticas Clave
math.Pi // 3.141592653589793
math.E // 2.718281828459045
math.Phi // 1.618033988749895 (proporción áurea)
math.Inf(1) // +Infinito
math.NaN() // Not-a-Number
Funciones Básicas Mejoradas
1. math.Abs - Valor Absoluto
// Manejo de tipos enteros
func AbsInt(x int) int {
if x < 0 {
return -x
}
return x
}
// Ejemplo con float64
fmt.Println(math.Abs(-3.14)) // 3.14
fmt.Println(math.Abs(math.Inf(1))) // +Inf
2. math.Pow - Potenciación
// Cálculo de interés compuesto
principal := 1000.0
tasa := 0.05
años := 3.0
monto := principal * math.Pow(1 + tasa, años)
fmt.Printf("Monto final: $%.2f\n", monto) // $1157.63
// Caso especial: Potencia cero
fmt.Println(math.Pow(5, 0)) // 1 (siempre)
3. math.Sqrt - Raíz Cuadrada
// Distancia entre dos puntos (teorema de Pitágoras)
func Distancia(x1, y1, x2, y2 float64) float64 {
dx := x2 - x1
dy := y2 - y1
return math.Sqrt(dx*dx + dy*dy)
}
fmt.Println(Distancia(0, 0, 3, 4)) // 5
Funciones Trigonométricas Avanzadas
4. Conversión de Grados a Radianes
func GradosARadianes(grados float64) float64 {
return grados * math.Pi / 180
}
// Cálculo de altura de un edificio usando ángulo
distancia := 50.0 // metros
angulo := 60.0 // grados
altura := distancia * math.Tan(GradosARadianes(angulo))
fmt.Printf("Altura: %.2f metros\n", altura) // 86.60 m
5. math.Sin - Movimiento Ondulatorio
// Simulación de onda senoidal
amplitud := 2.0
frecuencia := 1.0
tiempo := 0.5
posicion := amplitud * math.Sin(2 * math.Pi * frecuencia * tiempo)
fmt.Printf("Posición: %.2f\n", posicion) // 2.00
Funciones Logarítmicas y Exponenciales
6. math.Log - Crecimiento Exponencial
// Cálculo de tiempo de duplicación (regla del 72)
tasaCrecimiento := 0.08 // 8%
tiempoDuplicacion := math.Log(2) / math.Log(1 + tasaCrecimiento)
fmt.Printf("Se duplica en %.1f años\n", tiempoDuplicacion) // 9.0 años
7. math.Exp - Decaimiento Radioactivo
// Cálculo de material restante
cantidadInicial := 100.0 // gramos
constanteDecaimiento := 0.005
tiempo := 100.0
cantidad := cantidadInicial * math.Exp(-constanteDecaimiento * tiempo)
fmt.Printf("Material restante: %.2f gramos\n", cantidad) // 60.65 g
Funciones de Comparación y Casos Especiales
8. math.Max/math.Min - Normalización de Datos
// Normalizar valores entre 0 y 1
valores := []float64{4, 2, 7, 1}
minVal := math.Inf(1)
maxVal := math.Inf(-1)
for _, v := range valores {
minVal = math.Min(minVal, v)
maxVal = math.Max(maxVal, v)
}
for i, v := range valores {
valores[i] = (v - minVal) / (maxVal - minVal)
}
fmt.Println(valores) // [0.5 0.166... 1 0]
9. math.Mod - Manejo de Números Negativos
fmt.Println(math.Mod(7, 3)) // 1
fmt.Println(math.Mod(-7, 3)) // -1 (comportamiento particular)
fmt.Println(math.Mod(7, -3)) // 1
fmt.Println(math.Mod(7, 0)) // NaN
Mejores Prácticas y Advertencias
-
Precisión en Comparaciones:
// Evitar comparaciones directas con floats a := 0.1 + 0.2 b := 0.3 fmt.Println(a == b) // false fmt.Println(math.Abs(a-b) < 1e-9) // true -
Manejo de Valores Especiales:
x := math.Log(-1) // NaN fmt.Println(math.IsNaN(x)) // true fmt.Println(math.IsInf(math.Inf(1), 1)) // true -
Optimización de Rendimiento:
// Precalcular valores frecuentes var ( rad30 = GradosARadianes(30) sin30 = math.Sin(rad30) cos30 = math.Cos(rad30) )
Ejemplo Integrado: Simulación Física
// Simulación de movimiento parabólico
func SimularProyectil(velocidad, angulo, gravedad float64) ([]float64, []float64) {
rad := GradosARadianes(angulo)
vx := velocidad * math.Cos(rad)
vy := velocidad * math.Sin(rad)
tTotal := 2 * vy / gravedad
var x, y []float64
for t := 0.0; t <= tTotal; t += 0.1 {
x = append(x, vx * t)
y = append(y, vy * t - 0.5 * gravedad * t * t)
}
return x, y
}
// Uso:
x, y := SimularProyectil(50, 45, 9.81)
fmt.Println("Posiciones X:", x[:3]) // [0 35.355... 70.710...]
fmt.Println("Posiciones Y:", y[:3]) // [0 35.355...-4.905 70.710...-19.62]
Esta guía ampliada muestra cómo utilizar el paquete math para resolver problemas complejos, desde cálculos financieros hasta simulaciones físicas. Incluye manejo de casos especiales, optimizaciones y ejemplos aplicados a escenarios reales, proporcionando una base sólida para el desarrollo de aplicaciones matemáticas en Go.