1. Funções trigonométricas em Java

Quando estudamos números de arredondamento anteriormente, nos familiarizamos com a Mathclasse e alguns de seus métodos. Veremos agora esta classe com mais detalhes.

Como o nome indica, a Mathclasse contém métodos para as operações matemáticas usadas com mais frequência pelos programadores. Aqui estão os mais interessantes:

Método Descrição
double sin(double d)
Retorna o seno do ângulo d, em radianos
double cos(double d)
Retorna o cosseno do ângulo d, em radianos
double tan(double d)
Retorna a tangente do ângulo d, em radianos
double asin(double d)
Retorna o arco-seno
double acos(double d)
Retorna o arco-seno
double atan(double d)
Retorna o arco tangente
double sinh(double d)
Retorna o seno hiperbólico
double cosh(double d)
Retorna o cosseno hiperbólico
double tanh(double d)
Retorna a tangente hiperbólica

Os métodos , e assumem um ângulo expresso em radianos. Para converter um ângulo de graus para radianos e vice-versa, a classe oferece dois métodos especiais:Math.sin()Math.cos()Math.tan()Math

Método Descrição
double toRadians(double angdeg)
Converte um ângulo de graus para radianos
double toDegrees(double angrad)
Converte um ângulo de radianos para graus

A propósito, além dos métodos, a Mathclasse também possui duas variáveis ​​constantes (campos estáticos da classe):

Constante Descrição
double Math.PI
A constante "Pi" é igual a3.141592653589793
double Math.E
A constante "E" é igual a2.718281828459045

Todas essas funções podem ser muito úteis se você decidir escrever seus próprios jogos, trabalhar com gráficos ou simplesmente calcular o comprimento de um caminho em um mapa.

Por exemplo, se você deseja calcular sin(45°), veja como fazê-lo:

Math.sin( Math.toRadians(45) )

Aqui está um exemplo:

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. Funções algébricas em Java

Na maioria dos casos, a matemática do ensino médio é suficiente para um programador: mesmo senos e cossenos raramente são encontrados no código. Na maioria das vezes, eles são necessários ao trabalhar com jogos, mapas ou mecanismos de jogos. 90% dos programadores nunca encontram isso.

Mas, além da geometria, os programadores às vezes precisam usar funções algébricas. E, claro, a Mathclasse contém os mais comuns:

Método Descrição
double sqrt(double a)
raiz quadrada dea
double cbrt(double a)
raiz cúbica dea
double pow(double a, double b)
exponenciação:ab
double exp(double a)
exponencial (número de Euler elevado a uma potência):ea
double log(double a)
logaritmo natural de a:ln(a)
double log10(double a)
logaritmo de base 10 de a:log10(a)
double log1p(double x)
logaritmo natural de x + 1:ln(x + 1)
double expm1(double x)
ex-1

Se você deseja a raiz quadrada ou cúbica de um número, os métodos sqrt(a)e cbrt(a)estão à sua disposição.

A raiz quadrada pode ser calculada da seguinte forma:

Math.sqrt(2)

Se você deseja obter uma raiz de uma potência maior, use o método de exponenciação: aelevado ¼à quarta raiz, etc.

Math.pow(2, 0.25)

Para logaritmos e expoentes, existem os métodos log(a)(logaritmo natural) e exp(x)(exponencial). Para calcular o logaritmo de base 10, temos log10(a).

Se você quiser o logaritmo de um número bcomo base a, use esta fórmula simples:loga(b) = ln(b) / ln(a)

métodos úteis

Se você estiver realizando cálculos envolvendo valores muito pequenos de x, então as duas últimas funções — log1p()e expm1()— podem ser úteis para você.

Ao adicionar doublevariáveis ​​muito pequenas e muito grandes, muitas vezes você descobrirá que valores muito pequenos são simplesmente ignorados (descartados) como insignificantes. Na verdade, isso acontecerá se você usar os métodos log()e exp(). Para resolver isso, os programadores criaram funções que retornam apenas a "pequena parte significativa"

Exemplo:

Suponha que você queira calcular o logaritmo natural de 1 + x, onde xé . Você não pode simplesmente passar esse número para o método, pois se somar e , você obtém . é um número tão pequeno que será completamente descartado quando os números forem somados.10-20log()110-20110-20

Como a matemática geralmente envolve o cálculo log()de números próximos a 1, os programadores criaram uma maneira de contornar esse problema: em vez de passar o número em si para o método, passe apenas sua diferença de 1.



3. Mínimo e máximo

Mais duas funções úteis são min(a, b)e max(a, b). Como você provavelmente já adivinhou, o primeiro retorna o mínimo de dois números:

Math.min(a, b)

E o segundo retorna o máximo de dois números:

Math.max(a, b)

Por que precisamos dessas funções quando você sempre pode escrever ifou até mesmo usar o operador ternário (a < b ? a: b)?

É tudo sobre a legibilidade do código. Às vezes, seu código está sobrecarregado com ifinstruções e você deseja usar uma notação mais compacta. Vamos comparar:

Código Descrição
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Usando uma if-elsedeclaração (a maneira mais longa de escrevê-la)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Usando o operador ternário Contras:
- código volumoso
- os cálculos são executados duas vezes
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Esta é uma ótima maneira de escrevê-lo, mas é um pouco redundante
int x = Math.min(x-5+y*20, x*x+y*y);
Apenas certo 🙂

4. Mínimo e máximo de vários números

Há outra ótima maneira de usar os métodos min()e max().

Para calcular o mínimo (ou máximo) de vários números ou variáveis. É muito conveniente fazer chamadas aninhadas para esses métodos.

Veja como encontrar o mínimo de 3 números:

Math.min(a, Math.min(b, c))

E daí? É super conveniente: calcule o mínimo de dois números e retorne o mínimo desse número e o terceiro número.

O mínimo de quatro números é obtido da mesma maneira:

Math.min(a, Math.min(b, Math.min(с, d)))

Dito isso, podemos escrever esta fórmula um pouco mais claramente:

Math.min(Math.min(a, b), Math.min(c, d))

Tudo funciona da mesma forma para o max()método.

Usar o if-elseoperador ou o operador ternário tornaria esses trechos de código um pouco mais complicados. Mas usar os métodos min()e max()é simplesmente perfeito.