1. Trigonometriske funktioner i Java
Da vi tidligere studerede afrunding af tal, stiftede vi bekendtskab med Math
klassen og nogle af dens metoder. Vi vil nu se nærmere på denne klasse.
Som navnet antyder, Math
indeholder klassen metoder til de matematiske operationer, der oftest bruges af programmører. Her er de mest interessante:
Metode | Beskrivelse | |
---|---|---|
|
Returnerer vinklens sinus d i radianer |
|
|
Returnerer cosinus af vinklen d i radianer |
|
|
Returnerer tangens af vinklen d i radianer |
|
|
Returnerer arcsinus | |
|
Returnerer arccosinus | |
|
Returnerer arctangensen | |
|
Returnerer den hyperbolske sinus | |
|
Returnerer den hyperbolske cosinus | |
|
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 |
---|---|
|
Konverterer en vinkel fra grader til radianer |
|
Konverterer en vinkel fra radianer til grader |
Forresten, udover metoder Math
har klassen også to konstante variable (statiske felter i klassen):
Konstant | Beskrivelse |
---|---|
|
"Pi"-konstanten er lig med3.141592653589793 |
|
"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 Math
indeholder klassen de mest almindelige:
Metode | Beskrivelse |
---|---|
|
kvadratrod afa |
|
kubikrod afa |
|
eksponentiering:ab |
|
eksponentiel (Eulers tal hævet til en potens):ea |
|
naturlig logaritme af a :ln(a) |
|
base-10 logaritme af a :log10(a) |
|
naturlig logaritme af x + 1 :ln(x + 1) |
|
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: a
til 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 b
til 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 double
variable, 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 x
er . 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-20
log()
1
10-20
1
10-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 if
eller endda bruge den ternære operator (a < b ? a: b)
?
Det handler om kodens læsbarhed. Nogle gange er din kode overbelastet med if
udsagn, og du vil bruge mere kompakt notation. Lad os sammenligne:
Kode | Beskrivelse |
---|---|
|
Brug af en if-else erklæring (den længste måde at skrive den på) |
|
Brug af den ternære operator Ulemper: - omfangsrig kode - beregninger udføres to gange |
|
Dette er en fantastisk måde at skrive det på, men det er lidt overflødigt |
|
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-else
operatoren eller ternær operator ville gøre disse kodestykker lidt mere besværlige. Men at bruge min()
og max()
metoderne er bare perfekt.
GO TO FULL VERSION