La clase Math

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

ésta clase representa la librería matemática de Java. El constructor de la clase es privado, por lo que no se puedenn crear instancias de la clase. Sin embargo, Math es una clase publica, para que pueda ser llamada desde cualquier sitio, y estática, para que no haya que inicializarla.

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)

Subir

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 usos

Math.E = 2.718281828459045
Math.PI = 3.141592653589793
Subir

Conversión entre ángulos y radianes

Tenemos dos métodos para relizar esta tarea: "Mat.toRadians" para pasar a radianes y "Mat.toDegrees" para pasar a grados.

Veamos un ejemplo. Si escribimos:

double angGrados=45;

double angRadianes=Math.toRadians(angGrados);
System.out.println("De Grados a Radianes: "+angGrados+"º = "+angRadianes+" rad");

angGrados=Math.toDegrees(angRadianes);
System.out.println("De Radianes a Grados: "+angRadianes+"rad = "+angGrados+"º");

El resultado sería este:

De Grados a Radianes: 45.0º = 0.0.7853981633974483rad
De Radianes a Grados: 0.7853981633974483rad = 45.0º
Subir

Fuciones Trigonométricas

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

Ejemplo de conversiones:

double valor = 0;

double angulo = 45;
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 + "º");

El resultado será:

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º
Subir

Transformación de coordenadas

Para resolver la conversión de un sistema a otro, se pueden utilizar las formulas, con las que transformamos coordenadas rectangulares a coordenadas polares:

pero hay que hacer varios cálculos intermedios, por lo que la función atan2 y hypot 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 + "º");

El resultao obtenido sería:

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

Funciones matemáticas

Para resumir, aquí muestro una tabla con los métodos de la clase Math más usados:

Math.abs(x) devuelve el valor absoluto
Math.sin(double a) devuelve el seno del ángulo "a" en radianes
Math.cos(double a) devuelve el coseno del ángulo "a" en radianes
Math.tan(double a) devuelve la tangente del ángulo "a" en radianes
Math.asin(double r) devuelve el ángulo cuyo seno es "r"
Math.acos(double r) devuelve el ángulo cuyo coseno es "r"
Math.atan(double r) devuelve el ángulo cuya tangente es "r"
Math.atan2(double a, double b) devuelve el ángulo cuya tangente es "a/b"
Math.exp(double x) devuelve "e" elevado a "x"
Math.log(double x) devuelve el logaritmo natural de "x"
Math.sqrt(double x) devuelve la raíz cuadrada de "x"
Math.ceil(double a) devuelve el número completo más pequeño mayor o igual que "a"
Math.floor(double a) devuelve el número completo más grande menor o igual que "a"
Math.rint(double a) devuelve el valor double truncado de "a"
Math.pow(double x, double y) devuelve "y" elevado a "x"
Math.round(x) para double y float
Math.random() devuelve un double aleatorio
Math.max(a,b) devuelve el valor máximo entre los introducidos
Math.min(a,b) devuelve el valor mínimo entre los introducidos
Math.E devuelve el valor del número e
Math.PI devuelve el valor del número Pi
Subir