1. Funcții trigonometrice în Java

Când am studiat mai devreme rotunjirea numerelor, ne-am familiarizat cu Mathclasa și câteva dintre metodele acesteia. Acum ne vom uita la această clasă mai detaliat.

După cum sugerează și numele, Mathclasa conține metode pentru operațiile matematice utilizate cel mai frecvent de programatori. Iată cele mai interesante:

Metodă Descriere
double sin(double d)
Returnează sinusul unghiului d, în radiani
double cos(double d)
Returnează cosinusul unghiului d, în radiani
double tan(double d)
Returnează tangenta unghiului d, în radiani
double asin(double d)
Returnează arcsinusul
double acos(double d)
Returnează arccosinusul
double atan(double d)
Returnează arctangenta
double sinh(double d)
Returnează sinusul hiperbolic
double cosh(double d)
Returnează cosinusul hiperbolic
double tanh(double d)
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
double toRadians(double angdeg)
Transformă un unghi din grade în radiani
double toDegrees(double angrad)
Convertește un unghi din radiani în grade

Apropo, pe lângă metode, Mathclasa are și două variabile constante (câmpurile statice ale clasei):

Constant Descriere
double Math.PI
Constanta „Pi” este egală cu3.141592653589793
double Math.E
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, Mathclasa conține cele mai comune:

Metodă Descriere
double sqrt(double a)
rădăcină pătrată aa
double cbrt(double a)
rădăcină cubică aa
double pow(double a, double b)
exponentiare:ab
double exp(double a)
exponențial (numărul lui Euler crescut la o putere):ea
double log(double a)
logaritmul natural al a:ln(a)
double log10(double a)
logaritm de bază 10 pentru a:log10(a)
double log1p(double x)
logaritmul natural al x + 1:ln(x + 1)
double expm1(double x)
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: ala 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 bsă 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 doublevariabile 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 xeste . 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-20log()110-20110-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 ifsau chiar folosi operatorul ternar (a < b ? a: b)?

Totul ține de lizibilitatea codului. Uneori, codul dvs. este supraîncărcat cu ifinstrucțiuni și doriți să utilizați o notație mai compactă. Să comparăm:

Cod Descriere
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Utilizarea unei if-elsedeclarații (cel mai lung mod de a o scrie)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Utilizarea operatorului ternar Contra:
- cod voluminos
- calculele sunt efectuate de două ori
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Aceasta este o modalitate grozavă de a o scrie, dar este puțin redundantă
int x = Math.min(x-5+y*20, x*x+y*y);
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-elseoperatorului 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ă.