Clase Math api Java.
Funciones matemáticas
(trigonométricas, log, etc.) Redondeo round, floor, ceil
FUNCIONES CLASE MATH JAVA
En cuanto a las funciones matemáticas en Java, las funciones disponibles vienen definidas en la clase Math.
Hay muchas funciones disponibles. Se puede consultar la lista completa en la documentación oficial del API de
Java (según versión de Java en uso, por ejemplo para la versión 8
ver [Link] ).
A continuación, mostraremos las funciones más importantes y ejemplos de uso:
Función matemática Significado Ejemplo de uso Resultado
abs Valor absoluto int x = [Link](2.3); x = 2;
atan Arcotangente double x = [Link](1); x = 0.78539816339744;
sin Seno double x = [Link](0.5); x = 0.4794255386042;
cos Coseno double x = [Link](0.5); x = 0.87758256189037;
tan Tangente double x = [Link](0.5); x = 0.54630248984379;
exp Exponenciación neperiana double x = [Link](1); x = 2.71828182845904;
log Logaritmo neperiano double x = [Link](2.7172); x = 0.99960193833500;
pow Potencia double x = [Link](2.3); x = 8.0;
round Redondeo double x = [Link](2.5); x = 3;
random Número aleatorio double x = [Link](); x = 0.20614522323378;
floor Redondeo al entero menor double x = [Link](2.5); x = 2.0;
ceil Redondeo al entero mayor double x = [Link](2.5); x = 3.0;
Destacar que las funciones matemáticas, al pertenecer a la clase Math, se
invocan siempre de la siguiente manera: [Link](argumentos).
Las funciones relacionadas con ángulos (atan, cos, sin, tan, etc.) trabajan en
radianes. Por tanto, para operar con grados, tendremos que realizar la
conversión oportuna. La propia clase Math facilita los métodos : toRadians para
transformar grados sexagesimales en radianes y toDegrees para transformar
radianes en grados sexagesimales, aunque las conversiones pueden no ser
totalmente precisas. Por ejemplo cos(toRadians(90.0)) debería devolver 0, pero
es probable que devuelva un valor aproximadamente cero pero no exactamente
cero debido a que la precisión decimal no es absoluta.
La función :random, permite generar números aleatorios en el rango ]0,1[. Por
tanto el 0 y el 1 están excluidos.
La función exponenciación neperiana o exponenciación de e, matemáticamente
significa ex, que en Java sería [Link](x),donde x es un número real y la base
es la constante neperiana e = 2.7172...
La función logaritmo neperiano, matemáticamente significa Ln x, que en Java
correspondería a la expresión [Link](x).
La función potencia, matemáticamente significa baseexponente, que en Java se
convertiría en [Link](base,exponente),donde base y exponente son
números reales, por lo tanto, si queremos obtener la raíz cubica de 2,la
instrucción sería [Link](2,0.333).
No hay una función directa para obtener la parte entera de un número real,
pero para estos casos, se puede obtener de la siguiente manera:
int x = (int)(8.7); --> x = 8;
int x = (int)(-8.7); --> x = -8;
Aclarar que obtener la parte entera es distinto a redondear.
Si vas a trabajar con constantes físicas o matemáticas, te resultará de interés la
instrucción final para la declaración de constantes. La ventaja de declarar una
constante en vez de una variable, consiste en que la constante no puede variar
en el transcurso del programa. Por tanto, se impide que por error pueda tener
un valor no válido en un momento dado. Las constantes facilitan la
documentación del programa y lo hacen fácil de modificar. Una declaración tipo
de constante podría ser la siguiente:
final double pi = 3.14159265358979;
Sin embargo, el propio Java tiene una constante propia para definir la
constante matemática PI: [Link]
El siguiente programa, mostrará su uso en la conversión de un angulo
sexagesimal a radianes.
/* Ejemplo de clase java usando la constante PI de la clase Math –
[Link] */
public class Programa {
public static void main(String args[]) {
double sexagesimal = 30;
double radianes = [Link]/180 * sexagesimal;
[Link]("Angulo en radianes : "+radianes);
}
}
DIFERENCIA ENTRE ROUND, CEIL Y FLOOR
Las funciones round, ceil y floor se usan para obtener un entero próximo a un
número decimal y tienen similitudes, de hecho en algunos casos devuelven el
mismo resultado. Sin embargo también tienen diferencias que es interesante
conocer. Estas tres funciones se aplican sobre valores numéricos decimales y
retornan un valor numérico que en el caso de round es un entero long, mientras
que en el caso de floor y ceil retornan un valor de tipo double coincidente o
equivalente con un entero.
El método round redondea siempre al entero más próximo, por ejemplo 2.6
redondea a 3 mientras que -2.6 redondea a -3. Si el decimal está exactamente
entre dos valores se redondea al entero superior más próximo (por ejemplo 2.5
redondea a 3 y -2.5 redondea a -2).
El método floor diremos que devuelve el entero menor, por ejemplo 2.9
quedaría en 2.0 y -2.9 quedaría en -3.0. También 2.1 quedaría en 2.0 y -2.1
quedaría en -3.0.
El método ceil diremos que devuelve el entero mayor, por ejemplo 2.9 quedaría
en 3.0 y -2.9 quedaría en -2.0. También 2.1 quedaría a 3.0 y -2.1 quedaría en -
2.0.
En cada programa deberemos determinar qué método es el adecuado para
obtener los resultados deseados. Por ejemplo, si tenemos que redondear
cantidades de dinero parece más lógico utilizar round. En cambio, si estamos
trabajando con edades de una persona en años utilizando decimales, podremos
razonar de otra manera. La edad de una persona es un valor positivo (no es
posible que tome valores negativos). Una persona decimos que tiene x años
mientras no cumpla x+1 años, de modo que en todo el periodo intermedio
decimos que tiene x años. Por ejemplo, si cumplo 35 años el 4 de febrero de
2096, desde el 4 de febrero de 2096 hasta el 3 de febrero de 2097 diré que
tengo 35 años. Pero en un programa que trabaje con decimales, en el punto
intermedio entre estas dos fechas tendría 35.50 años. Si quiero obtener el valor
que representa la edad a partir del valor decimal, lo lógico será utilizar el
método floor porque nos devolverá 35 para todos los valores decimales entre
35 y 36, tal y como expresamos en el lenguaje natural las edades. En este caso
tanto round como ceil no ofrecerían un resultado adecuado a nuestros
intereses.
Escribe este código y comprueba sus resultados:
Algunos Métodos de la Clase Math.
Método. Descripción.
abs(double a) Devuelve el valor absoluto de un valor double introducido como parámetro.
abs(float a) Devuelve el valor absoluto de un valor float introducido como parámetro.
abs(int a) Devuelve el valor absoluto de un valor Entero introducido como parámetro.
abs(long a) Devuelve el valor absoluto de un valor long introducido como parámetro.
acos(double a) Devuelve el arco coseno de un valor introducido como parámetro.
addExact(int x, int y) Devuelve la suma de sus argumentos, lanzando una excepción si el resultado d
addExact(long x, long y) Devuelve la suma de sus argumentos, lanzando una excepción si el resultado s
long.
asin(double a) Devuelve el arco seno de un valor introducido.
atan(double a) Devuelve el arco tangente de un valor introducido.
cbrt(double a) Devuelve la raíz cúbica de un doublevalor.
cos(double a) Devuelve el coseno trigonométrico de un ángulo.
exp(double a) Devuelve el número e de Euler elevado a la potencia de un doublevalor.
log(double a) Devuelve el logaritmo natural (base e ) de un double valor.
log10(double a) Devuelve el logaritmo de base 10 de un doublevalor.
max(double a, double b) Devuelve el mayor de dos valores double
max(float a, float b) Devuelve el mayor de dos valores float.
max(int a, int b) Devuelve el mayor de dos valores Enteros.
max(long a, long b) Devuelve el mayor de dos valores long.
min(double a, double b) Devuelve el menor de dos valores double.
min(float a, float b) Devuelve el menor de dos valores float.
min(int a, int b) Devuelve el menor de dos valores enteros.
min(long a, long b) Devuelve el menor de dos valores long.
multiplyExact(int x, int y) Devuelve el producto de los argumentos, lanzando una excepción si el resultad
int.
multiplyExact(long x, long Devuelve el producto de los argumentos, lanzando una excepción si el resultad
y) long.
pow(double a, double b) Devuelve el valor del primer argumento elevado a la potencia del segundo argu
random() Devuelve un doublevalor con un signo positivo, mayor o igual que 0.0 y meno
round(double a) Devuelve el long redondeado más cercano al double introducido.
round(float a) Devuelve el int mas cercano y redondeado al float introducido.
sin(double a) Devuelve el seno trigonométrico de un ángulo.
sqrt(double a) Devuelve la raíz cuadrada positiva correctamente redondeada de un doublevalo
tan(double a) Devuelve la tangente trigonométrica de un ángulo.
Ejemplo de programa java que usa la clase Math.
En el siguiente ejemplo de programa java utilizamos la clase Math para realizar algunos
cálculos y operaciones. También aprovechamos y utilizamos la clase Decimalformat para
presentar con formato uno de los resultados que nos dan, de esta manera vamos practicando
y afianzando lo que vamos aprendiendo durante el curso de java.
0
1 package clasemath;
2
3 import [Link];
4 /**
5 *
6 * @author [Link]
7 */
8 public class ClaseMath {
9
10 public static String metodoForm ( String patron, double dato) {
11 DecimalFormat objDF = new DecimalFormat (patron);
12 String result = [Link] (dato);
13 return result;
14 }
15
16 public static void main(String[] args) {
17 double num1 = -10.570;
18 double num2 = 4.10;
19 int num3 = 10;
20 int num4 = 38;
21 double dato;
22
23 [Link] ("El valor absoluto de %.3f es %.2f %n", num1, [Link](num1));
24
25 [Link] ("El máximo de %d y %d es %d %n", num3, num4, [Link] (num3, num4));
26
27 [Link] ("El mínimo de %d y %d es %d %n", num3, num4, [Link] (num3, num4));
28
29 [Link] ("El valor de e es %.4f %n", Math.E);
30
31 [Link] ("exp (%d) es %.3f %n",num3, [Link] (num3));
32
33 [Link] ("log (%d) es %.3f %n", num4, [Link] (num4));
34
35 [Link] ("%.2f elevado a %d es %f %n", num2, num3, dato = [Link] (num2, num3));
36
37 [Link]("Que con formato es: %n " +metodoForm("###,###.##",dato )+"%n");
38
39 [Link] ("La raiz cuadrada de (%.2f) es %.2f %n", num2, [Link] (num2));
40 }
41 }
42
En consola tendriamos los siguientes resultados:
Método random() de la clase Math.
El método random podemos utilizarlo para generar números al azar. El rango o margen
con el que trabaja el método random oscila entre 0.0 y 1.0 (Este último no incluido).
Por lo tanto, para generar un número entero entre 0 y 9, Hay que escribir la siguiente
sentencia:
0
1 int numero = (int) ([Link] () * 10);
2
De esta manera al multiplicar el valor por 10, el rango de valores posibles se convierte en:
0
1 0.0 <= numero < 10.0
2
Para finalizar Podeis ver un ejemplo de programa java que utiliza el método random de
la clase Math en esta página.
La clase Math
Clases y objetos
Miembros dato constantes
Funciones miembro
Cálculo del número irracional
La clase Math tiene miembros dato y funciones miembro estáticas, vamos a
conocer algunas de estas funciones, cómo se llaman y qué tarea realizan.
Miembros dato constantes
La clase Math define dos constantes muy útiles, el número y el número e.
public final class Math {
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
//...
}
El modificador final indica que los valores que guardan no se pueden cambiar,
son valores constantes
Se accede a estas constantes desde la clase Math, de la siguiente forma
[Link]("Pi es " + [Link]);
[Link]("e es " + Math.E);
Funciones miembro
La clase Math define muchas funciones y versiones distintas de cada función.
Por ejemplo, para hallar el valor absoluto de un número define las siguientes
funciones. Se llama a una u otra dependiendo del tipo de dato que se le pasa en su
único argumento.
public final class Math {
public static int abs(int a) {
return (a < 0) ? -a : a;
}
public static long abs(long a) {
return (a < 0) ? -a : a;
}
public static float abs(float a) {
return (a < 0) ? -a : a;
}
public static double abs(double a) {
return (a < 0) ? -a : a;
}
//...
}
Por ejemplo, hallar el valor absoluto de los siguientes números
int i = -9;
double x = 0.3498;
[Link]("|" + i + "| es " + [Link](i));
[Link]("|" + x + "| es " + [Link](x));
[Link](i), llama a la primera versión, y [Link](x) llama a la última versión.
Funciones trigonométricas
En las funciones trigonométricas los argumentos se expresan en radianes. Por
ejemplo, el ángulo 45º se convierte en radianes y luego se halla el seno, el coseno
y la tangente
double angulo = 45.0 * [Link]/180.0;
[Link]("cos(" + angulo + ") es " + [Link](angulo));
[Link]("sin(" + angulo + ") es " + [Link](angulo));
[Link]("tan(" + angulo + ") es " + [Link](angulo));
Para pasar de coordenadas rectangulares a polares es útil la función atan2, que
admite dos argumentos, la ordenada y la abscisa del punto. Devuelve el ángulo
en radianes.
double y=-6.2; //ordenada
double x=1.2; //abscisa
[Link]("atan2(" + y+" , "+x + ") es " + Math.atan2(y,
x));
Funciones exponencial y logarítmica
La función exponencial exp devuelve el número e elevado a una potencia
[Link]("exp(1.0) es " + [Link](1.0));
[Link]("exp(10.0) es " + [Link](10.0));
[Link]("exp(0.0) es " + [Link](0.0));
La función log calcula el logaritmo natural (de base e) de un número
[Link]("log(1.0) es " + [Link](1.0));
[Link]("log(10.0) es " + [Link](10.0));
[Link]("log(Math.E) es " + [Link](Math.E));
Función potencia y raíz cuadrada
Para elevar un número x a la potencia y, se emplea pow(x, y)
[Link]("pow(10.0, 3.5) es " + [Link](10.0,3.5));
Para hallar la raíz cuadrada de un número, se emplea la función sqrt
[Link]("La raíz cuadrada de " + x + " is " +
[Link](x));
Aproximación de un número decimal
Para expresar un número real con un número especificado de números decimales
empleamos la función round. Por ejemplo, para expresar los números x e y con
dos cifras decimales escribimos
double x = 72.3543;
double y = 0.3498;
[Link](x + " es aprox. " +
(double)[Link](x*100)/100);
[Link](y + " es aprox. " +
(double)[Link](y*100)/100);
Se obtiene 72.35 y 0.35 como cabría esperar. Fijarse que round devuelve un
número entero int que es necesario promocionar a double para efectuar la
división entre 100.
Si empleamos la función floor en vez de round obtendríamos
[Link](x + " es aprox. " + [Link](x*100)/100);
[Link](y + " es aprox. " + [Link](y*100)/100);
Se obtiene 72.35 y 0.34. La aproximación del primero es correcta ya que la
tercera cifra decimal es 4 inferior a 5. La aproximación del segundo es incorrecta
ya que la tercera cifra decimal es 9 mayor que 5. En la mayor parte de los
cálculos se cometen errores, por lo que la diferencia entre floor y round no es
significativa.
El mayor y el menor de dos números
Para hallar el mayor y el menor de dos números se emplean las
funciones min y max que comparan números del mismo tipo.
int i = 7;
int j = -9;
double x = 72.3543;
double y = 0.3498;
// para hallar el menor de dos número
[Link]("min(" + i + "," + j + ") es " + [Link](i,j));
[Link]("min(" + x + "," + y + ") es " + [Link](x,y));
// Para hallar el mayor de dos números
[Link]("max(" + i + "," + j + ") es " + [Link](i,j));
[Link]("max(" + x + "," + y + ") es " + [Link](x,y));
Números aleatorios
La clase Math define una función denominada random que devuelve un número
pseudoaleatorio comprendido en el intervalo [0.0, 1.0). Existe otra alternativa, se
pueden generar números pseudoaleatorios a partir de un objeto de
la clase Random, que llame a la función miembro nextDouble.
[Link]("Número aleatorio: " + [Link]());
[Link]("Otro número aleatorio: " + [Link]());
Cálculo del número irracional
Para hallar la longitud de una circunferencia de radio R, primero se calcula el
perímetro de un triángulo equilátero (3 lados) inscrito en dicha circunferencia,
luego, de un hexágono (6 lados), un dodecágono (12 lados), y así sucesivamente.
El límite de la sucesión de perímetros es precisamente la longitud de la
circunferencia 2 R.
Si tomamos una circunferencia de radio unidad, al dividir entre dos los valores de
los perímetros iremos obteniendo las sucesivas aproximaciones del número
irracional .
A partir de la figura, podemos calcular la longitud
del lado an un polígono regular de n lados inscrito
en la circunferencia de radio R, (en color rojo).
Del mismo modo, obtenemos la longitud del lado
de un polígono regular inscrito de 2n lados (en
color azul).
Teniendo en cuanta que
Establecemos la relación entre an y a2n y por tanto, entre el perímetro Pn del
polígono regular de n lados y el perímetro P2n del polígono regular de 2n lados.
Tomando como radio R, la unidad
Para un triángulo, n=3, la longitud del lado es a3=2sen60º, y el
perímetro
Para un hexágono, n=6, la longitud del lado es a6=2sen30º=1, y el
perímetro P6=6.
y así sucesivamente.
Para obtener las sucesivas aproximaciones del número irracional mediante la
fórmula anterior procedemos del siguiente modo
1. Partimos del valor del perímetro P de un triángulo equilátero inscrito en
una circunferencia de radio unidad, el valor de n es 3.
2. Calculamos el perímetro P de un polígono de 2n lados a partir del valor del
perímetro de un polígono regular de n lados.
3. El valor obtenido P será el valor del perímetro de un polígono regular
de n=2n lados.
4. Se imprime el valor de P dividido entre dos (aproximación de )
5. Se vuelve al paso 2.
Ahora, hemos de trasladar las fórmulas matemáticas a código, y aquí es donde
podemos llevarnos algunas sorpresas.
En primer lugar, hemos de tener en cuenta que la expresión es
matemáticamente equivalente a pero no lo es cuando trabajamos con
números en el ordenador.
Por ejemplo si n es tipo de dato int. Al evaluar el denominador en la primera
expresión obtenemos el cuadrado de n que crece muy rápidamente con n,
sobrepasándose (overflow) el valor máximo que puede guardar una variable
entera dado por Integer.MAX_VALUE. Integer es la clase que describe los números
enteros. Por tanto, al realizar los cálculos en el ordenador es aconsejable emplear
la segunda expresión en vez de la primera, incluso si cambiamos el tipo de dato
de n de int a long.
El cálculo de implica un número infinito de iteracciones, ya que como hemos
visto no es posible al sobrepasarse el valor máximo que puede guardar una
variable entera, nuestra primera intención sería la programar un bucle que realice
el máximo número de iteracciones
double perimetro=3*[Link](3); //triángulo equilátero inscrito
long n=3;
int i=0; //número de iteracciones
while(n<Long.MAX_VALUE){
perimetro=2*n*[Link]([Link](4.0-
(perimetro/n)*(perimetro/n)));
n=2*n;
i++;
[Link](i+" -- "+perimetro/2);
}
Con cierta sorpresa observamos la salida del programa cuando se ha completado
el bucle, se imprime un cero, en vez de 3.14159265358979323846.
Si observamos las 30 primeras iteracciones vemos, tal como se muestra en la
figura inferior, que la valor más próximo a se obtiene en las iteracciones 13, 14,
15, y 16.
while(i<30){
//...
}
La conclusión final, es que hemos de tener mucho cuidado al trasladar las
fórmulas matemáticas a código. Los datos de tipo predefinido solamente pueden
guardar valores entre un máximo y un mínimo, tal como hemos visto en su
definició[Link] otra parte, una variable de tipo double tiene una precisión limitada
por lo que no representa a todos los números reales sino a un conjunto fin