1. Funciones trigonométricas en Java
Cuando estudiamos el redondeo de números anteriormente, nos familiarizamos con la Math
clase y algunos de sus métodos. Ahora veremos esta clase con más detalle.
Como su nombre lo indica, la Math
clase contiene métodos para las operaciones matemáticas más utilizadas por los programadores. Aquí están los más interesantes:
Método | Descripción | |
---|---|---|
|
Devuelve el seno del ángulo d , en radianes |
|
|
Devuelve el coseno del ángulo d , en radianes |
|
|
Devuelve la tangente del ángulo d , en radianes |
|
|
Devuelve el arcoseno | |
|
Devuelve el arcocoseno | |
|
Devuelve el arcotangente | |
|
Devuelve el seno hiperbólico | |
|
Devuelve el coseno hiperbólico | |
|
Devuelve la tangente hiperbólica |
Los métodos , y toman un ángulo expresado en radianes. Para convertir un ángulo de grados a radianes y viceversa, la clase ofrece dos métodos especiales:Math.sin()
Math.cos()
Math.tan()
Math
Método | Descripción |
---|---|
|
Convierte un ángulo de grados a radianes |
|
Convierte un ángulo de radianes a grados |
Por cierto, además de los métodos, la Math
clase también tiene dos variables constantes (campos estáticos de la clase):
Constante | Descripción |
---|---|
|
La constante "Pi" es igual a3.141592653589793 |
|
La constante "E" es igual a2.718281828459045 |
Todas estas funciones pueden serte muy útiles si decides escribir tus propios juegos, trabajar con gráficos o simplemente calcular la longitud de un camino en un mapa.
Por ejemplo, si desea calcular sin(45°)
, así es como lo hace:
Math.sin( Math.toRadians(45) )
Aquí hay un ejemplo:
public class Main
{
public static int N = 10;
public static void drawValue(double y)
{
int value = (int) (y * N) + N;
for (int i = 0; i < 2 * N; i++)
{
char c = i == N ? '|': '.';
if (i == value)
c = '*';
System.out.print(c);
}
System.out.println();
}
public static void main(String[] args)
{
for (int i = 0; i < 10 * N; i++)
{
double x = i * 1.0 / N;
double y = Math.sin(x);
drawValue(y);
}
}
}
2. Funciones algebraicas en Java
En la mayoría de los casos, las matemáticas de la escuela secundaria son suficientes para un programador: incluso los senos y los cosenos rara vez se encuentran en el código. La mayoría de las veces se necesitan cuando se trabaja con juegos, mapas o motores de juegos. El 90% de los programadores nunca encuentran esto.
Pero además de la geometría, los programadores a veces tienen que usar funciones algebraicas. Y, por supuesto, la Math
clase contiene los más comunes:
Método | Descripción |
---|---|
|
raíz cuadrada dea |
|
raíz cúbica dea |
|
exponenciación:ab |
|
exponencial (número de Euler elevado a una potencia):ea |
|
logaritmo natural de a :ln(a) |
|
logaritmo en base 10 de a :log10(a) |
|
logaritmo natural de x + 1 :ln(x + 1) |
|
ex-1 |
Si quieres la raíz cuadrada o cúbica de un número, los métodos sqrt(a)
y cbrt(a)
están a tu servicio.
La raíz cuadrada se puede calcular de la siguiente manera:
Math.sqrt(2)
Si desea obtener una raíz de una potencia superior, utilice el método de exponenciación: a
a la potencia de ¼
es la cuarta raíz, etc.
Math.pow(2, 0.25)
Para logaritmos y exponentes, existen los métodos log(a)
(logaritmo natural) y exp(x)
(exponencial). Para calcular el logaritmo en base 10, tenemos log10(a)
.
Si desea que el logaritmo de un número b
se base a
, use esta fórmula simple:loga(b) = ln(b) / ln(a)
Métodos útiles
Si está realizando cálculos que involucran valores muy pequeños de x
, entonces las últimas dos funciones, log1p()
y expm1()
, pueden serle útiles.
Al agregar double
variables muy pequeñas y muy grandes, a menudo encontrará que los valores muy pequeños simplemente se ignoran (se descartan) como insignificantes. De hecho, esto sucederá si usa los métodos log()
y exp()
. Para resolver esto, los programadores idearon funciones que devuelven solo la "pequeña parte significativa"
Ejemplo:
Suponga que desea calcular el logaritmo natural de 1 + x
, donde x
es . No puedes simplemente pasar este número al método, ya que si sumas y , obtienes . es un número tan pequeño que se descartará por completo cuando se sumen los números.10-20
log()
1
10-20
1
10-20
Debido a que las matemáticas a menudo implican calcular la log()
cantidad de números cercanos a 1
, los programadores idearon una forma de sortear este problema: en lugar de pasar el número en sí al método, pase solo su diferencia de 1
.
3. Mínimo y máximo
Otras dos funciones útiles son min(a, b)
y max(a, b)
. Como probablemente ya hayas adivinado, el primero devuelve el mínimo de dos números:
Math.min(a, b)
Y el segundo devuelve el máximo de dos números:
Math.max(a, b)
¿Por qué necesitamos estas funciones cuando siempre puedes escribir if
o incluso usar el operador ternario (a < b ? a: b)
?
Se trata de la legibilidad del código. A veces, su código está sobrecargado con if
declaraciones y desea usar una notación más compacta. Comparemos:
Código | Descripción |
---|---|
|
Usando una if-else declaración (la forma más larga de escribirla) |
|
Uso del operador ternario Contras: - código voluminoso - los cálculos se realizan dos veces |
|
Esta es una gran manera de escribirlo, pero es un poco redundante. |
|
Justo 🙂 |
4. Mínimo y máximo de varios números
Hay otra gran manera de usar los métodos min()
y max()
.
Para calcular el mínimo (o máximo) de varios números o variables. Es muy conveniente realizar llamadas anidadas a estos métodos.
Aquí se explica cómo encontrar el mínimo de 3 números:
Math.min(a, Math.min(b, c))
¿Así que lo que? Es súper conveniente: calcule el mínimo de dos números y luego devuelva el mínimo de este número y el tercer número.
El mínimo de cuatro números se obtiene de la misma forma:
Math.min(a, Math.min(b, Math.min(с, d)))
Dicho esto, podemos escribir esta fórmula un poco más claramente:
Math.min(Math.min(a, b), Math.min(c, d))
Todo funciona igual para el max()
método.
Usar el if-else
operador o el operador ternario haría que estos fragmentos de código fueran un poco más engorrosos. Pero usar los métodos min()
y max()
es simplemente perfecto.