Məzmun:
Şəkil: http://pikabu.ru/
Giriş
Java dilini öyrəndiyim ilk günlərdə mən üzən nöqtə nömrələri kimi maraqlı tipli primitivlərlə rastlaşdım. Məni dərhal onların xüsusiyyətləri və daha çox, ikili kodla yazılma tərzi (bir-biri ilə əlaqəli) maraqlandırdı. Hər hansı bir tam ədəd diapazonundan fərqli olaraq, hətta çox kiçik diapazonda (məsələn, 1-dən 2-yə qədər) onların sonsuz sayda var. Sonlu yaddaş ölçüsünə malik olmaqla, bu çoxluğu ifadə etmək mümkün deyil. Beləliklə, onlar binar sistemdə necə ifadə olunur və necə işləyirlər?
Təəssüf ki, vikidəki izahatlar və
burada Habré ilə bağlı kifayət qədər sərin məqalə əsasını qoysa da, mənə tam bir anlayış vermədi. Fərq yalnız bu
təhlil məqaləsini oxuduqdan sonra səhər saatlarında oxuduqdan sonra gəldi.
Tarixə ekskursiya
(
Habré-dəki bu məqalədən götürülmüşdür ) 60-70-ci illərdə kompüterlər böyük və proqramlar kiçik olanda hələ də hesablamalar üçün vahid standart, eləcə də üzən nöqtəli ədədin özünü ifadə etmək üçün standart yox idi. Hər bir kompüter bunu fərqli etdi və hər birinin öz səhvləri var idi. Lakin 70-ci illərin ortalarında Intel dəstəklənən “təkmilləşdirilmiş” hesabla yeni prosessorlar hazırlamaq və eyni zamanda onu standartlaşdırmaq qərarına gəldi. Professorlar William Kahan və John Palmer (yox, pivə haqqında kitabların müəllifi deyil) onu inkişaf etdirmək üçün gətirildi. Bir az dram var idi, amma yeni standart hazırlanmışdı. İndi bu standart IEEE754 adlanır
Üzən nöqtəli nömrə formatı
Hətta məktəb dərsliklərində hər kəs 1,2 × 10 3 və ya
1,2 E3 formasında çox böyük və ya çox kiçik rəqəmlərin yazılmasının qeyri-adi üsulu ilə qarşılaşırdı ki , bu da
1,2 × 1000 = 1200- ə bərabərdir . Buna eksponensial qeyd metodu deyilir. Bu halda biz ədədin ifadəsi ilə aşağıdakı düsturdan istifadə edirik:
N=M×n p , burada
- N = 1200 - nəticədə alınan rəqəm
- M = 1,2 - mantis - sifarişləri nəzərə almadan fraksiya hissəsi
- n = 10 sifarişin əsasıdır. Bu vəziyyətdə və kompüterlərdən bəhs etmədiyimiz zaman əsas 10 rəqəmidir
- p = 3 - baza dərəcəsi
Çox vaxt sifarişin əsasının 10 olduğu qəbul edilir
və yalnız mantis və baza dəyəri yazılır, onları
E hərfi ilə ayırır. Nümunəmizdə ekvivalent qeydlər verdim
1.2 × 10 3 və
1.2 E3 Əgər hər şey aydındırsa və məktəb kurikuluma nostalji ekskursiyanı bitirmişiksə, indi bunu unutmağı məsləhət görürəm, çünki üzən nöqtə nömrəsini formalaşdırarkən bununla məşğul oluruq. onlarla deyil, ikinin səlahiyyətləri, yəni.
n = 2 , bütün ahəngdar düstur
1.2E3 pozulur və bu, həqiqətən də beynimi sındırdı.
İmza və dərəcə
Bəs bizdə nə var? Nəticədə, biz də
bir mantisdən ibarət olan ikili nömrəyə sahibik - gücə qaldıracağımız hissə və gücün özündən. Bundan əlavə, tam ədədlərdə olduğu kimi, üzən nöqtəli ədədlər də işarəni müəyyən edən bitə malikdir - ədədin müsbət və ya mənfi olacağını. Nümunə olaraq,
float
32 bitdən ibarət olan növü nəzərdən keçirməyi təklif edirəm. İkiqat dəqiqlikli nömrələrlə
double
məntiq eynidir, yalnız iki dəfə çox bit var. 32 bitdən ilk ən əhəmiyyətlisi işarəyə, sonrakı 8 bit eksponentə - mantisanı qaldıracağımız gücə, qalan 23 bit isə mantisaya ayrılır. Nümayiş etmək üçün bir nümunəyə baxaq:
Birinci bit çox sadədir. Əgər birinci bitin qiyməti
0 olarsa , aldığımız ədəd
müsbət olacaqdır . Bit
1 olarsa , rəqəm
mənfi olacaq . 8 bitlik növbəti blok eksponent blokdur. Göstərici adi
səkkiz bitlik ədəd kimi yazılır və lazımi dərəcəni əldə etmək üçün nəticədə çıxan ədəddən 127 çıxmalıyıq.Bizim vəziyyətimizdə eksponentin səkkiz biti
10000001- dir .
Bu 129 rəqəminə uyğundur . Bunu necə hesablamaqla bağlı sualınız varsa, şəkil tez cavabı göstərir. Genişlənmiş versiya istənilən Boolean cəbri kursunda əldə edilə bilər.
1×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 Bu 8 bitdən əldə edə biləcəyimiz maksimum ədədin 11111111 2 = 255 10 olduğunu hesablamaq çətin deyil (alt simvol
2 və
10 ikilik və onluq say sistemləri deməkdir) Ancaq yalnız müsbət eksponent dəyərlərindən istifadə etsək (
0-dan 255-ə qədər ), onda yaranan ədədlər ondalık nöqtədən əvvəl çoxlu rəqəmlərə sahib olacaq, amma sonra yox? Dərəcənin mənfi dəyərlərini əldə etmək üçün yaradılan eksponentdən
127 çıxarmaq lazımdır . Beləliklə, dərəcə diapazonu
-127 ilə 128 arasında olacaq . Nümunəmizi istifadə etsək, tələb olunan dərəcə
129-127 = 2 olacaqdır . Hələlik bu rəqəmi xatırlayaq.
Mantis
İndi mantissa haqqında. O, 23 bitdən ibarətdir, lakin başlanğıcda həmişə bitlərin ayrılmadığı başqa bir vahid nəzərdə tutulur. Bu, məqsədəuyğunluq və qənaətcillik baxımından edilir. Eyni ədədi mantisəyə ondalık nöqtədən əvvəl və ya sonra sıfırlar əlavə etməklə müxtəlif güclərdə ifadə etmək olar. Bunu başa düşməyin ən asan yolu onluq eksponentdir:
120.000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8 və s. Lakin mantisanın başına sabit nömrə daxil etməklə hər dəfə yeni nömrələr alacağıq. Gəlin bunu normal qəbul edək ki, bizim 23 bitdən əvvəl bir ilə bir daha olacaq. Adətən bu bit qalanlardan bir nöqtə ilə ayrılır, lakin bu heç nə demək deyil. Sadəcə daha rahatdır 1. 111000000000000000000000
İndi ortaya çıxan mantisanı hər addımda gücü bir azaldaraq, soldan sağa bir gücə qaldırmaq lazımdır. Hesablama nəticəsində əldə etdiyimiz gücün dəyərindən başlayırıq, yəni
2 (ikinin gücünün hər bir dəyərini yazmamaq üçün qəsdən sadə bir nümunə seçdim və onları yuxarıdakı cədvəldə hesablamadım. müvafiq bit sıfırdır)
1×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0,5 = 4+2+1+0,5 = 7.5 və nəticəni aldı
7.5 , düzgünlüyünü, məsələn,
bu linkdə yoxlaya bilərsiniz
Nəticələr
Standart üzən nöqtəli nömrə
float
32 bitdən ibarətdir, birinci bit işarədir (+ və ya -), sonrakı səkkiz eksponentdir, sonrakı 23 mantissa İşarəyə görə - əgər bit 0 müsbət ədəddirsə. Bit 1 mənfi olarsa.
Eksponensial olaraq - bit istiqamətində onluq ədədə çeviririk (soldan birinci bit
128 , ikinci
64 , üçüncü
32 , dördüncü
16 , beşinci
8 , altıncı
4 , yeddinci
2 , səkkizinci
1- dir ), nəticədə çıxan ədəddən
127- ni çıxarsaq , başlayacağımız dərəcəni alırıq.
Mantissə görə - öndəki mövcud 23 bitə 1 dəyəri ilə başqa bir bit əlavə edirik və ondan aldığımız gücə yüksəltməyə başlayırıq, bu gücü hər sonrakı bitlə azaldırıq.
Hamısı budur, uşaqlar! PS: Ev tapşırığı olaraq, bu məqalədən istifadə edərək, üzən nöqtə nömrələri ilə çox sayda arifmetik əməliyyatda dəqiq səhvlərin niyə baş verdiyinə dair versiyalarınızı şərhlərdə buraxın.
GO TO FULL VERSION