1. Тригонометричні функції в Java
Раніше, коли ми вивчали округлення чисел, ми познайомилися з класом Math і деякими його методами. Зараз ми розглянемо цей клас більш детально.
У класі Math, на що якби натякає ця назва, зібрані найбільш часто вживані програмістами математичні функції. Ось деякі з них:
| Метод | Опис | |
|---|---|---|
|
Повертає синус кута d, заданого в радіанах |
|
|
Повертає косинус кута d, заданого в радіанах |
|
|
Повертає тангенс кута d, заданого в радіанах |
|
|
Повертає арксинус | |
|
Повертає арккосинус | |
|
Повертає арктангенс | |
|
Повертає гіперболічний синус | |
|
Повертає гіперболічний косинус | |
|
Повертає гіперболічний тангенс | |
Функції Math.sin(), Math.cos() і Math.tan() приймають кут, заданий в радіанах. Щоб перетворити кути з градусів в радіани і навпаки, у класі Math є дві спеціальні функції:
| Метод | Опис |
|---|---|
|
Перетворює кут з градусів у радіани |
|
Перетворює кут з радіан у градуси |
У класі Math, до речі, є не лише функції, але й дві змінні-константи (статичні поля класу):
| Константа | Опис |
|---|---|
|
Число «Пі» дорівнює 3.141592653589793 |
|
Число «Е» дорівнює 2.718281828459045 |
Усі ці функції можуть бути вам дуже корисні, якщо ви вирішите писати свої ігри, працювати з графікою, ну або просто підрахувати довжину шляху по карті.
Наприклад, якщо ви хочете обчислити sin(45°), ось як можна це зробити:
Math.sin( Math.toRadians(45) )
Приклад використання:
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. Алгебраїчні функції в Java
У більшості випадків програмісту вистачає шкільної математики: навіть синуси та косінуси в коді трапляються дуже рідко. В основному вони потрібні при роботі з іграми, картами або ігровими рушіями. 90% програмістів з цим ніколи не стикаються.
Але, крім геометрії, програмістам іноді доводиться використовувати і алгебраїчні функції. І, звісно ж, клас Math містить найпоширеніші з них:
| Метод | Опис |
|---|---|
|
квадратний корінь із a |
|
кубічний корінь із a |
|
піднесення до степеня: ab |
|
експонента: ea |
|
натуральний логарифм a: ln(a) |
|
десятковий логарифм a: log10a |
|
натуральний логарифм x + 1: ln(x + 1) |
|
ex-1 |
Якщо вам потрібний квадратний або кубічний корінь із числа, для цього є функції sqrt(a) і cbrt(a).
Корінь із двох можна обчислити так:
Math.sqrt(2)
Якщо ви хочете отримати корінь вищого ступеня, скористайтеся функцією піднесення до степеня: a у ступені ¼ — це і буде корінь четвертого ступеня тощо.
Math.pow(2, 0.25)
Для роботи з логарифмами та експонентами є функції log(a) – натуральний логарифм і exp(x) — експонента. Для обчислення десяткового логарифму є функція log10(a).
Якщо вам потрібен логарифм числа b за основою a, скористайтеся простою формулою: logab = ln(b) / ln(a)
Корисні функції
Останні дві функції log1p() і expm1() можуть бути вам корисні, якщо ви проводите обчислення при дуже малих значеннях x.
При складанні дуже малих і дуже великих double змінних часто може виникнути ситуація, коли дуже мале значення просто ігнорується (відкидається) як несуттєве. Це, власне, й буде відбуватися, якщо використовувати функції log() та exp(). Тому програмісти придумали функції, які повертають лише ту саму «маленьку суттєву частину»
Приклад:
Ви хочете підрахувати натуральний логарифм від 1 + x, де х дорівнює 10-20. Ви просто не зможете передати це число в функцію log(), т.к. якщо скласти 1 і 10-20, вийде 1. 10-20 — настільки мале число, що буде відкинуте повністю при складанні чисел.
А т.к. в математиці часто доводиться обчислювати log() при числах, близьких до 1, програмісти придумали спосіб обійти цю проблему: передати в функцію не саме число, а лише його різницю від 1.
3. Мінімум та максимум
І ще дві корисні функції — це функції min(a, b) і max(a, b). Перша, як ви вже, напевно, здогадались, повертає мінімум із двох чисел:
Math.min(a, b)
А друга — максимум із двох чисел:
Math.max(a, b)
Навіщо ж потрібні ці функції, якщо завжди можна написати if або навіть використовувати тернарний оператор a < b ? a : b
Все діло в читабельності коду. Інколи код і так перевантажений if-ами і хочеться використовувати більш компактний запис. Порівняйте:
| Код | Опис |
|---|---|
|
Найдовший запис формули через if-else |
|
Записати через тернарний оператор. Мінуси: – громіздкий код – двічі виконуються обчислення |
|
Гарний запис, але трохи надмірний |
|
Чудово 🙂 |
4. Мінімум та максимум із кількох чисел
Є ще одне корисне застосування функцій min() і max().
Це обчислення мінімуму (або максимуму) із кількох чисел або змінних. Функції дуже зручно викликати одна в одній.
Ось як можна записати мінімум із 3-х чисел:
Math.min(a, Math.min(b, c))
А що? Дуже зручно: обчислюємо мінімум пари чисел, а потім повертаємо менше число із знайденого та залишеного.
Мінімум із чотирьох чисел виходить аналогічно:
Math.min(a, Math.min(b, Math.min(с, d)))
Хоча можна цю формулу записати трохи зрозуміліше:
Math.min(Math.min(a, b), Math.min(c, d))
Для функції max() все аналогічно.
Використання оператора if-else або тернарного оператора зробило би ці записи трохи громіздкими. А використання функцій min() і max() — просто ідеальне рішення.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ