4.1 Həqiqi rəqəmlərin yuvarlaqlanması
Həqiqi (ondalıq) ədədlər ingiliscə float
ing 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
— riyaziyyatround
— dairələşdirmək/yuvarlaqlamaqceiling
— tavanfloor
— 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*108 və float
növü daxilində iki ədəd saxlanılacaq: 23456789 və 8. 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 |
---|---|
|
İ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")
GO TO FULL VERSION