1. Trigonometriske funktioner i Java

Da vi tidligere studerede afrunding af tal, stiftede vi bekendtskab med Mathklassen og nogle af dens metoder. Vi vil nu se nærmere på denne klasse.

Som navnet antyder, Mathindeholder klassen metoder til de matematiske operationer, der oftest bruges af programmører. Her er de mest interessante:

Metode Beskrivelse
double sin(double d)
Returnerer vinklens sinus di radianer
double cos(double d)
Returnerer cosinus af vinklen di radianer
double tan(double d)
Returnerer tangens af vinklen di radianer
double asin(double d)
Returnerer arcsinus
double acos(double d)
Returnerer arccosinus
double atan(double d)
Returnerer arctangensen
double sinh(double d)
Returnerer den hyperbolske sinus
double cosh(double d)
Returnerer den hyperbolske cosinus
double tanh(double d)
Returnerer den hyperbolske tangens

Metoderne , og tager en vinkel udtrykt i radianer. For at konvertere en vinkel fra grader til radianer og omvendt tilbyder klassen to specielle metoder:Math.sin()Math.cos()Math.tan()Math

Metode Beskrivelse
double toRadians(double angdeg)
Konverterer en vinkel fra grader til radianer
double toDegrees(double angrad)
Konverterer en vinkel fra radianer til grader

Forresten, udover metoder Mathhar klassen også to konstante variable (statiske felter i klassen):

Konstant Beskrivelse
double Math.PI
"Pi"-konstanten er lig med3.141592653589793
double Math.E
"E" konstanten er lig med2.718281828459045

Alle disse funktioner kan være meget nyttige for dig, hvis du beslutter dig for at skrive dine egne spil, arbejde med grafik eller blot beregne længden af ​​en sti på et kort.

Hvis du f.eks. vil beregne sin(45°), gør du sådan her:

Math.sin( Math.toRadians(45) )

Her er et eksempel:

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. Algebraiske funktioner i Java

I de fleste tilfælde er gymnasiematematik nok for en programmør: selv sinus og cosinus findes meget sjældent i kode. Oftest er de nødvendige, når man arbejder med spil, kort eller spilmotorer. 90% af programmører oplever aldrig dette.

Men udover geometri skal programmører nogle gange bruge algebraiske funktioner. Og selvfølgelig Mathindeholder klassen de mest almindelige:

Metode Beskrivelse
double sqrt(double a)
kvadratrod afa
double cbrt(double a)
kubikrod afa
double pow(double a, double b)
eksponentiering:ab
double exp(double a)
eksponentiel (Eulers tal hævet til en potens):ea
double log(double a)
naturlig logaritme af a:ln(a)
double log10(double a)
base-10 logaritme af a:log10(a)
double log1p(double x)
naturlig logaritme af x + 1:ln(x + 1)
double expm1(double x)
ex-1

Hvis du vil have kvadrat- eller terningsroden af ​​et tal, står sqrt(a)og cbrt(a)metoderne til din tjeneste.

Kvadratroden kan beregnes som følger:

Math.sqrt(2)

Hvis du ønsker at få en rod af en højere potens, så brug eksponentieringsmetoden: atil potensen af ¼​​er den fjerde rod osv.

Math.pow(2, 0.25)

For logaritmer og eksponenter er der log(a)(naturlig logaritme) og exp(x)(eksponentiel) metoder. For at beregne base-10-logaritmen har vi log10(a).

Hvis du vil have logaritmen af ​​et tal btil at basere a, skal du bruge denne enkle formel:loga(b) = ln(b) / ln(a)

Nyttige metoder

Hvis du udfører beregninger, der involverer meget små værdier af x, kan de sidste to funktioner - log1p()og expm1()- være nyttige for dig.

Når man tilføjer meget små og meget store doublevariable, vil man ofte opleve, at meget små værdier simpelthen ignoreres (kasseres) som ubetydelige. Faktisk vil dette ske, hvis du bruger log()og exp()metoderne. For at løse dette kom programmører op med funktioner, der kun returnerer den "lille væsentlige del"

Eksempel:

Antag, at du vil beregne den naturlige logaritme af 1 + x, hvor xer . Du kan ikke bare videregive dette nummer til metoden, da hvis du tilføjer og , får du . er så lille et tal, at det vil blive fuldstændig kasseret, når tallene lægges sammen.10-20log()110-20110-20

Fordi matematik ofte involverer beregning af log()tal tæt på 1, fandt programmører på en måde at komme uden om dette problem: i stedet for at overføre selve tallet til metoden, skal du kun videregive dets forskel fra 1.



3. Minimum og maksimum

Yderligere to nyttige funktioner er min(a, b)og max(a, b). Som du sikkert allerede har gættet, returnerer det første minimum af to tal:

Math.min(a, b)

Og det andet returnerer maksimum af to tal:

Math.max(a, b)

Hvorfor har vi brug for disse funktioner, når du altid kan skrive ifeller endda bruge den ternære operator (a < b ? a: b)?

Det handler om kodens læsbarhed. Nogle gange er din kode overbelastet med ifudsagn, og du vil bruge mere kompakt notation. Lad os sammenligne:

Kode Beskrivelse
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Brug af en if-elseerklæring (den længste måde at skrive den på)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Brug af den ternære operator Ulemper:
- omfangsrig kode
- beregninger udføres to gange
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Dette er en fantastisk måde at skrive det på, men det er lidt overflødigt
int x = Math.min(x-5+y*20, x*x+y*y);
Lige rigtigt 🙂

4. Minimum og maksimum af flere tal

Der er en anden god måde at bruge min()og max()metoderne på.

For at beregne minimum (eller maksimum) af flere tal eller variable. Det er meget praktisk at foretage indlejrede opkald til disse metoder.

Sådan finder du minimum 3 numre:

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

Og hvad så? Det er super praktisk: beregn minimum af to tal, og returner derefter minimum af dette tal og det tredje tal.

Minimum fire tal opnås på samme måde:

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

Når det er sagt, kan vi skrive denne formel lidt mere tydeligt:

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

Det hele fungerer ens for max()metoden.

Brug af if-elseoperatoren eller ternær operator ville gøre disse kodestykker lidt mere besværlige. Men at bruge min()og max()metoderne er bare perfekt.