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
Константата "Pi" е равна на3.141592653589793
double Math.E
Константата "E" е равна на2.718281828459045

Всички тези функции могат да ви бъдат много полезни, ако решите да пишете свои собствени игри, да работите с графики or просто да изчислявате дължината на пътека върху карта.

Например, ако искате да изчислите sin(45°), ето How да го направите:

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

В повечето случаи гимназиалната математика е достатъчна за програмист: дори синуси и косинуси много рядко се срещат в codeа. Най-често те са необходими при работа с игри, карти or игрови двигатели. 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)
логаритъм с основа 10 от a:log10(a)
double log1p(double x)
натурален логаритъм от x + 1:ln(x + 1)
double expm1(double x)
ex-1

Ако искате квадратен or кубичен корен от число, методите sqrt(a)и cbrt(a)са на ваше разположение.

Квадратният корен може да се изчисли, Howто следва:

Math.sqrt(2)

Ако искате да получите корен на по-висока степен, използвайте метода на степенуване: aна степен ¼е четвъртият корен и т.н.

Math.pow(2, 0.25)

За логаритми и експоненти съществуват методите log(a)(натурален логаритъм) и exp(x)(експоненциален). За да изчислим логаритъма с основа 10, имаме log10(a).

Ако искате логаритъмът на число bда се базира на a, използвайте тази проста формула:loga(b) = ln(b) / ln(a)

Полезни методи

Ако извършвате изчисления, включващи много малки стойности на x, тогава последните две функции — log1p()и expm1()— може да са ви полезни.

Когато добавяте много малки и много големи doubleпроменливи, често ще откриете, че много малки стойности просто се игнорират (изхвърлят) като незначителни. Всъщност това ще се случи, ако използвате методите log()и exp(). За да разрешат това, програмистите излязоха с функции, които връщат само „малката значима част“

Пример:

Да предположим, че искате да изчислите натурален логаритъм от 1 + x, където xе . Не можете просто да предадете това число на метода, тъй като ако добавите и , получавате . е толкова малко число, че ще бъде напълно изхвърлено, когато числата се добавят.10-20log()110-20110-20

Тъй като математиката често включва изчисляване на log()числа, близки до 1, програмистите измислиха начин да заобиколят този проблем: instead of да предават самото число на метода, предават само разликата му от 1.



3. Минимум и максимум

Още две полезни функции са min(a, b)и max(a, b). Както вероятно вече се досещате, първото връща минимума от две числа:

Math.min(a, b)

А второто връща максимума от две числа:

Math.max(a, b)

Защо се нуждаем от тези функции, когато винаги можете да напишете ifor дори да използвате троичния оператор (a < b ? a: b)?

Всичко опира до четливостта на codeа. Понякога вашият code е претоварен с 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;
Използване на троичния оператор Минуси:
- обемист code
- изчисленията се извършват два пъти
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().

За изчисляване на минимума (or максимума) на няколко числа or променливи. Много е удобно да правите вложени извиквания към тези методи.

Ето How да намерите минимума от 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оператор or троичен оператор би направило тези codeови фрагменти малко по-тромави. Но използването на методите min()и max()е просто перфектно.