1. Funzioni trigonometriche in Java

Quando abbiamo studiato i numeri di arrotondamento in precedenza, abbiamo familiarizzato con la Mathclasse e alcuni dei suoi metodi. Ora esamineremo questa classe in modo più dettagliato.

Come suggerisce il nome, la Mathclasse contiene i metodi per le operazioni matematiche più frequentemente utilizzate dai programmatori. Ecco i più interessanti:

Metodo Descrizione
double sin(double d)
Restituisce il seno dell'angolo d, in radianti
double cos(double d)
Restituisce il coseno dell'angolo d, in radianti
double tan(double d)
Restituisce la tangente dell'angolo d, in radianti
double asin(double d)
Restituisce l'arcoseno
double acos(double d)
Restituisce l'arcoseno
double atan(double d)
Restituisce l'arcotangente
double sinh(double d)
Restituisce il seno iperbolico
double cosh(double d)
Restituisce il coseno iperbolico
double tanh(double d)
Restituisce la tangente iperbolica

I metodi , e prendono un angolo espresso in radianti. Per convertire un angolo da gradi a radianti e viceversa, la classe offre due metodi speciali:Math.sin()Math.cos()Math.tan()Math

Metodo Descrizione
double toRadians(double angdeg)
Converte un angolo da gradi a radianti
double toDegrees(double angrad)
Converte un angolo da radianti a gradi

A proposito, oltre ai metodi, la Mathclasse ha anche due variabili costanti (campi statici della classe):

Costante Descrizione
double Math.PI
La costante "Pi" è uguale a3.141592653589793
double Math.E
La costante "E" è uguale a2.718281828459045

Tutte queste funzioni possono esserti molto utili se decidi di scrivere i tuoi giochi, lavorare con la grafica o semplicemente calcolare la lunghezza di un percorso su una mappa.

Ad esempio, se vuoi calcolare sin(45°), ecco come lo fai:

Math.sin( Math.toRadians(45) )

Ecco un esempio:

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. Funzioni algebriche in Java

Nella maggior parte dei casi, la matematica del liceo è sufficiente per un programmatore: anche seni e coseni si trovano molto raramente nel codice. Molto spesso sono necessari quando si lavora con giochi, mappe o motori di gioco. Il 90% dei programmatori non lo incontra mai.

Ma oltre alla geometria, a volte i programmatori devono usare funzioni algebriche. E, naturalmente, la Mathclasse contiene i più comuni:

Metodo Descrizione
double sqrt(double a)
radice quadrata dia
double cbrt(double a)
radice cubica dia
double pow(double a, double b)
esponenziale:ab
double exp(double a)
esponenziale (numero di Eulero elevato a potenza):ea
double log(double a)
logaritmo naturale di a:ln(a)
double log10(double a)
logaritmo in base 10 di a:log10(a)
double log1p(double x)
logaritmo naturale di x + 1:ln(x + 1)
double expm1(double x)
ex-1

Se vuoi la radice quadrata o cubica di un numero, i metodi sqrt(a)e cbrt(a)sono al tuo servizio.

La radice quadrata può essere calcolata come segue:

Math.sqrt(2)

Se vuoi ottenere una radice di una potenza maggiore, usa il metodo dell'elevamento a potenza: aalla potenza di ¼c'è la quarta radice, ecc.

Math.pow(2, 0.25)

Per i logaritmi e gli esponenti esistono i metodi log(a)(logaritmo naturale) ed exp(x)(esponenziale). Per calcolare il logaritmo in base 10, abbiamo log10(a).

Se vuoi che il logaritmo di un numero sia bbasato su a, usa questa semplice formula:loga(b) = ln(b) / ln(a)

Metodi utili

Se stai eseguendo calcoli che coinvolgono valori molto piccoli di x, allora le ultime due funzioni — log1p()e expm1()— potrebbero esserti utili.

Quando si aggiungono variabili molto piccole e molto grandi double, spesso si scoprirà che i valori molto piccoli vengono semplicemente ignorati (scartati) in quanto insignificanti. In effetti, questo accadrà se utilizzi i metodi log()e exp(). Per risolvere questo problema, i programmatori hanno escogitato funzioni che restituiscono solo la "piccola parte significativa"

Esempio:

Supponiamo di voler calcolare il logaritmo naturale di 1 + x, dove xè . Non puoi semplicemente passare questo numero al metodo, poiché se aggiungi e ottieni . è un numero così piccolo che verrà completamente scartato quando i numeri vengono aggiunti.10-20log()110-20110-20

Poiché la matematica spesso comporta il calcolo log()di numeri vicini a 1, i programmatori hanno escogitato un modo per aggirare questo problema: invece di passare il numero stesso al metodo, passare solo la sua differenza da 1.



3. Minimo e massimo

Altre due funzioni utili sono min(a, b)e max(a, b). Come probabilmente avrai già intuito, il primo restituisce il minimo di due numeri:

Math.min(a, b)

E il secondo restituisce il massimo di due numeri:

Math.max(a, b)

Perché abbiamo bisogno di queste funzioni quando puoi sempre scrivere ifo persino usare l'operatore ternario (a < b ? a: b)?

Riguarda la leggibilità del codice. A volte il tuo codice è sovraccarico di ifistruzioni e vuoi usare una notazione più compatta. Confrontiamo:

Codice Descrizione
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-elsedichiarazione (il modo più lungo per scriverla)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Utilizzo dell'operatore ternario Contro:
- codice ingombrante
- i calcoli vengono eseguiti due volte
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Questo è un ottimo modo per scriverlo, ma è un po' ridondante
int x = Math.min(x-5+y*20, x*x+y*y);
Giusto 🙂

4. Minimo e massimo di più numeri

C'è un altro ottimo modo per utilizzare i metodi min()e max().

Per calcolare il minimo (o il massimo) di più numeri o variabili. È molto conveniente effettuare chiamate nidificate a questi metodi.

Ecco come trovare il minimo di 3 numeri:

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

E allora? È super conveniente: calcola il minimo di due numeri, quindi restituisci il minimo di questo numero e il terzo numero.

Il minimo di quattro numeri si ottiene allo stesso modo:

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

Detto questo, possiamo scrivere questa formula un po' più chiaramente:

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

Funziona tutto allo stesso modo per il max()metodo.

L'uso if-elsedell'operatore o dell'operatore ternario renderebbe questi frammenti di codice un po' più ingombranti. Ma usare i metodi min()e max()è semplicemente perfetto.