1. Funkcje trygonometryczne w Javie
Kiedy wcześniej studiowaliśmy zaokrąglanie liczb, zapoznaliśmy się z Math
klasą i niektórymi jej metodami. Przyjrzymy się teraz tej klasie bardziej szczegółowo.
Jak sama nazwa wskazuje, Math
klasa zawiera metody operacji matematycznych najczęściej używanych przez programistów. Oto najciekawsze z nich:
metoda | Opis | |
---|---|---|
|
Zwraca sinus kąta d w radianach |
|
|
Zwraca cosinus kąta d w radianach |
|
|
Zwraca tangens kąta d w radianach |
|
|
Zwraca arcus sinus | |
|
Zwraca arcus cosinus | |
|
Zwraca arcus tangens | |
|
Zwraca sinus hiperboliczny | |
|
Zwraca cosinus hiperboliczny | |
|
Zwraca tangens hiperboliczny |
Metody , i przyjmują kąt wyrażony w radianach. Aby przekonwertować kąt ze stopni na radiany i odwrotnie, klasa oferuje dwie specjalne metody:Math.sin()
Math.cos()
Math.tan()
Math
metoda | Opis |
---|---|
|
Konwertuje kąt ze stopni na radiany |
|
Konwertuje kąt z radianów na stopnie |
Nawiasem mówiąc, oprócz metod, Math
klasa posiada również dwie zmienne stałe (pola statyczne klasy):
Stały | Opis |
---|---|
|
Stała „Pi” jest równa3.141592653589793 |
|
Stała „E” jest równa2.718281828459045 |
Wszystkie te funkcje mogą ci się bardzo przydać, jeśli zdecydujesz się pisać własne gry, pracować z grafiką lub po prostu obliczać długość ścieżki na mapie.
Na przykład, jeśli chcesz obliczyć sin(45°)
, wykonaj to w następujący sposób:
Math.sin( Math.toRadians(45) )
Oto przykład:
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. Funkcje algebraiczne w Javie
W większości przypadków programistom wystarczy matematyka ze szkoły średniej: nawet sinusy i cosinusy są bardzo rzadko spotykane w kodzie. Najczęściej są one potrzebne podczas pracy z grami, mapami czy silnikami gier. 90% programistów nigdy się z tym nie spotyka.
Ale oprócz geometrii programiści czasami muszą używać funkcji algebraicznych. I oczywiście Math
klasa zawiera te najczęstsze:
metoda | Opis |
---|---|
|
pierwiastek kwadratowy za |
|
pierwiastek sześcienny za |
|
potęgowanie:ab |
|
wykładniczy (liczba Eulera podniesiona do potęgi):ea |
|
logarytm naturalny z a :ln(a) |
|
logarytm o podstawie 10 z a :log10(a) |
|
logarytm naturalny z x + 1 :ln(x + 1) |
|
ex-1 |
Jeśli chcesz uzyskać pierwiastek kwadratowy lub sześcienny z liczby, metody sqrt(a)
i cbrt(a)
są do Twojej dyspozycji.
Pierwiastek kwadratowy można obliczyć w następujący sposób:
Math.sqrt(2)
Jeśli chcesz uzyskać pierwiastek z wyższej potęgi, użyj metody potęgowania: a
do potęgi ¼
jest czwarty pierwiastek itd.
Math.pow(2, 0.25)
W przypadku logarytmów i wykładników istnieją metody log(a)
(logarytm naturalny) i exp(x)
(wykładniczy). Aby obliczyć logarytm o podstawie 10, mamy log10(a)
.
Jeśli chcesz, aby logarytm liczby b
był podstawą a
, użyj tej prostej formuły:loga(b) = ln(b) / ln(a)
Przydatne metody
Jeśli wykonujesz obliczenia z bardzo małymi wartościami x
, dwie ostatnie funkcje — log1p()
i expm1()
— mogą ci się przydać.
Podczas dodawania bardzo małych i bardzo dużych double
zmiennych często okazuje się, że bardzo małe wartości są po prostu ignorowane (odrzucane) jako nieistotne. W rzeczywistości stanie się tak, jeśli użyjesz metod log()
i exp()
. Aby rozwiązać ten problem, programiści wymyślili funkcje, które zwracają tylko „małą znaczącą część”
Przykład:
Załóżmy, że chcesz obliczyć logarytm naturalny z 1 + x
, gdzie x
jest . Nie możesz po prostu przekazać tej liczby metodzie , ponieważ jeśli dodasz i , otrzymasz . jest tak małą liczbą, że zostanie całkowicie odrzucona po dodaniu liczb.10-20
log()
1
10-20
1
10-20
Ponieważ matematyka często polega na obliczaniu log()
liczb bliskich 1
, programiści wymyślili sposób obejścia tego problemu: zamiast przekazywania samej liczby do metody, przekaż tylko jej różnicę z 1
.
3. Minimum i maksimum
Dwie bardziej przydatne funkcje to min(a, b)
i max(a, b)
. Jak zapewne już się domyśliłeś, pierwszy zwraca minimum dwie liczby:
Math.min(a, b)
A druga zwraca maksymalnie dwie liczby:
Math.max(a, b)
Po co nam te funkcje, skoro zawsze można napisać, if
a nawet użyć operatora trójskładnikowego (a < b ? a: b)
?
Wszystko zależy od czytelności kodu. Czasami twój kod jest przeładowany if
instrukcjami i chcesz użyć bardziej zwartej notacji. Porównajmy:
Kod | Opis |
---|---|
|
Używanie if-else instrukcji (najdłuższy sposób jej napisania) |
|
Korzystanie z operatora trójskładnikowego Wady: - nieporęczny kod - obliczenia są wykonywane dwukrotnie |
|
To świetny sposób na napisanie tego, ale jest trochę zbędny |
|
Właśnie 🙂 |
4. Minimum i maksimum kilku liczb
Jest jeszcze jeden świetny sposób na użycie metod min()
i max()
.
Aby obliczyć minimum (lub maksimum) kilku liczb lub zmiennych. Wykonywanie zagnieżdżonych wywołań tych metod jest bardzo wygodne.
Oto jak znaleźć minimum 3 liczby:
Math.min(a, Math.min(b, c))
Więc co? To bardzo wygodne: oblicz minimum dwóch liczb, a następnie zwróć minimum tej liczby i trzecią liczbę.
Minimum cztery liczby uzyskuje się w ten sam sposób:
Math.min(a, Math.min(b, Math.min(с, d)))
To powiedziawszy, możemy napisać tę formułę nieco jaśniej:
Math.min(Math.min(a, b), Math.min(c, d))
To wszystko działa tak samo dla max()
metody.
Użycie if-else
operatora lub operatora trójskładnikowego sprawiłoby, że te fragmenty kodu byłyby nieco bardziej kłopotliwe. Ale użycie metod min()
i max()
jest po prostu idealne.