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()
— просто ідеальне рішення.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ