CodeGym /Kurslar /Frontend SELF AZ /Həqiqi ədədlərlə işləmək

Həqiqi ədədlərlə işləmək

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

1.1 Üzlük rəqəmlərin yuvarlaqlaşdırılması

Üzlük (kəsrli) rəqəmlər ingiliscə floating point number – üzlük nöqtəli rəqəmlər adlanır: ABŞ-da rəqəmin tam və kəsrli hissəsi arasında nöqtə istifadə olunur. Buna görə də adı float buradan gəlir.

Bildiyimiz kimi, üzlük nömrəni (float) tam nömrəyə (int) çevirdikdə, həmişə aşağını yuvarlaqlaşdırır — kəsrli hissəsi sadəcə atılır. Amma elə bir vəziyyət təsəvvür etmək asandır ki, kəsrli rəqəmi ən yaxın tam ədədə və ya ümumiyyətlə yuxarıya yuvarlaqlaşdırmaq lazımdır. Nə etməli?

Bu cür hallarda JavaScript-də round() adlı daxili funksiya var. O, Math kitabxanası yaradılmadan əvvəl icad edilmişdir, buna görə də o, ora daxil deyil. Ancaq aşağı yuvarlaqlaşdırma və yuxarı yuvarlaqlaşdırma funksiyaları math kitabxanasındadır.

Math.round() funksiyası

Math.round() funksiyası rəqəmi ən yaxın tam ədədə yuvarlaqlaşdırır:

    
      Math.round(üzlük_rəqəm)
    
  

Bu funksiya ona ötürülmüş üzlük rəqəmə ən yaxın olan tam ədədi qaytaracaq.

Nümunələr:

Komanda Nəticə
let x = Math.round(4.1); 4
let x = Math.round(4.5); 5
let x = Math.round(4.9); 5

Math.ceil() funksiyası

Math.ceil() funksiyası rəqəmi tam ədədə qədər yuxarı yuvarlaqlaşdırır:

Komanda Nəticə
let x = Math.ceil(4.1); 5
let x = Math.ceil(4.5); 5
let x = Math.ceil(4.9); 5

Math.floor() funksiyası

Math.floor() funksiyası rəqəmi tam ədədə qədər aşağı yuvarlaqlaşdırır:

Komanda Nəticə
let x = Math.floor(4.1); 4
let x = Math.floor(4.5); 4
let x = Math.floor(4.9); 4

Əgər bu komandaları yadda saxlamaq çətin gəlirsə, sizə kiçik ingilis dili dərsi kömək edəcək:

  • math — riyaziyyat
  • round — dairə/yuvarlaqlaşdırmaq
  • ceiling — tavan
  • floor — döşəmə

1.2 Üzən nöqtəli ədədlərin quruluşu

JavaScript-də number tipi -1.7*10308 ilə +1.7*10308 aralığında olan qiymətləri yadda saxlaya bilər. Bu qədər böyük aralığın səbəbi, number tipinin bütöv ədədlərdən fərqli bir şəkildə qurulmasıdır. number tipindəki hər dəyişən iki ədəd saxlayır: birincisi mantisa, ikincisi isə — dərəcə.

Tutaq ki, bizim 123456789 ədədimiz var və onu number tipində bir dəyişəndə saxlamışıq. O zaman bu ədəd 1.23456789*108 formasına çevrilir və number tipində iki ədəd saxlanılır — 1.234567898. Qırmızı ilə «ədədin mənalı hissəsi» (mantisa), mavi ilə isə dərəcə qeyd olunub.

Bu yanaşma həm çox böyük, həm də çox kiçik ədədləri saxlamağa imkan verir. Amma ədədin ölçüsü 8 bayt (64 bit) ilə məhdudlaşdığı üçün bir hissə dərəcənin (həmçinin ədədin işarəsi və dərəcənin işarəsinin) saxlanılmasına sərf olunur, nəticədə mantisanın maksimal uzunluğu 15 rəqəmlə məhdudlaşır.

Bu, həqiqi ədədlərin quruluşunun çox sadələşdirilmiş təsviridir: daha ətraflı məlumatı bu keçiddə tapa bilərsiniz.

1.3 Həqiqi ədədlərlə iş zamanı dəqiqlik itkisi

Həqiqi ədədlərlə işləyərkən həmişə nəzərə almaq lazımdır ki, həqiqi ədədlər — dəqiq deyil. Həmişə yuvarlaqlaşdırma xətaları, çevrilmə xətaları onluq sistemdən ikilik sistemə və nəhayət, ən çox rast gəlinən hal — dəqiqlik itkisi çox müxtəlif ölçülü ədədlərin toplanıb/çıxılması zamanı baş verir.

Sonuncu vəziyyət, proqramlaşdırmada yeni olanlar üçün ən gözlənilməzdir.

Əgər 109 ədədindən 1/109 çıxarsa, yenidən 109 alacağıq.

Çox müxtəlif ölçülü ədədlərin çıxılması İzah
1000000000.000000000
-      0.000000001
1000000000.000000000
İkinci ədəd çox kiçikdir və onun məna kəsb edən hissəsi (boz rəngdə göstərilib) nəzərə alınmır. Qırmızı ilə 15 məna kəsb edən rəqəm göstərilib.

Burada nə demək olar, proqramlaşdırma — riyaziyyat deyil.

1.4 Üzdəyişən ədədlərin müqayisəsində təhlükə

Üzdəyişən ədədlərin müqayisəsində proqramçılara başqa bir təhlükə də gözləyir. Bu ədədlərlə iş zamanı yuvarlama səhvləri toplana bilər ki, nəticədə elə hallar yaranar ki, üzdəyişən ədədlər bərabər olmalıdır, amma onlar bərabər deyil. Əksinə: ədədlər bərabər olmamalıdır, amma onlar bərabərdir.

Nümunə:

Komanda İzah
let a = 1000000000.0
let b = 0.000000001
let c = a – b
a dəyişəni 1000000000.0 dəyərinə malik olacaq.
c dəyişəni 1000000000.0 dəyərinə malik olacaq
(b dəyişənindəki ədəd çox kiçikdir).

Yuxarıdakı nümunədə ac bərabər olmamalıdır, amma onlar bərabərdir.

Başqa bir nümunəyə baxaq:

Komanda İzah
let a = 1.00000000000000001
let b = 1.00000000000000002
a dəyişəni 1.0 dəyərinə malik olacaq.
b dəyişəni 1.0 dəyərinə malik olacaq.

Təcrübədə üzdəyişən ədədlər belə müqayisə olunur:

Əgər ədədlərin fərqi (modulu üzrə) hansısa çox kiçik bir ədəddən azdırsa, onlar bərabər sayılır.

Nümunə:

JavaScript
    
      let a = 0.00000000012;
      let b = 0.000000000011;

      if (Math.abs(a - b) < 0.00001) {
        console.log("bərabərdir");
      } else {
        console.log("bərabər deyil");
      }
    
  
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION