1. Trigonometriska funktioner i Java
När vi tidigare studerat avrundningstal har vi bekantat oss med Math
klassen och några av dess metoder. Vi ska nu titta på denna klass mer i detalj.
Som namnet antyder Math
innehåller klassen metoder för de matematiska operationer som oftast används av programmerare. Här är de mest intressanta:
Metod | Beskrivning | |
---|---|---|
|
Returnerar sinus för vinkeln d i radianer |
|
|
Returnerar cosinus för vinkeln d i radianer |
|
|
Returnerar tangenten för vinkeln d i radianer |
|
|
Returnerar arcsine | |
|
Returnerar arccosinus | |
|
Returnerar arctangensen | |
|
Returnerar hyperbolisk sinus | |
|
Returnerar hyperbolisk cosinus | |
|
Returnerar hyperbolisk tangens |
Metoderna , och tar en vinkel uttryckt i radianer. För att konvertera en vinkel från grader till radianer och vice versa, erbjuder klassen två speciella metoder:Math.sin()
Math.cos()
Math.tan()
Math
Metod | Beskrivning |
---|---|
|
Konverterar en vinkel från grader till radianer |
|
Konverterar en vinkel från radianer till grader |
Förresten, förutom metoder, Math
har klassen också två konstanta variabler (klassens statiska fält):
Konstant | Beskrivning |
---|---|
|
"Pi"-konstanten är lika med3.141592653589793 |
|
"E"-konstanten är lika med2.718281828459045 |
Alla dessa funktioner kan vara mycket användbara för dig om du bestämmer dig för att skriva dina egna spel, arbeta med grafik eller helt enkelt beräkna längden på en väg på en karta.
Om du till exempel vill beräkna sin(45°)
gör du så här:
Math.sin( Math.toRadians(45) )
Här är ett exempel:
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. Algebraiska funktioner i Java
I de flesta fall räcker gymnasiematte för en programmerare: till och med sinus och cosinus finns mycket sällan i kod. Oftast behövs de när man arbetar med spel, kartor eller spelmotorer. 90 % av programmerarna stöter aldrig på detta.
Men förutom geometri måste programmerare ibland använda algebraiska funktioner. Och naturligtvis Math
innehåller klassen de vanligaste:
Metod | Beskrivning |
---|---|
|
kvadratroten ava |
|
kubikroten ava |
|
exponentiering:ab |
|
exponentiell (Eulers tal upphöjt till en potens):ea |
|
naturlig logaritm av a :ln(a) |
|
bas-10 logaritm av a :log10(a) |
|
naturlig logaritm av x + 1 :ln(x + 1) |
|
ex-1 |
Om du vill ha kvadrat- eller kubroten av ett tal står sqrt(a)
och cbrt(a)
metoderna till din tjänst.
Kvadratroten kan beräknas enligt följande:
Math.sqrt(2)
Om du vill få en rot av en högre potens, använd då exponentieringsmetoden: a
till potensen av ¼
är den fjärde roten, etc.
Math.pow(2, 0.25)
För logaritmer och exponenter finns metoderna log(a)
(naturlig logaritm) och exp(x)
(exponentiell). För att beräkna bas-10-logaritmen har vi log10(a)
.
Om du vill att logaritmen för ett tal b
ska baseras a
, använd den här enkla formeln:loga(b) = ln(b) / ln(a)
Användbara metoder
Om du utför beräkningar som involverar mycket små värden på , kan x
de två sista funktionerna — log1p()
och expm1()
— vara användbara för dig.
När du lägger till mycket små och mycket stora double
variabler, kommer du ofta att upptäcka att mycket små värden helt enkelt ignoreras (kasseras) som obetydliga. Detta kommer faktiskt att hända om du använder metoderna och log()
. exp()
För att lösa detta kom programmerare med funktioner som endast returnerar den "lilla betydande delen"
Exempel:
Anta att du vill beräkna den naturliga logaritmen för , 1 + x
där x
är . Du kan inte bara skicka detta nummer till metoden, eftersom om du lägger till och får du . är ett så litet tal att det slängs helt när siffrorna läggs till.10-20
log()
1
10-20
1
10-20
Eftersom matematik ofta involverar beräkning log()
av siffror nära 1
, kom programmerare på ett sätt att komma runt detta problem: istället för att överföra själva talet till metoden, skicka bara dess skillnad från 1
.
3. Minimum och maximum
Ytterligare två användbara funktioner är min(a, b)
och max(a, b)
. Som du säkert redan gissat, returnerar den första minst två siffror:
Math.min(a, b)
Och den andra returnerar maximalt två tal:
Math.max(a, b)
Varför behöver vi dessa funktioner när du alltid kan skriva if
eller till och med använda den ternära operatorn (a < b ? a: b)
?
Allt handlar om kodens läsbarhet. Ibland är din kod överbelastad med if
satser och du vill använda mer kompakt notation. Låt oss jämföra:
Koda | Beskrivning |
---|---|
|
Använda ett if-else uttalande (det längsta sättet att skriva det) |
|
Använda den ternära operatorn Nackdelar: - skrymmande kod - beräkningar utförs två gånger |
|
Det här är ett bra sätt att skriva det på, men det är lite överflödigt |
|
Helt rätt 🙂 |
4. Minimum och maximum av flera nummer
Det finns ett annat bra sätt att använda min()
och max()
metoderna.
För att beräkna minimum (eller maximum) av flera tal eller variabler. Det är väldigt bekvämt att göra kapslade anrop till dessa metoder.
Så här hittar du minst tre siffror:
Math.min(a, Math.min(b, c))
Än sen då? Det är superbekvämt: beräkna minimum av två siffror och returnera sedan minimum av detta nummer och det tredje numret.
Minsta fyra siffror erhålls på samma sätt:
Math.min(a, Math.min(b, Math.min(с, d)))
Som sagt, vi kan skriva den här formeln lite tydligare:
Math.min(Math.min(a, b), Math.min(c, d))
Allt fungerar likadant för max()
metoden.
Att använda if-else
operatorn eller den ternära operatorn skulle göra dessa kodsnuttar lite mer besvärliga. Men att använda min()
och max()
metoderna är bara perfekt.