Math Sinfi

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

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
double sin(double d)
d radianda verilmiş bucağın sinusunu qaytarır
double cos(double d)
d radianda verilmiş bucağın kosinusunu qaytarır
double tan(double d)
d radianda verilmiş bucağın tangensini qaytarır
double asin(double d)
Arcsinus qaytarır
double acos(double d)
Arccosinus qaytarır
double atan(double d)
Arctangens qaytarır
double sinh(double d)
Hiperbolik sinus qaytarır
double cosh(double d)
Hiperbolik kosinus qaytarır
double tanh(double d)
Hiperbolik tangens qaytarır

Math.sin(), Math.cos()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
double toRadians(double angdeg)
Bucağı dərəcədən radiana çevirir
double toDegrees(double angrad)
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
double Math.PI
“Pi” sayı 3.141592653589793 bərabərdir
double Math.E
“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
double sqrt(double a)
a dəyərinin kvadrat kökü
double cbrt(double a)
a dəyərinin kub kökü
double pow(double a, double b)
dərəcəyə yüksəltmə: ab
double exp(double a)
eksponent: ea
double log(double a)
təbiət logaritmi a: ln(a)
double log10(double a)
a-nin onluq logaritmi: log10a
double log1p(double x)
təbiət logaritmi x + 1: ln(x + 1)
double expm1(double x)
ex-1

Əgər sizə hər hansı bir ədədin kvadrat və ya kub kökü lazımdırsa, sqrt(a)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()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()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 110-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)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
int x = 0;
if (x-5+y*20 < x*x+y*y)
   x = x-5+y*20;
else
   x = x*x+y*y;
Ən uzun if-else formul yazısı
int x = x-5+y*20 < x*x+y*y ? x-5+y*20 : x*x+y*y;
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
int a = x-5+y*20;
int b = x*x+y*y;
int x = a < b ? a : b;
Yaxşı yazı, amma bir az artıqdır
int x = Math.min(x-5+y*20, x*x+y*y);
Tam ideal 🙂

4. Bir neçə ədədin minimumu və maksimumu

min()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()max() funksiyalarından istifadə ən ideal həll yoludur.


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION