Calculadora científica en Kotlin

Por Nestor Plasencia Prado
Calculadora científica en Kotlin

En este tutorial programaremos funciones trigonométricas de una calculadora científica, con la sintaxis de Kotlin, la alternativa cool de programación en Java.

Seguramente, recuerdas tus primeras clases de programación, aquellas donde solíamos programar la clásica calculadora. Pues bien, ahora iremos al siguiente nivel de este ejercicio programando las funciones que poseen las calculadoras científicas, como por ejemplo las funciones trigonométricas.

Si bien es cierto muchos lenguajes poseen una librería para realizar estos cálculos numéricos, pero hoy quiero enseñarte qué algoritmos se encuentran detrás de estas cajas negras. Realizaremos este ejercicio en el lenguaje de programación Kotlin, una alternativa a Java, que ejecuta todos los ejecutables en la clásica JVM.

Bien, ¡empecemos! En el lenguaje de programación Kotlin las funciones son mucho más fáciles de crear. Realicemos la siguiente comparación.

Java

public static double sum(double A, double b) {
  return a+b;
}

Kotlin

fun sum( a: Double, b: Double): Double {
  return a+b
}

La sintaxis de Kotlin es muy parecida a muchos lenguajes de programación amigables como Python y javascript, sin dejar de ser un lenguaje de tipado estático.

Incluso en esta función posee una sentencia la declaración se puede reducir, prescindiendo de la keyword return y de las llaves.

fun sum( a: Double, b: Double): Double = a+b

Así podremos crear nuestras funciones aritméticas básicas de una manera más rápida.

fun sum( a: Double, b: Double): Double = a + b
fun rest( a: Double, b: Double): Double = a - b
fun mult( a: Double, b: Double): Double = a * b
fun div( a: Double, b: Double): Double = a / b

Potencia

La lógica de esta operación nos dice que debemos multiplicar el número de veces del segundo parámetro al primer parámetro.

fun pot( a: Double,  b: Int): Double {
  var result:Double = 1.0
  for(i in 1..b)
    result = result*a
  return result
}

En la variable result se van almacenando, las multiplicaciones sucesivas que realiza el primer parámetro a si mismo. Aquí vemos que la sintaxis de Kotlin nos permite utilizar, si deseamos o no, los corchetes para delimitar un bloque, la sintaxis del bucle for también es mucho más legible.

Ahora para que puedas testear el resultado de la función creada, deberás crear una función main.

fun main(args: array) {
  println(pot(2.0,5))
}

Factorial

Esta operación es resultado de multiplicar a un número por todos los números enteros positivos menores a el.

fun fact( a: Int): Double {
  var result:Double = 1.0
  for(i in a downTo 1)
    result = result*i
  return result
}

El valor del factorial se va acumulando en la variable result.

En el bucle utilizado en esta función, para realizar un recorrido descendente desde a hasta 1 se utiliza la keyword downTo.

Esta función también puedes probarla en la función main .

println(pot(2.0,5))

Aproximaciones Matemáticas

La forma en que los computadores calculan las funciones trigonométricas, son aproximaciones realizadas mediante el uso de la serie de Taylor.

La serie de McLaurin es el caso particular donde a = 0.

 Basándose en esta serie se generan las series geométricas que dan lugar a los cálculos de las funciones trigonométricas. En este tutorial programaremos 3 funciones exp(x), sin(x) y cos(x).

exp(x)

La serie que define esta función es la siguiente:

Programemos esta serie hasta un número determinado por ejemplo 40.

fun exp( x: Double): Double {
  var result:Double = 0.0
  for(n in 0..40)
    result = result+(pot(x,n)/fact(n))
  return result
}

Mientras más alto sea en número de iteraciones la respuesta será más precisa, pero llega un punto en que una iteración más no altera el resultado y cualquier iteración extra será un desperdicio computacional. Para solucionar esto crearemos crearemos un condicional que comparar el resultado actual con el anterior, si son iguales entonces terminará el proceso iterativo.

fun exp( x: Double): Double{
  var result:Double = 0.0
  for(n in 0..40){
    val anterior = result
    result = result+(pot(x,n)/fact(n))
    if (anterior == result) break
  }
  return result
}

Esta función también puedes probarla en la función main.

println(exp(1))

sin(x)

La serie que define esta función es la siguiente:

Programemos esta serie hasta al igual que en el anterior con un condicional.

fun sin( x: Double): Double{
  var result:Double = 0.0
  for(n in 0..40){
    val anterior = result
    result = result+(pot(-1.0,n)/fact(2*n+1)*pot(x,2*n+1))
    if (anterior == result) break
  }
  return result
}

Esta función también puedes probarla en la función main.

println(sin(3.14159265/2)) // sin(Pi/2) = 1

cos(x)

La serie que define esta función es la siguiente:

Programemos esta serie hasta al igual que en el anterior con un condicional.

fun sin( x: Double): Double{
  var result:Double = 0.0
  for(n in 0..40){
    val anterior = result
    result = result+(pot(-1.0,n)/fact(2*n)*pot(x,2*n))
    if (anterior == result) break
  }
  return result
}

Esta función también puedes probarla en la función main.

println(sin(3.14159265)) // sin(Pi) = 1

Recuerda que en DevCode ya están abiertas las inscripciones para el Curso Gratuito de Fundamentos de Kotlin. Además tenemos muchos otros cursos que complementarán tu aprendizaje. No olvides compartir el tutorial con tus amigos y dejarnos tus dudas u opiniones en la caja de comentarios.

¿Te gustó el tutorial?

Ayúdanos a llegar a más personas

Nestor Plasencia Prado

Nestor Plasencia Prado

Programmer | Developer | Maker | Robot Designer | Knowmad