JavaRush /Java Blogu /Random-AZ /Üzən nöqtəli nömrənin içərisində nə var və o necə işləyir...
Ivan
Səviyyə
Харьков

Üzən nöqtəli nömrənin içərisində nə var və o necə işləyir?

Qrupda dərc edilmişdir

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 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 31.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, float32 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ə doublemə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: Üzən nöqtəli nömrənin içərisində nə var və necə işləyir - 1Birinci 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. Üzən nöqtəli nömrənin içərisində nə var və necə işləyir - 21×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 210 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 Üzən nöqtəli nömrənin içərisində nə var və necə işləyir - 3İ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) Üzən nöqtəli nömrənin içərisində nə var və necə işləyir - 41×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ə float32 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! Üzən nöqtəli nömrənin içərisində nə var və necə işləyir - 5PS: 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.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION