1. Goniometrische functies in Java
Toen we eerder afrondingsgetallen bestudeerden, maakten we kennis met de Math
klas en enkele van zijn methoden. We gaan nu dieper in op deze klasse.
Zoals de naam al aangeeft, bevat de Math
klasse methoden voor de wiskundige bewerkingen die het meest door programmeurs worden gebruikt. Dit zijn de meest interessante:
Methode | Beschrijving | |
---|---|---|
|
Retourneert de sinus van de hoek d , in radialen |
|
|
Retourneert de cosinus van de hoek d , in radialen |
|
|
Retourneert de tangens van de hoek d , in radialen |
|
|
Retourneert de boogsinus | |
|
Retourneert de arccosinus | |
|
Geeft de boogtangens terug | |
|
Retourneert de sinus hyperbolicus | |
|
Geeft de hyperbolische cosinus terug | |
|
Geeft de hyperbolische tangens terug |
De methoden , en nemen een hoek uitgedrukt in radialen. Om een hoek om te zetten van graden naar radialen en vice versa, biedt de klasse twee speciale methoden:Math.sin()
Math.cos()
Math.tan()
Math
Methode | Beschrijving |
---|---|
|
Converteert een hoek van graden naar radialen |
|
Converteert een hoek van radialen naar graden |
Trouwens, naast methoden Math
heeft de klasse ook twee constante variabelen (statische velden van de klasse):
Constante | Beschrijving |
---|---|
|
De constante "Pi" is gelijk aan3.141592653589793 |
|
De constante "E" is gelijk aan2.718281828459045 |
Al deze functies kunnen erg handig voor je zijn als je besluit om je eigen spellen te schrijven, met afbeeldingen te werken of gewoon de lengte van een pad op een kaart te berekenen.
Als u bijvoorbeeld wilt berekenen sin(45°)
, gaat u als volgt te werk:
Math.sin( Math.toRadians(45) )
Hier is een voorbeeld:
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. Algebraïsche functies in Java
In de meeste gevallen is wiskunde op de middelbare school genoeg voor een programmeur: zelfs sinussen en cosinussen komen zeer zelden voor in code. Meestal zijn ze nodig bij het werken met games, kaarten of game-engines. 90% van de programmeurs komt dit nooit tegen.
Maar naast geometrie moeten programmeurs soms algebraïsche functies gebruiken. En natuurlijk Math
bevat de klasse de meest voorkomende:
Methode | Beschrijving |
---|---|
|
vierkantswortel vana |
|
derdemachtswortel vana |
|
machtsverheffen:ab |
|
exponentieel (het getal van Euler tot een macht verheven):ea |
|
natuurlijke logaritme van a :ln(a) |
|
logaritme met grondtal 10 van a :log10(a) |
|
natuurlijke logaritme van x + 1 :ln(x + 1) |
|
ex-1 |
Als u de vierkants- of derdemachtswortel van een getal wilt, staan de methoden sqrt(a)
en cbrt(a)
tot uw dienst.
De vierkantswortel kan als volgt worden berekend:
Math.sqrt(2)
Als je een wortel van een hogere macht wilt krijgen, gebruik dan de machtsverheffende methode: a
tot de macht van ¼
is de vierde wortel, enz.
Math.pow(2, 0.25)
Voor logaritmen en exponenten zijn er de log(a)
(natuurlijke logaritme) en exp(x)
(exponentiële) methoden. Om de logaritme met grondtal 10 te berekenen, hebben we log10(a)
.
Als u de logaritme van een getal b
als grondtal wilt gebruiken a
, gebruikt u deze eenvoudige formule:loga(b) = ln(b) / ln(a)
Handige methodes
Als u berekeningen uitvoert met zeer kleine waarden van x
, dan kunnen de laatste twee functies — log1p()
en expm1()
— nuttig voor u zijn.
Wanneer u zeer kleine en zeer grote double
variabelen toevoegt, zult u vaak merken dat zeer kleine waarden simpelweg worden genegeerd (weggegooid) als onbeduidend. Dit zal in feite gebeuren als u de methoden log()
en gebruikt exp()
. Om dit op te lossen, bedachten programmeurs functies die alleen het "kleine significante deel" retourneren
Voorbeeld:
Stel dat u de natuurlijke logaritme wilt berekenen van 1 + x
, waar x
is . U kunt dit nummer niet zomaar aan de methode doorgeven, want als u en optelt , krijgt u . is zo'n klein getal dat het volledig wordt weggegooid wanneer de getallen worden toegevoegd.10-20
log()
1
10-20
1
10-20
Omdat wiskunde vaak betrekking heeft op het berekenen van log()
getallen dicht bij 1
, bedachten programmeurs een manier om dit probleem te omzeilen: in plaats van het getal zelf door te geven aan de methode, gaven ze alleen het verschil van 1
.
3. Minimum en maximum
Twee andere handige functies zijn min(a, b)
en max(a, b)
. Zoals je waarschijnlijk al geraden hebt, retourneert de eerste het minimum van twee getallen:
Math.min(a, b)
En de tweede geeft het maximum van twee getallen terug:
Math.max(a, b)
Waarom hebben we deze functies nodig als je altijd kunt schrijven if
of zelfs de ternaire operator kunt gebruiken (a < b ? a: b)
?
Het draait allemaal om de leesbaarheid van de code. Soms is uw code overladen met if
statements en wilt u een compactere notatie gebruiken. Laten we vergelijken:
Code | Beschrijving |
---|---|
|
Een statement gebruiken if-else (de langste manier om het te schrijven) |
|
De ternaire operator gebruiken Nadelen: - omvangrijke code - berekeningen worden twee keer uitgevoerd |
|
Dit is een geweldige manier om het te schrijven, maar het is een beetje overbodig |
|
Precies goed 🙂 |
4. Minimum en maximum van meerdere nummers
Er is nog een geweldige manier om de methoden min()
en te gebruiken max()
.
Het minimum (of maximum) van verschillende getallen of variabelen berekenen. Het is erg handig om geneste aanroepen naar deze methoden te maken.
Zo vindt u het minimum van 3 getallen:
Math.min(a, Math.min(b, c))
Dus? Het is superhandig: bereken het minimum van twee getallen en retourneer dan het minimum van dit getal en het derde getal.
Het minimum van vier getallen wordt op dezelfde manier verkregen:
Math.min(a, Math.min(b, Math.min(с, d)))
Dat gezegd hebbende, kunnen we deze formule iets duidelijker schrijven:
Math.min(Math.min(a, b), Math.min(c, d))
Het werkt allemaal hetzelfde voor de max()
methode.
Het gebruik van de if-else
operator of ternaire operator zou deze codefragmenten iets omslachtiger maken. Maar het gebruik van de methoden min()
en max()
is gewoon perfect.
GO TO FULL VERSION