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).
Корень из двух можно вычислить так:
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() — просто идеальное решение.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ