1. Funcții trigonometrice în Java
Când am studiat mai devreme rotunjirea numerelor, ne-am familiarizat cu Math
clasa și câteva dintre metodele acesteia. Acum ne vom uita la această clasă mai detaliat.
După cum sugerează și numele, Math
clasa conține metode pentru operațiile matematice utilizate cel mai frecvent de programatori. Iată cele mai interesante:
Metodă | Descriere | |
---|---|---|
|
Returnează sinusul unghiului d , în radiani |
|
|
Returnează cosinusul unghiului d , în radiani |
|
|
Returnează tangenta unghiului d , în radiani |
|
|
Returnează arcsinusul | |
|
Returnează arccosinusul | |
|
Returnează arctangenta | |
|
Returnează sinusul hiperbolic | |
|
Returnează cosinusul hiperbolic | |
|
Returnează tangenta hiperbolică |
Metodele , și iau un unghi exprimat în radiani. Pentru a converti un unghi din grade în radiani și invers, clasa oferă două metode speciale:Math.sin()
Math.cos()
Math.tan()
Math
Metodă | Descriere |
---|---|
|
Transformă un unghi din grade în radiani |
|
Convertește un unghi din radiani în grade |
Apropo, pe lângă metode, Math
clasa are și două variabile constante (câmpurile statice ale clasei):
Constant | Descriere |
---|---|
|
Constanta „Pi” este egală cu3.141592653589793 |
|
Constanta „E” este egală cu2.718281828459045 |
Toate aceste funcții vă pot fi foarte utile dacă decideți să vă scrieți propriile jocuri, să lucrați cu grafică sau pur și simplu să calculați lungimea unei căi pe o hartă.
De exemplu, dacă doriți să calculați sin(45°)
, iată cum o faceți:
Math.sin( Math.toRadians(45) )
Iată un exemplu:
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. Funcții algebrice în Java
În cele mai multe cazuri, matematica de liceu este suficientă pentru un programator: chiar și sinusurile și cosinusurile se găsesc foarte rar în cod. Cel mai adesea sunt necesare atunci când lucrați cu jocuri, hărți sau motoare de joc. 90% dintre programatori nu se confruntă niciodată cu asta.
Dar, pe lângă geometrie, programatorii trebuie uneori să folosească funcții algebrice. Și, desigur, Math
clasa conține cele mai comune:
Metodă | Descriere |
---|---|
|
rădăcină pătrată aa |
|
rădăcină cubică aa |
|
exponentiare:ab |
|
exponențial (numărul lui Euler crescut la o putere):ea |
|
logaritmul natural al a :ln(a) |
|
logaritm de bază 10 pentru a :log10(a) |
|
logaritmul natural al x + 1 :ln(x + 1) |
|
ex-1 |
Dacă doriți rădăcina pătrată sau cubă a unui număr, metodele sqrt(a)
și cbrt(a)
sunt la dispoziție.
Rădăcina pătrată poate fi calculată după cum urmează:
Math.sqrt(2)
Dacă doriți să obțineți o rădăcină a unei puteri mai mari, atunci utilizați metoda exponențiării: a
la puterea ¼
este a patra rădăcină etc.
Math.pow(2, 0.25)
Pentru logaritmi și exponenți, există metodele log(a)
(logaritmul natural) și exp(x)
(exponențial). Pentru a calcula logaritmul de bază 10, avem log10(a)
.
Dacă doriți ca logaritmul unui număr b
să se bazeze a
, utilizați această formulă simplă:loga(b) = ln(b) / ln(a)
Metode utile
Dacă efectuați calcule care implică valori foarte mici de x
, atunci ultimele două funcții — log1p()
și expm1()
— vă pot fi utile.
Atunci când adăugați double
variabile foarte mici și foarte mari, veți descoperi adesea că valorile foarte mici sunt pur și simplu ignorate (eliminate) ca fiind nesemnificative. De fapt, acest lucru se va întâmpla dacă utilizați metodele log()
și exp()
. Pentru a rezolva acest lucru, programatorii au venit cu funcții care returnează doar „partea semnificativă mică”
Exemplu:
Să presupunem că doriți să calculați logaritmul natural al lui 1 + x
, unde x
este . Nu puteți trece pur și simplu acest număr metodei , deoarece dacă adăugați și , obțineți . este un număr atât de mic încât va fi eliminat complet atunci când numerele sunt adăugate.10-20
log()
1
10-20
1
10-20
Deoarece matematica implică adesea calcularea log()
numerelor apropiate de 1
, programatorii au venit cu o modalitate de a ocoli această problemă: în loc să treacă numărul în sine metodei, treceți doar diferența acestuia de la 1
.
3. Minim și maxim
Încă două funcții utile sunt min(a, b)
și max(a, b)
. După cum probabil ați ghicit deja, primul returnează minimum două numere:
Math.min(a, b)
Iar al doilea returnează maximum două numere:
Math.max(a, b)
De ce avem nevoie de aceste funcții când puteți scrie if
sau chiar folosi operatorul ternar (a < b ? a: b)
?
Totul ține de lizibilitatea codului. Uneori, codul dvs. este supraîncărcat cu if
instrucțiuni și doriți să utilizați o notație mai compactă. Să comparăm:
Cod | Descriere |
---|---|
|
Utilizarea unei if-else declarații (cel mai lung mod de a o scrie) |
|
Utilizarea operatorului ternar Contra: - cod voluminos - calculele sunt efectuate de două ori |
|
Aceasta este o modalitate grozavă de a o scrie, dar este puțin redundantă |
|
Exact 🙂 |
4. Minim și maxim de mai multe numere
Există o altă modalitate grozavă de a folosi metodele min()
și max()
.
Pentru a calcula minimul (sau maximul) mai multor numere sau variabile. Este foarte convenabil să faci apeluri imbricate la aceste metode.
Iată cum să găsești minimum 3 numere:
Math.min(a, Math.min(b, c))
Şi ce dacă? Este super convenabil: calculați minimul a două numere, apoi returnați minimul acestui număr și al treilea număr.
Minimul de patru numere se obține în același mod:
Math.min(a, Math.min(b, Math.min(с, d)))
Acestea fiind spuse, putem scrie această formulă puțin mai clar:
Math.min(Math.min(a, b), Math.min(c, d))
Toate funcționează la fel pentru max()
metodă.
Utilizarea if-else
operatorului sau a operatorului ternar ar face aceste fragmente de cod puțin mai greoaie. Dar folosirea metodelor min()
și max()
este pur și simplu perfectă.
GO TO FULL VERSION