1. Тригонометрични функции в Java
Когато изучавахме закръгляването на числа по-рано, се запознахме с Math
класа и някои от неговите методи. Сега ще разгледаме този клас по-подробно.
Както подсказва името, Math
класът съдържа методи за математическите операции, които най-често се използват от програмистите. Ето най-интересните от тях:
Метод | Описание | |
---|---|---|
|
Връща синуса на ъгъла d в радиани |
|
|
Връща косинуса на ъгъла d в радиани |
|
|
Връща тангенса на ъгъла d в радиани |
|
|
Връща арксинуса | |
|
Връща аркосинуса | |
|
Връща аркутангенса | |
|
Връща хиперболичния синус | |
|
Връща хиперболичния косинус | |
|
Връща хиперболичния тангенс |
Методите , и вземат ъгъл, изразен в радиани. За преобразуване на ъгъл от градуси в радиани и обратно, класът предлага два специални метода:Math.sin()
Math.cos()
Math.tan()
Math
Метод | Описание |
---|---|
|
Преобразува ъгъл от градуси в радиани |
|
Преобразува ъгъл от радиани в градуси |
Между другото, в допълнение към методите, Math
класът има и две постоянни променливи (статични полета на класа):
Константа | Описание |
---|---|
|
Константата "Pi" е равна на3.141592653589793 |
|
Константата "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
класът съдържа най-често срещаните:
Метод | Описание |
---|---|
|
корен квадратен отa |
|
кубичен корен отa |
|
степенуване:ab |
|
експоненциален (числото на Ойлер, повишено на степен):ea |
|
натурален логаритъм от a :ln(a) |
|
логаритъм с основа 10 от a :log10(a) |
|
натурален логаритъм от x + 1 :ln(x + 1) |
|
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-20
log()
1
10-20
1
10-20
Тъй като математиката често включва изчисляване на log()
числа, близки до 1
, програмистите измислиха начин да заобиколят този проблем: instead of да предават самото число на метода, предават само разликата му от 1
.
3. Минимум и максимум
Още две полезни функции са min(a, b)
и max(a, b)
. Както вероятно вече се досещате, първото връща минимума от две числа:
Math.min(a, b)
А второто връща максимума от две числа:
Math.max(a, b)
Защо се нуждаем от тези функции, когато винаги можете да напишете if
or дори да използвате троичния оператор (a < b ? a: b)
?
Всичко опира до четливостта на codeа. Понякога вашият code е претоварен с if
изрази и искате да използвате по-компактна нотация. Да сравним:
Код | Описание |
---|---|
|
Използване на if-else изявление (най-дългият начин да го напишете) |
|
Използване на троичния оператор Минуси: - обемист code - изчисленията се извършват два пъти |
|
Това е чудесен начин да го напишете, но е малко излишен |
|
Точно 🙂 |
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()
е просто перфектно.
GO TO FULL VERSION