1. Funzioni trigonometriche in Java
Quando abbiamo studiato i numeri di arrotondamento in precedenza, abbiamo familiarizzato con la Math
classe e alcuni dei suoi metodi. Ora esamineremo questa classe in modo più dettagliato.
Come suggerisce il nome, la Math
classe contiene i metodi per le operazioni matematiche più frequentemente utilizzate dai programmatori. Ecco i più interessanti:
Metodo | Descrizione | |
---|---|---|
|
Restituisce il seno dell'angolo d , in radianti |
|
|
Restituisce il coseno dell'angolo d , in radianti |
|
|
Restituisce la tangente dell'angolo d , in radianti |
|
|
Restituisce l'arcoseno | |
|
Restituisce l'arcoseno | |
|
Restituisce l'arcotangente | |
|
Restituisce il seno iperbolico | |
|
Restituisce il coseno iperbolico | |
|
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 |
---|---|
|
Converte un angolo da gradi a radianti |
|
Converte un angolo da radianti a gradi |
A proposito, oltre ai metodi, la Math
classe ha anche due variabili costanti (campi statici della classe):
Costante | Descrizione |
---|---|
|
La costante "Pi" è uguale a3.141592653589793 |
|
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 Math
classe contiene i più comuni:
Metodo | Descrizione |
---|---|
|
radice quadrata dia |
|
radice cubica dia |
|
esponenziale:ab |
|
esponenziale (numero di Eulero elevato a potenza):ea |
|
logaritmo naturale di a :ln(a) |
|
logaritmo in base 10 di a :log10(a) |
|
logaritmo naturale di x + 1 :ln(x + 1) |
|
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: a
alla 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 b
basato 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-20
log()
1
10-20
1
10-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 if
o persino usare l'operatore ternario (a < b ? a: b)
?
Riguarda la leggibilità del codice. A volte il tuo codice è sovraccarico di if
istruzioni e vuoi usare una notazione più compatta. Confrontiamo:
Codice | Descrizione |
---|---|
|
Usando una if-else dichiarazione (il modo più lungo per scriverla) |
|
Utilizzo dell'operatore ternario Contro: - codice ingombrante - i calcoli vengono eseguiti due volte |
|
Questo è un ottimo modo per scriverlo, ma è un po' ridondante |
|
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-else
dell'operatore o dell'operatore ternario renderebbe questi frammenti di codice un po' più ingombranti. Ma usare i metodi min()
e max()
è semplicemente perfetto.
GO TO FULL VERSION