1. Trigonometriske funksjoner i Java

Da vi studerte avrunding av tall tidligere, ble vi kjent med Mathklassen og noen av dens metoder. Vi skal nå se nærmere på denne klassen.

Som navnet tilsier, Mathinneholder klassen metoder for de matematiske operasjonene som oftest brukes av programmerere. Her er de mest interessante:

Metode Beskrivelse
double sin(double d)
Returnerer sinusen til vinkelen di radianer
double cos(double d)
Returnerer cosinus til vinkelen di radianer
double tan(double d)
Returnerer tangensen til vinkelen di radianer
double asin(double d)
Returnerer arcsine
double acos(double d)
Returnerer arccosinus
double atan(double d)
Returnerer arctangensen
double sinh(double d)
Returnerer hyperbolsk sinus
double cosh(double d)
Returnerer den hyperbolske cosinus
double tanh(double d)
Returnerer den hyperbolske tangenten

Metodene , og har en vinkel uttrykt i radianer. For å konvertere en vinkel fra grader til radianer og omvendt, tilbyr klassen to spesielle 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, i tillegg til metoder, Mathhar klassen også to konstante variabler (statiske felt i klassen):

Konstant Beskrivelse
double Math.PI
"Pi"-konstanten er lik3.141592653589793
double Math.E
"E"-konstanten er lik2.718281828459045

Alle disse funksjonene kan være svært nyttige for deg hvis du bestemmer deg for å skrive dine egne spill, jobbe med grafikk eller ganske enkelt beregne lengden på en sti på et kart.

Hvis du for eksempel vil beregne sin(45°), gjør du det slik:

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 funksjoner i Java

I de fleste tilfeller er videregående matematikk nok for en programmerer: selv sinus og cosinus finnes svært sjelden i kode. Oftest trengs de når man jobber med spill, kart eller spillmotorer. 90 % av programmererne opplever aldri dette.

Men i tillegg til geometri, må programmerere noen ganger bruke algebraiske funksjoner. Og selvfølgelig Mathinneholder klassen de vanligste:

Metode Beskrivelse
double sqrt(double a)
kvadratroten ava
double cbrt(double a)
kubikkrot ava
double pow(double a, double b)
eksponentiering:ab
double exp(double a)
eksponentiell (Eulers tall hevet til en potens):ea
double log(double a)
naturlig logaritme av a:ln(a)
double log10(double a)
base-10 logaritme av a:log10(a)
double log1p(double x)
naturlig logaritme av x + 1:ln(x + 1)
double expm1(double x)
ex-1

Hvis du vil ha kvadrat- eller terningsroten av et tall, står sqrt(a)og cbrt(a)-metodene til tjeneste.

Kvadratroten kan beregnes som følger:

Math.sqrt(2)

Hvis du ønsker å få en rot av en høyere potens, bruk eksponentieringsmetoden: atil potensen av ¼er den fjerde roten osv.

Math.pow(2, 0.25)

For logaritmer og eksponenter er det log(a)(naturlig logaritme) og exp(x)(eksponentiell) metodene. For å beregne base-10-logaritmen har vi log10(a).

Hvis du vil at logaritmen til et tall bskal basere a, bruk denne enkle formelen:loga(b) = ln(b) / ln(a)

Nyttige metoder

Hvis du utfører beregninger som involverer svært små verdier på x, kan de to siste funksjonene – log1p()og expm1()– være nyttige for deg.

Når du legger til veldig små og veldig store doublevariabler, vil du ofte oppdage at veldig små verdier rett og slett blir ignorert (forkastet) som ubetydelige. Faktisk vil dette skje hvis du bruker metodene log()og exp(). For å løse dette kom programmerere opp med funksjoner som bare returnerer den "lille betydelige delen"

Eksempel:

Anta at du vil beregne den naturlige logaritmen til 1 + x, hvor xer . Du kan ikke bare sende dette nummeret til metoden, siden hvis du legger til og , får du . er et så lite tall at det vil bli fullstendig forkastet når tallene legges til.10-20log()110-20110-20

Fordi matematikk ofte involverer beregning av log()tall nær 1, kom programmerere opp med en måte å komme seg rundt dette problemet på: i stedet for å overføre selve tallet til metoden, sender du bare forskjellen fra 1.



3. Minimum og maksimum

Ytterligere to nyttige funksjoner er min(a, b)og max(a, b). Som du sikkert allerede har gjettet, returnerer det første minimum av to tall:

Math.min(a, b)

Og den andre returnerer maksimalt to tall:

Math.max(a, b)

Hvorfor trenger vi disse funksjonene når du alltid kan skrive ifeller til og med bruke den ternære operatoren (a < b ? a: b)?

Alt handler om lesbarheten til koden. Noen ganger er koden din overbelastet med ifutsagn og du ønsker å bruke mer kompakt notasjon. La oss 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;
Bruke en if-elseuttalelse (den lengste måten å skrive den på)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Ved å bruke den ternære operatøren Ulemper:
- voluminøs kode
- beregninger utføres to ganger
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Dette er en fin måte å skrive det på, men det er litt overflødig
int x = Math.min(x-5+y*20, x*x+y*y);
Akkurat riktig 🙂

4. Minimum og maksimum av flere tall

Det er en annen fin måte å bruke min()og- max()metodene på.

For å beregne minimum (eller maksimum) av flere tall eller variabler. Det er veldig praktisk å foreta nestede anrop til disse metodene.

Slik finner du minimum 3 tall:

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

Hva så? Det er veldig praktisk: beregn minimum av to tall, og returner deretter minimum av dette tallet og det tredje tallet.

Minimum fire tall oppnås på samme måte:

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

Når det er sagt, kan vi skrive denne formelen litt tydeligere:

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

Alt fungerer likt for max()metoden.

Å bruke if-elseoperatøren eller ternær operatør ville gjøre disse kodebitene litt mer tungvint. Men å bruke min()og- max()metodene er perfekt.