1. Тригонометричні функції в Java

Раніше, вивчаючи округлення чисел, ми ознайомилися з класом Math і деякими його методами. Зараз ми розглянемо цей клас докладніше.

У класі Math, на що нібито натякає ця назва, зібрано найбільш вживані програмістами математичні функції. Ось найцікавіші з них:

Метод Опис
double sin(double d)
Повертає синус кута d, заданого в радіанах
double cos(double d)
Повертає косинус кута d, заданого в радіанах
double tan(double d)
Повертає тангенс кута d, заданого в радіанах
double asin(double d)
Повертає арксинус
double acos(double d)
Повертає арккосинус
double atan(double d)
Повертає арктангенс
double sinh(double d)
Повертає гіперболічний синус
double cosh(double d)
Повертає гіперболічний косинус
double tanh(double d)
Повертає гіперболічний тангенс

Функції Math.sin(), Math.cos() і Math.tan() отримують кут, заданий в радіанах. Щоб перетворити кути з градусів у радіани й навпаки, у класі Math є дві спеціальні функції:

Метод Опис
double toRadians(double angdeg)
Перетворює кут із градусів у радіани
double toDegrees(double angrad)
Перетворює кут із радіанів у градуси

До речі, у класі Math є не тільки функції, а ще й дві змінні-константи (статичні поля класу):

Константа Опис
double Math.PI
Число «Пі», що дорівнює 3.141592653589793
double Math.E
Число «Е», що дорівнює 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 містить найпоширеніші з них:

Метод Опис
double sqrt(double a)
квадратний корінь із a
double cbrt(double a)
кубічний корінь із a
double pow(double a, double b)
піднесення до степеня: ab
double exp(double a)
експонента: ea
double log(double a)
натуральний логарифм a: ln(a)
double log10(double a)
десятковий логарифм a: log10a
double log1p(double x)
натуральний логарифм x + 1: ln(x + 1)
double expm1(double x)
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-ами, і хочеться використати компактніший запис. Порівняйте:

Код Опис
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Найдовший запис формули за допомогою if-else
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
Запис за допомогою тернарного оператора. Мінуси:
– громіздкий код
– двічі виконуються обчислення
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Хороший запис, але трохи надлишковий
int x = Math.min(x-5+y*20, x*x+y*y);
В самий раз

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() — просто ідеальне рішення.