La clase java.lang.Math (I)

14Mar09

La clase java.lang.Math es una clase utilitaria cuyos métodos (todos estáticos) nos permiten realizar algunos cálculos matemáticos comunes.

Antiguamente Math implementaba cada uno de sus métodos, pero hoy en día hace uso de la clase java.lang.StrictMath para llevar adelante sus tareas, llegando al punto que prácticamente es lo mismo llamar a un método de Math como uno de StrictMath.

StrictMath utiliza librerías nativas (escritas en C) para realizar sus cálculos, asegurando entre otras cosas una mejor performance con números flotantes y repetibilidad de los resultados (si se llama un método con los mismos parámetros obtenemos exactamente el mismo resultado, bit a bit). Concretamente hace uso de la librería fdlibm (Freely Distributable Math Library) version 5.3 que es parte del proyecto netlib.

math

Constantes Matemáticas

Math tiene una referencia a las dos constantes más utilizadas en matemática con una precisión de 15 decimales (suficiente para la mayoría de los mortales). Si ejecutamos:

System.out.println("e = " + Math.E);
System.out.println("pi = " + Math.PI);

veremos:

e = 2.718281828459045
pi = 3.141592653589793

Conversiones Grados a Radianes, y viseversa

Tenemos dos métodos que realizan la tarea por nosotros:

double angGrados = 45; //grados

double angRadianes = Math.toRadians(angGrados);
System.out.println("Deg a Rad: " + angGrados + "º = " + angRadianes + " rad");

angGrados = Math.toDegrees(angRadianes);
System.out.println("Rad a Deg: " + angRadianes + " rad = " + angGrados + "º");

obteniendo al ejecutar:

Deg a Rad: 45.0º = 0.7853981633974483 rad
Rad a Deg: 0.7853981633974483 rad = 45.0º

Funciones Trigonométricas

Las funciones trigonométricas aceptan y devuelven los ángulos en radianes por lo que siempre hay que convertir desde/hacia grados.

Por ejemplo si ejecutamos:

double valor = 0;

double angulo = 45; //grados
double anguloRadianes = Math.toRadians(angulo);

valor = Math.cos(anguloRadianes);
System.out.println("Coseno de " + angulo + "º = " + valor);

valor = Math.sin(anguloRadianes);
System.out.println("Seno de " + angulo + "º = " + valor);

valor = Math.tan(anguloRadianes);
System.out.println("Tangente de " + angulo + "º = " + valor);

valor = 0.707;

anguloRadianes = Math.acos(valor);
angulo = Math.toDegrees(anguloRadianes);
System.out.println("Arco Coseno de " + valor + " = " + angulo + "º");

anguloRadianes = Math.asin(valor);
angulo = Math.toDegrees(anguloRadianes);
System.out.println("Arco Seno de " + valor + " = " + angulo + "º");

anguloRadianes = Math.atan(valor);
angulo = Math.toDegrees(anguloRadianes);
System.out.println("Arco Tangente de " + valor + " = " + angulo + "º");

tendremos un resultado similar al siguiente:

Coseno de 45.0º = 0.7071067811865476
Seno de 45.0º = 0.7071067811865475
Tangente de 45.0º = 0.9999999999999999
Arco Coseno de 0.707 = 45.008651662838º
Arco Seno de 0.707 = 44.991348337162016º
Arco Tangente de 0.707 = 35.2603107365587º

Funciones Hiperbólicas

Las funciones hiperbólicas están disponibles a partir de la versión 1.5 Aún no existe implementaciones para las funciones inversas (acosh, asinh y atanh)

Del siguiente ejemplo:

double valor = 0;
double x = 1.0;

valor = Math.cosh(x);
System.out.println("Coseno Hiperbolico de " + x + " = " + valor);

valor = Math.sinh(x);
System.out.println("Seno Hiperbolico de " + x + " = " + valor);

valor = Math.tanh(x);
System.out.println("Tangente Hiperbolica de " + x + " = " + valor);

obtenemos:

Coseno Hiperbolico de 1.0 = 1.543080634815244
Seno Hiperbolico de 1.0 = 1.1752011936438014
Tangente Hiperbolica de 1.0 = 0.7615941559557649

Paso de coordenadas rectangulares a polares

Para resolver la conversión de un sistema a otro, se pueden utilizar las formulas:

polares

pero hay que hacer varios cálculos intermedios, por lo que la función atan2 y hypot (disponible desde la versión 1.5) realizan el mismo proceso pero de una forma más óptima:

double x = 4.0;
double y = 3.0;

double r = Math.hypot(x, y);
double aRad = Math.atan2(y, x);
double a = Math.toDegrees(aRad);

System.out.println("Para x = " + x + "   y = " + y);
System.out.println("r = " + r);
System.out.println("a = " + a + "º");

obteniendo:

Para x = 4.0 y = 3.0
r = 5.0
a = 36.86989764584402º

Más Info

En el siguiente post veremos el resto de las funciones que la clase Math nos brinda.

Hasta entonces



13 Responses to “La clase java.lang.Math (I)”

  1. 1 Alejandra Rozo

    gracias!!!!!!!
    llevo un montón de tiempo tratando de resolver este problema con la precisión😛

  2. 2 Lucía

    muy bueno!!! lo estaba buscando y me ayudo mucho!!!!!

  3. Sin duda es el mejor post que e visto y el que mas me ha servido. Muchisimas gracias.

  4. gracias my buena info

  5. 5 Oscar Iván

    Gracias por la información, justo lo que necesito para completar mi calculadora, gracias de verdad.

  6. 6 Víctor Luna

    no puedo utilizar los arcos seno, arco coseno y arco tangente en netbeans en un aplicacion para celular, si alguien sabe como hacerlo le agradeceria que me lo envie a mi msn luna12d@hotmail.com
    Gracias de ante mano.

  7. 7 Víctor Luna

    Gracias por el aporte, ahora podre crear una calculadora para mi celular para mi examen de fisica que al profe no se le entiende ni madre. Gracias Men. Adios

  8. 8 a13xander

    Me sirvio mucho gracias.

  9. 9 Wuil

    Buen aporte

  10. Regreso para comentarle que me parecieron muy practicos estos tips matematicos sr LeFunes, como siempre usted dando en la tecla.
    Que no decaigan los posts!! veo pocos por mes, aunque es comprensible en esta epoca del año…je.

    Sigamos sacandole el jugo a este lenaguaje, saludos.


  1. 1 Matemáticas en Java
  2. 2 La clase java.lang.Math (I) | Buanzolandia
  3. 3 Bitacoras.com

A %d blogueros les gusta esto: