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).
Корінь із числа 2 можна обчислити так:
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() — просто ідеальне рішення.