0% encontró este documento útil (0 votos)
382 vistas

Clase Math API Java

La clase Math de Java proporciona funciones matemáticas como funciones trigonométricas, logaritmos y redondeo. Algunas funciones importantes incluyen abs, sin, cos, exp y log. Estas funciones se invocan estáticamente a través de Math, como Math.abs() o Math.sin().
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
382 vistas

Clase Math API Java

La clase Math de Java proporciona funciones matemáticas como funciones trigonométricas, logaritmos y redondeo. Algunas funciones importantes incluyen abs, sin, cos, exp y log. Estas funciones se invocan estáticamente a través de Math, como Math.abs() o Math.sin().
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 13

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 http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html ).

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 = Math.abs(2.3); x = 2;

atan Arcotangente double x = Math.atan(1); x = 0.78539816339744;

sin Seno double x = Math.sin(0.5); x = 0.4794255386042;

cos Coseno double x = Math.cos(0.5); x = 0.87758256189037;

tan Tangente double x = Math.tan(0.5); x = 0.54630248984379;

exp Exponenciación neperiana double x = Math.exp(1); x = 2.71828182845904;

log Logaritmo neperiano double x = Math.log(2.7172); x = 0.99960193833500;

pow Potencia double x = Math.pow(2.3); x = 8.0;

round Redondeo double x = Math.round(2.5); x = 3;

random Número aleatorio double x = Math.ramdom(); x = 0.20614522323378;

floor Redondeo al entero menor double x = Math.floor(2.5); x = 2.0;

ceil Redondeo al entero mayor double x = Math.ceil(2.5); x = 3.0;


Destacar que las funciones matemáticas, al pertenecer a la clase Math, se
invocan siempre de la siguiente manera: Math.funcion(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 Math.exp(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 Math.log(x).
La función potencia, matemáticamente significa baseexponente, que en Java se
convertiría en Math.pow(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 Math.pow(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: Math.PI
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 –
aprenderaprogramar.com */
public class Programa {
public static void main(String args[]) {
double sexagesimal = 30;
double radianes = Math.PI/180 * sexagesimal;
System.out.println("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 java.text.DecimalFormat;
4 /**
5 *
6 * @author codesitio.com
7 */
8 public class ClaseMath {
9
10 public static String metodoForm ( String patron, double dato) {
11 DecimalFormat objDF = new DecimalFormat (patron);
12 String result = objDF.format (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 System.out.printf ("El valor absoluto de %.3f es %.2f %n", num1, Math.abs(num1));
24
25 System.out.printf ("El máximo de %d y %d es %d %n", num3, num4, Math.max (num3, num4));
26
27 System.out.printf ("El mínimo de %d y %d es %d %n", num3, num4, Math.min (num3, num4));
28
29 System.out.printf ("El valor de e es %.4f %n", Math.E);
30
31 System.out.printf ("exp (%d) es %.3f %n",num3, Math.exp (num3));
32
33 System.out.printf ("log (%d) es %.3f %n", num4, Math.log (num4));
34
35 System.out.printf ("%.2f elevado a %d es %f %n", num2, num3, dato = Math.pow (num2, num3));
36
37 System.out.printf("Que con formato es: %n " +metodoForm("###,###.##",dato )+"%n");
38
39 System.out.printf ("La raiz cuadrada de (%.2f) es %.2f %n", num2, Math.sqrt (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) (Math.random () * 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


System.out.println("Pi es " + Math.PI);
System.out.println("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;
System.out.println("|" + i + "| es " + Math.abs(i));
System.out.println("|" + x + "| es " + Math.abs(x));

Math.abs(i), llama a la primera versión, y Math.abs(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 * Math.PI/180.0;
System.out.println("cos(" + angulo + ") es " + Math.cos(angulo));
System.out.println("sin(" + angulo + ") es " + Math.sin(angulo));
System.out.println("tan(" + angulo + ") es " + Math.tan(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
System.out.println("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


System.out.println("exp(1.0) es " + Math.exp(1.0));
System.out.println("exp(10.0) es " + Math.exp(10.0));
System.out.println("exp(0.0) es " + Math.exp(0.0));

La función log calcula el logaritmo natural (de base e) de un número


System.out.println("log(1.0) es " + Math.log(1.0));
System.out.println("log(10.0) es " + Math.log(10.0));
System.out.println("log(Math.E) es " + Math.log(Math.E));

Función potencia y raíz cuadrada

Para elevar un número x a la potencia y, se emplea pow(x, y)


System.out.println("pow(10.0, 3.5) es " + Math.pow(10.0,3.5));

Para hallar la raíz cuadrada de un número, se emplea la función sqrt


System.out.println("La raíz cuadrada de " + x + " is " +
Math.sqrt(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;
System.out.println(x + " es aprox. " +
(double)Math.round(x*100)/100);
System.out.println(y + " es aprox. " +
(double)Math.round(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


System.out.println(x + " es aprox. " + Math.floor(x*100)/100);
System.out.println(y + " es aprox. " + Math.floor(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
System.out.println("min(" + i + "," + j + ") es " + Math.min(i,j));
System.out.println("min(" + x + "," + y + ") es " + Math.min(x,y));
// Para hallar el mayor de dos números
System.out.println("max(" + i + "," + j + ") es " + Math.max(i,j));
System.out.println("max(" + x + "," + y + ") es " + Math.max(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.
System.out.println("Número aleatorio: " + Math.random());
System.out.println("Otro número aleatorio: " + Math.random());
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*Math.sqrt(3); //triángulo equilátero inscrito
long n=3;
int i=0; //número de iteracciones
while(n<Long.MAX_VALUE){
perimetro=2*n*Math.sqrt(2.0-Math.sqrt(4.0-
(perimetro/n)*(perimetro/n)));
n=2*n;
i++;
System.out.println(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ón.Por 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

También podría gustarte