1. Trigonometriske funksjoner i Java
Da vi studerte avrunding av tall tidligere, ble vi kjent med Math
klassen og noen av dens metoder. Vi skal nå se nærmere på denne klassen.
Som navnet tilsier, Math
inneholder klassen metoder for de matematiske operasjonene som oftest brukes av programmerere. Her er de mest interessante:
Metode | Beskrivelse | |
---|---|---|
|
Returnerer sinusen til vinkelen d i radianer |
|
|
Returnerer cosinus til vinkelen d i radianer |
|
|
Returnerer tangensen til vinkelen d i radianer |
|
|
Returnerer arcsine | |
|
Returnerer arccosinus | |
|
Returnerer arctangensen | |
|
Returnerer hyperbolsk sinus | |
|
Returnerer den hyperbolske cosinus | |
|
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 |
---|---|
|
Konverterer en vinkel fra grader til radianer |
|
Konverterer en vinkel fra radianer til grader |
Forresten, i tillegg til metoder, Math
har klassen også to konstante variabler (statiske felt i klassen):
Konstant | Beskrivelse |
---|---|
|
"Pi"-konstanten er lik3.141592653589793 |
|
"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 Math
inneholder klassen de vanligste:
Metode | Beskrivelse |
---|---|
|
kvadratroten ava |
|
kubikkrot ava |
|
eksponentiering:ab |
|
eksponentiell (Eulers tall hevet til en potens):ea |
|
naturlig logaritme av a :ln(a) |
|
base-10 logaritme av a :log10(a) |
|
naturlig logaritme av x + 1 :ln(x + 1) |
|
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: a
til 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 b
skal 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 double
variabler, 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 x
er . 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-20
log()
1
10-20
1
10-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 if
eller 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 if
utsagn og du ønsker å bruke mer kompakt notasjon. La oss sammenligne:
Kode | Beskrivelse |
---|---|
|
Bruke en if-else uttalelse (den lengste måten å skrive den på) |
|
Ved å bruke den ternære operatøren Ulemper: - voluminøs kode - beregninger utføres to ganger |
|
Dette er en fin måte å skrive det på, men det er litt overflødig |
|
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-else
operatøren eller ternær operatør ville gjøre disse kodebitene litt mer tungvint. Men å bruke min()
og- max()
metodene er perfekt.
GO TO FULL VERSION