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

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

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

4.1 Həqiqi rəqəmlərin yuvarlaqlanması

Həqiqi (ondalıq) ədədlər ingiliscə floating point number — yəni üzən nöqtəli rəqəmlər adlanır: ABŞ-da rəqəmin tam və ondalıq hissələrini ayırmaq üçün nöqtə işlədilir. Buna görə də float adı yaranmışdır.

Daha öncə öyrəndiyimiz kimi, həqiqi rəqəm (float) tam ədədə (int) çevrilərkən, həmişə aşağıya doğru yuvarlaqlanır — onun ondalıq hissəsi sadəcə atılır. Amma belə bir vəziyyəti təsəvvür etmək asandır ki, ondalıq rəqəmi sadəcə ən yaxın tam ədədə yuvarlaqlamaq lazım olsun. Belə bir halda nə etməli?

Bunun üçün Python-da round() adlı daxili funksiya var. Bu funksiya math kitabxanası yaradılmadan öncə düşünüldüyü üçün ora daxil edilmir. Aşağı yuvarlaqlama və yuxarı yuvarlaqlama üçün funksiyalar isə math kitabxanasında yer alır.

round() funksiyası rəqəmi ən yaxın tam ədədə yuvarlaqlayır:


round(hesablama_rəqəmi)

Bu funksiya daxil edilən həqiqi rəqəmi ən yaxın tam ədədə qaytaracaq. Vacibdir ki, əgər rəqəmin ondalıq hissəsi 0.5-ə bərabərdirsə, round() funksiyası ən yaxın cüt tam ədədə yuvarlaqlama metodundan istifadə edir. Buna "bank yuvarlaqlaması" deyilir və çoxsaylı yuvarlaqlama zamanı sistematik səhvi azaltmağa imkan verir. Məsələn:

Nümunələr:

Komanda Nəticə
x = round(4.1) 4
x = round(4.5) 4
x = round(4.9) 5
x = round(5.5) 6
math.ceil() funksiyası isə ədədi yuxarı yuvarlaqlayır, nümunələr:
Komanda Nəticə
x = math.ceil(4.1) 5
x = math.ceil(4.5) 5
x = math.ceil(4.9) 5

math.floor() funksiyası isə ədədi aşağı yuvarlaqlayır, nümunələr:

Komanda Nəticə
x = math.floor(4.1) 4
x = math.floor(4.5) 4
x = math.floor(4.9) 4

Amma ədədi aşağı yuvarlaqlamaq üçün sadəcə tip çevirmə funksiyası int()-dən istifadə etmək daha asandır:

Komanda Nəticə
x = int(4.9) 4

Əgər bu komandaları yadda saxlamaq çətindirsə, sizə bir az ingiliscə dərs kömək edəcək:

  • math — riyaziyyat
  • round — dairələşdirmək/yuvarlaqlamaq
  • ceiling — tavan
  • floor — döşəmə

4.2 Float nömrələr sisteminin quruluşu

Python-da float tipi -1.7*10308-dən +1.7*10308-ə qədər olan dəyərləri saxlaya bilər. Belə böyük bir diapazonun olma səbəbi, float tipinin tam növlərlə müqayisədə tamamilə fərqli bir şəkildə qurulmasıdır. Hər bir float dəyişəni iki ədəd saxlayır: birincisi mantisa adlanır, ikincisi isə qüvvət.

Tutaq ki, bizdə 123456789 rəqəmi var və onu float tipində bir dəyişəndə saxladıq. Onda bu rəqəm aşağıdakı formata çevriləcək: 1.23456789*108float növü daxilində iki ədəd saxlanılacaq: 234567898. Qırmızı ilə “rəqəmin əhəmiyyətli hissəsi” (mantisa), yaşıl ilə isə qüvvət göstərilib.

Bu yanaşma həm çox böyük, həm də çox kiçik rəqəmləri saxlamağa imkan verir. Amma çünki rəqəmin ölçüsü 8 baytla (64 bit) məhduddur və bəzi bitlər qüvvəti (həmçinin rəqəmin işarəsi və qüvvətin işarəsi) saxlamaq üçün istifadə edilir, mantisanın maksimal uzunluğu 15 rəqəmlə məhdudlaşdırılıb.

Bu çox sadələşdirilmiş bir təsviridir, daha ətraflı məlumat üçün Google-dan axtarış edə bilərsiniz.

4.3 Üzlük ədədlərlə iş zamanı dəqiqlik itkisi

Üzlük ədədlərlə işləyəndə hər zaman nəzərə almaq lazımdır ki, üzlük ədədlər — dəqiq deyillər. Həmişə olacaq yuvarlaqlaşdırma xətaları, çevrilmə xətaları ondalıq sistemdən ikilik sistemə və nəhayət, ən yayğın vəziyyət — dəqiqliyin itkisi sayların çox fərqli ölçülərdə toplama/çıxması zamanı.

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

Əgər 109 ədədindən 1/109 çıxsaq, yenidən 109 alarıq.

Çox fərqli ölçülü ədədlərin çıxılması İzah

1000000000.000000000 - 0.000000001 1000000000.000000000 
İkinci ədəd çox kiçikdir və onun mötəbər hissəsi nəzərə alınmır (boz rəng ilə seçilib). Narıncı rəng ilə 15 mötəbər rəqəm göstərilib.

Bura nə deyəsən, proqramlaşdırma — riyaziyyat deyil.

4.4 Ondalıq ədədlərin müqayisəsində təhlükə

Proqramçılar ondalıq ədədlərin müqayisəsində əlavə bir təhlükə ilə üzləşirlər. Çünki bu ədədlərlə işləyərkən yuvarlaqlaşdırma səhvləri toplanır, nəticədə bəzən ondalıq ədədlər bərabər olmalı olduğu halda, bərabər olmurlar. Və ya əksinə: ədədlər bərabər olmamalıdır, lakin bərabər çıxır.

Nümunə:

Əmr İzah
a = 1000000000.0 b = 0.000000001 c = a – b

a dəyişənində dəyər 1000000000.0 olacaq

c dəyişənində dəyər 1000000000.0 olacaq

(b dəyişənindəki ədəd çox kiçikdir)

Yuxarıdakı nümunədə a və c bərabər olmamalıdır, amma bərabərdirlər.

Başqa bir nümunə götürək:

Əmr İzah
a = 1.00000000000000001 b = 1.00000000000000002

a dəyişənində dəyər 1.0 olacaq

b dəyişənində dəyər 1.0 olacaq

Praktikada ondalıq ədədlər aşağıdakı qaydada müqayisə olunurlar:

Hər hansı çox kiçik bir ədəd götürülür. Əgər ədədlərin fərqi (modul üzrə) bu kiçik ədəddən az olarsa, onlar bərabər hesab edilirlər. Nümunə:


a = 0.00000000012
b = 0.000000000011 

if abs(a - b) < 0.00001:
    print("bərabərdirlər")
else:
    print("bərabər deyillər")
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION