1. Funciones trigonométricas en Java

Cuando estudiamos el redondeo de números anteriormente, nos familiarizamos con la Mathclase y algunos de sus métodos. Ahora veremos esta clase con más detalle.

Como su nombre lo indica, la Mathclase 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
double sin(double d)
Devuelve el seno del ángulo d, en radianes
double cos(double d)
Devuelve el coseno del ángulo d, en radianes
double tan(double d)
Devuelve la tangente del ángulo d, en radianes
double asin(double d)
Devuelve el arcoseno
double acos(double d)
Devuelve el arcocoseno
double atan(double d)
Devuelve el arcotangente
double sinh(double d)
Devuelve el seno hiperbólico
double cosh(double d)
Devuelve el coseno hiperbólico
double tanh(double d)
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
double toRadians(double angdeg)
Convierte un ángulo de grados a radianes
double toDegrees(double angrad)
Convierte un ángulo de radianes a grados

Por cierto, además de los métodos, la Mathclase también tiene dos variables constantes (campos estáticos de la clase):

Constante Descripción
double Math.PI
La constante "Pi" es igual a3.141592653589793
double Math.E
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 Mathclase contiene los más comunes:

Método Descripción
double sqrt(double a)
raíz cuadrada dea
double cbrt(double a)
raíz cúbica dea
double pow(double a, double b)
exponenciación:ab
double exp(double a)
exponencial (número de Euler elevado a una potencia):ea
double log(double a)
logaritmo natural de a:ln(a)
double log10(double a)
logaritmo en base 10 de a:log10(a)
double log1p(double x)
logaritmo natural de x + 1:ln(x + 1)
double expm1(double x)
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: aa 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 bse 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 doublevariables 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 xes . 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-20log()110-20110-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 ifo 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 ifdeclaraciones y desea usar una notación más compacta. Comparemos:

Código Descripción
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Usando una if-elsedeclaración (la forma más larga de escribirla)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Uso del operador ternario Contras:
- código voluminoso
- los cálculos se realizan dos veces
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Esta es una gran manera de escribirlo, pero es un poco redundante.
int x = Math.min(x-5+y*20, x*x+y*y);
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-elseoperador 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.