1. Java-da Trigonometrik Funksiyalar
Əvvəlcə, rəqəmlərin yuvarlaqlaşdırılmasını öyrənəndə, Math
sinfi və onun bəzi metodları ilə tanış olduq. İndi isə bu sinfi daha ətraflı nəzərdən keçirəcəyik.
Math
sinfində, adından da göründüyü kimi, proqramçıların ən çox istifadə etdiyi riyazi funksiyalar toplanıb. Onlardan ən maraqlıları bunlardır:
Metod | Təsvir | |
---|---|---|
|
d radianda verilmiş bucağın sinusunu qaytarır |
|
|
d radianda verilmiş bucağın kosinusunu qaytarır |
|
|
d radianda verilmiş bucağın tangensini qaytarır |
|
|
Arcsinus qaytarır | |
|
Arccosinus qaytarır | |
|
Arctangens qaytarır | |
|
Hiperbolik sinus qaytarır | |
|
Hiperbolik kosinus qaytarır | |
|
Hiperbolik tangens qaytarır |
Math.sin()
, Math.cos()
və Math.tan()
funksiyaları bucağı radianda qəbul edir. Bucaqları dərəcədən radiana və ya tərsinə çevirmək üçün Math
sinfində iki xüsusi funksiya mövcuddur:
Metod | Təsvir |
---|---|
|
Bucağı dərəcədən radiana çevirir |
|
Bucağı radiandan dərəcəyə çevirir |
Math
sinfində, əslində, təkcə funksiyalar deyil, həm də iki sabit dəyişən (sinfin statik sahələri) mövcuddur:
Sabit | Təsvir |
---|---|
|
“Pi” sayı 3.141592653589793 bərabərdir |
|
“E” sayı 2.718281828459045 bərabərdir |
Bu funksiyalar sizə oyunlar yazmaq, qrafik üzərində işləmək, ya da sadəcə xəritə üzərində yolun uzunluğunu hesablamaq lazım gələndə çox faydalı ola bilər.
Məsələn, əgər siz sin(45°)
hesablamaq istəyirsinizsə, bunu belə edə bilərsiniz:
Math.sin( Math.toRadians(45) )
İstifadə nümunəsi:
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-da Cəbr funksiyaları
Əksər hallarda proqramçıya məktəb səviyyəsində riyaziyyat kifayətdir: hətta sinus və kosinus kodda çox nadir hallarda rast gəlinir. Əsasən bunlar oyunlar, xəritələr və ya oyun mootorları ilə işləmək üçün lazım olur. Proqramçıların 90%-i bununla heç vaxt qarşılaşmır.
Ancaq həndəsədən başqa, proqramçılar bəzən cəbr funksiyalarından da istifadə etməli olurlar. Və əlbəttə ki, Math
klassı onların ən geniş yayılmışlarını ehtiva edir:
Metod | Təsvir |
---|---|
|
a dəyərinin kvadrat kökü |
|
a dəyərinin kub kökü |
|
dərəcəyə yüksəltmə: ab |
|
eksponent: ea |
|
təbiət logaritmi a : ln(a) |
|
a -nin onluq logaritmi: log10a |
|
təbiət logaritmi x + 1 : ln(x + 1) |
|
ex-1 |
Əgər sizə hər hansı bir ədədin kvadrat və ya kub kökü lazımdırsa, sqrt(a)
və cbrt(a)
funksiyalarından istifadə edə bilərsiniz.
İki qat kökü belə hesab edə bilərsiniz:
Math.sqrt(2)
Daha yüksək kök dərəcəsi almaq istəyirsinizsə, dərəcəyə yüksəltmə funksiyasından istifadə edin: a
-nın ¼
qüvvəti dördüncü dərəcəli kök olacaq və s.
Math.pow(2, 0.25)
Logaritmlər və eksponentlərlə işləmək üçün log(a)
– təbiət logaritmi və exp(x)
— eksponent funksiyalar mövcuddur. Onluq logaritm tapmaq üçün log10(a)
funksiya istifadə edə bilərsiniz.
Əgər sizə logab
bazasında b
-nin logaritmi lazımdırsa, sadə formuldan istifadə edin: logab = ln(b) / ln(a)
Faydalı funksiyalar
Son iki funksiya log1p()
və expm1()
sizə x
-in çox kiçik dəyərləri ilə hesablamalar zamanı faydalı ola bilər.
Çox kiçik və çox böyük double
dəyişənləri topladıqda tez-tez belə bir vəziyyət yarana bilər ki, çox kiçik dəyər sadəcə əhəmiyyətli olmayan kimi nəzərə alınmır (atılır). Əgər log()
və exp()
funksiyalarını istifadə etsək, məhz bu baş verəcək. Buna görə də, yalnız həmin "kiçik əhəmiyyətli hissə"ni qaytaran funksiyalar yaradılmışdır.
Nümunə:
1 + x
üçün təbiət logaritmi hesablanmalı olduqda, burada х
10-20
bərabərdir. Siz bu dəyəri log()
funksiyasına ötürə bilməzsiniz, çünki 1
və 10-20
toplandıqda, nəticə 1
olacaq. 10-20
çox kiçik bir dəyər olduğundan toplama zamanı tamamilə atılacaq.
Və riyaziyyatda tez-tez log()
-ni 1
-ə yaxın olan dəyərlərlə hesablamaq lazım olduğundan, proqramçılar bu problemi aradan qaldırmaq üçün bir yol tapdılar: funksiyaya nəinki dəyərin özü, həm də yalnız 1
-dən fərqli olan hissəsini ötürmək.
3. Minimum və maksimum
Bundan başqa iki faydalı funksiya da var — min(a, b)
və max(a, b)
funksiyaları. Birincisi, yəqin ki, artıq təxmin etmisiniz, iki ədədin minimumunu qaytarır:
Math.min(a, b)
İkincisi isə iki ədədin maksimumunu qaytarır:
Math.max(a, b)
Bəs bu funksiyalar niyə lazımdır, əgər hər zaman if
yaza bilsək ya da hətta ternary operatoru a < b ? a : b
istifadə edə bilsək?
Məsələ kodun oxunaqlığındadır. Bəzən kod if
-lərlə doludur və daha yığcam yazı üsulu istifadə etmək istəyirsən. Müqayisə edin:
Kod | Təsvir |
---|---|
|
Ən uzun if-else formul yazısı |
|
Ternary operatoru ilə belə yazılır. Mənfi cəhətləri: – kod hələ də çoxqarışıqdır – hesablamalar iki dəfə yerinə yetirilir |
|
Yaxşı yazı, amma bir az artıqdır |
|
Tam ideal 🙂 |
4. Bir neçə ədədin minimumu və maksimumu
min()
və max()
funksiyalarının daha bir faydalı istifadəsi var.
Bu, bir neçə ədədin və ya dəyişənin minimumunu (və ya maksimumunu) hesablamaqdır. Funksiyaları bir-birinin içində çağırmaq çox rahatdır.
3 ədədin minimumunu bu cür yaza bilərik:
Math.min(a, Math.min(b, c))
Necə? Çox rahatdır: iki ədədin minimumunu hesablayırıq, sonra tapılmış ədəd ilə qalan ədədin daha kiçik olanını qaytarırıq.
Dörd ədədin minimumunu da oxşar şəkildə hesablaya bilərik:
Math.min(a, Math.min(b, Math.min(с, d)))
Ancaq bu formulu bir az aydın şəkildə də yaza bilərik:
Math.min(Math.min(a, b), Math.min(c, d))
max()
funksiyası üçün də eyni üsul tətbiq edilir.
if-else
operatorundan və ya ternar operatoru-dan istifadə bu ifadələri bir az daha mürəkkəb edərdi. Amma min()
və max()
funksiyalarından istifadə ən ideal həll yoludur.
GO TO FULL VERSION