1. Trigonometriska funktioner i Java

När vi tidigare studerat avrundningstal har vi bekantat oss med Mathklassen och några av dess metoder. Vi ska nu titta på denna klass mer i detalj.

Som namnet antyder Mathinnehåller klassen metoder för de matematiska operationer som oftast används av programmerare. Här är de mest intressanta:

Metod Beskrivning
double sin(double d)
Returnerar sinus för vinkeln di radianer
double cos(double d)
Returnerar cosinus för vinkeln di radianer
double tan(double d)
Returnerar tangenten för vinkeln di radianer
double asin(double d)
Returnerar arcsine
double acos(double d)
Returnerar arccosinus
double atan(double d)
Returnerar arctangensen
double sinh(double d)
Returnerar hyperbolisk sinus
double cosh(double d)
Returnerar hyperbolisk cosinus
double tanh(double d)
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
double toRadians(double angdeg)
Konverterar en vinkel från grader till radianer
double toDegrees(double angrad)
Konverterar en vinkel från radianer till grader

Förresten, förutom metoder, Mathhar klassen också två konstanta variabler (klassens statiska fält):

Konstant Beskrivning
double Math.PI
"Pi"-konstanten är lika med3.141592653589793
double Math.E
"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 Mathinnehåller klassen de vanligaste:

Metod Beskrivning
double sqrt(double a)
kvadratroten ava
double cbrt(double a)
kubikroten ava
double pow(double a, double b)
exponentiering:ab
double exp(double a)
exponentiell (Eulers tal upphöjt till en potens):ea
double log(double a)
naturlig logaritm av a:ln(a)
double log10(double a)
bas-10 logaritm av a:log10(a)
double log1p(double x)
naturlig logaritm av x + 1:ln(x + 1)
double expm1(double x)
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: atill 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 bska 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 xde två sista funktionerna — log1p()och expm1()— vara användbara för dig.

När du lägger till mycket små och mycket stora doublevariabler, 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 + xdä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-20log()110-20110-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 ifeller 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 ifsatser och du vill använda mer kompakt notation. Låt oss jämföra:

Koda Beskrivning
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Använda ett if-elseuttalande (det längsta sättet att skriva det)
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Använda den ternära operatorn Nackdelar:
- skrymmande kod
- beräkningar utförs två gånger
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Det här är ett bra sätt att skriva det på, men det är lite överflödigt
int x = Math.min(x-5+y*20, x*x+y*y);
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-elseoperatorn 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.