JavaRush /Blog Java /Random-PL /Liczby rzeczywiste w pamięci komputera. Wyjaśnienie.
Marianna
Poziom 9
Москва

Liczby rzeczywiste w pamięci komputera. Wyjaśnienie.

Opublikowano w grupie Random-PL
Dzień dobry Studiując wykład „Nuanse pracy z liczbami rzeczywistymi” z pierwszego zadania (sekcja 2. Struktura liczb zmiennoprzecinkowych) i dodatkowe wykłady na ten temat, wielu z pewnością napotkało wiele pytań na ten temat. Początkowo starałem się dawać sobie niezbędne odpowiedzi, a teraz ofiaruję je Tobie, abyś mógł je w pełni zrozumieć, w spójnym logicznym porządku. 1. Systemy dziesiętne i binarne. 1.1 System liczb dziesiętnych jest jednym z najpowszechniejszych systemów; to ten, którego używamy do wszelkich niekomputerowych obliczeń matematycznych w szkole, na uniwersytecie i w życiu. Używa liczb 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 (arabski) - łącznie 10 cyfr. Istnieje również rzymski zapis liczb, który jednak obecnie praktycznie nie jest używany. W systemie dziesiętnym liczenie odbywa się w jednostkach, dziesiątkach, setkach, tysiącach, dziesiątkach tysięcy, setkach tysięcy, milionach itp. - innymi słowy, są to wszystkie cyfry liczby. Cyfra liczby to pozycja (miejsce) cyfry w zapisie liczby. Najniższa cyfra liczb naturalnych (i najmniej znacząca ) to cyfra jedności (skrajna na prawo). Dlaczego jest on najbardziej nieistotny? Ponieważ po opuszczeniu cyfry jedności liczby sama liczba zmieni się minimalnie (na przykład liczby 345 i 340). Następnie drugą cyfrą jest cyfra dziesiątek itd. Co to wszystko oznacza? Weźmy dowolną liczbę całkowitą w systemie dziesiętnym i rozłóżmy ją na cyfry . 3297 = 3*1000 + 2*100 + 9*10 + 7 Stwierdzamy zatem, że liczba 3297 zawiera 3 jednostki czwartej cyfry (czyli 3 tysiące), 2 jednostki trzeciej cyfry (2 setki), 9 jednostek drugiej cyfry (9 dziesiątek) i 7 jednostek pierwszej cyfry . Innymi słowy, liczba ta wynosi trzy tysiące dwieście dziewięćdziesiąt siedem i jest zatem pozycyjna . A co z cyframi liczb ułamkowych (rzeczywistych) ? Cyfry liczb ułamkowych (ich część ułamkowa) nazywane są: częściami dziesiątymi, setnymi, tysięcznymi, dziesięciotysięcznymi itp. Im dalej cyfra znajduje się od przecinka dziesiętnego (od całej części liczby), tym jest mniej istotna (po odrzuceniu jej wartość liczby niewiele się zmieni). Weźmy na przykład dowolną liczbę ułamkową przedstawioną w postaci dziesiętnej: 25,076 = 2*10 + 5 +0*0,1 + 7*0,01 +6*0,001 W ten sposób stwierdzamy, że liczba ułamkowa 25.076 zawiera 2 dziesiątki, 5 jednostek, 0 dziesiątych , 7 setnych i 6 tysięcznych. System dziesiętny wykorzystuje 10 cyfr i wielokrotności 10 miejsc - stąd nazwa „dziesiętny”. 1.2 Binarny system liczbowy to system liczbowy stosowany w prawie wszystkich współczesnych komputerach i innych komputerowych urządzeniach elektronicznych. Do zapisywania liczb wykorzystuje tylko dwie cyfry - 0 i 1. Aby nie pomylić, w jakim systemie liczbowym zapisano liczbę, w prawym dolnym rogu znajduje się wskaźnik (jest to podstawa systemu liczbowego ), np. przykład: 1000₁₀ 1000₂ Tutaj pierwsza liczba to znany tysiąc w systemie dziesiętnym, a dolna to liczba w systemie binarnym, która jest równa w systemie dziesiętnym... 8 ! Podobnie jak system dziesiętny, system binarny również dzieli liczby na cyfry . Każda cyfra liczby binarnej nazywana jest bitem (lub cyfrą ). (Jeśli ktoś jest zainteresowany, cztery bity to półbajt (lub tetrada), 8 bitów to bajt , 16 bitów to słowo , 32 bity to podwójne słowo ). Bity (cyfry) są również numerowane od prawej do lewej, zaczynając od zera (w przeciwieństwie do systemu dziesiętnego). Najmniej znaczący, najmniej znaczący prawy bit ma numer kolejny 0 . Następnie następuje bit pierwszy , drugi itd., im bit starszy , tym bardziej znaczący (analogicznie do systemu dziesiętnego, który rozumiemy - jeśli usuniemy te z liczby 1455, zostanie nam liczba 1450) - prawie równa początkowej.Ale jeśli usuniesz setki, zostanie liczba 1050, która jest już daleka od wartości początkowej, ponieważ miejsce setek jest znacznie bardziej znaczące (wysokiego rzędu) niż miejsce jednostek ). Przykład. NIE CZYTAJ JESZCZE :))) Liczby rzeczywiste w pamięci komputera.  W BUDOWIE!!!  - 2 Na dole bity tej ułamkowej liczby binarnej są ponumerowane na czerwono – w sumie mamy 18 bitów (cyfr) tej liczby. Patrząc w przyszłość, chciałbym zauważyć, że liczby ułamkowe są przechowywane w pamięci komputera w zupełnie inny sposób - zostanie to omówione później. W międzyczasie nauczmy się, jak konwertować liczby z jednego systemu liczbowego na inny. 2. Zamiana liczb całkowitych i ułamków zwykłych z systemu dziesiętnego na binarny i odwrotnie. 2.1 Konwersja z systemu dziesiętnego na binarny. 2.1.1 Liczby całkowite. Aby zamienić liczbę całkowitą w systemie dziesiętnym na system binarny, należy tę liczbę podzielić przez 2, zapisać resztę dzielenia (zawsze jest równa 0 lub 1, w zależności od tego, czy liczba jest parzysta, czy nieparzysta) , i podziel wynik dzielenia ponownie przez 2 , ponownie zapisz resztę dzielenia (0 lub 1) i wynik drugiego dzielenia podziel jeszcze raz przez 2. Kontynuuj w ten sposób, aż wynik dzielenia będzie równy jeden. Następnie zapisujemy wszystkie powstałe zera i jedyneki w odwrotnej kolejności , zaczynając od najnowszego wyniku dzielenia, który zawsze wynosi 1. Ważna uwaga. Końcowym wynikiem sekwencyjnego dzielenia DOWOLNEJ LICZBY CAŁKOWITEJ przez 2 zawsze będzie jeden (1)! Jeśli wynik jest większy niż 1, kontynuujemy dzielenie tego wyniku przez 2, aż otrzymamy jeden. A wynikiem dzielenia przez 2 może być zero (0) tylko w jednym przypadku - jest to dzielenie samego zera przez 2. Przykład. Przekonwertujmy liczbę 145 z systemu dziesiętnego na binarny. 145/2 = 72 (reszta 1 ) 72/2 = 36 (reszta 0 ) 36/2 = 18 (reszta 0 ) 18/2 = 9 (reszta 0 ) 9/2 = 4 (reszta 1 ) 4/2 = 2 (reszta 0 ) 2/2 = 1 (reszta 0 ) Teraz „zbieramy” naszą liczbę binarną w odwrotnej kolejności. Otrzymujemy numer 10010001. Gotowe! Ciekawy niuans 1. Zamieńmy liczbę 1 z systemu dziesiętnego na binarny. W systemie binarnym liczba ta będzie również zapisana jako 1. Przecież końcowy wynik dzielenia przez 2, który powinien być równy 1, jest już równy samej liczbie 1. 1₁₀ = 1₂ Ciekawy niuans 2. Przeliczmy cyfrę 0 z systemu dziesiętnego na binarny. W systemie binarnym liczba ta będzie również zapisywana jako 0. 0₁₀ = 0₂ 2.1.2 Liczby ułamkowe. Jak zamienić liczby ułamkowe na binarne? Aby przekonwertować ułamek dziesiętny na system liczb binarnych, należy: a) przekonwertować całą część ułamka na system binarny zgodnie z badanym algorytmem w paragrafie 2.1.1 b) pomnożyć część ułamkową ułamka przez 2 , napisz wynikowa cyfra wyniku PRZED przecinkiem (zawsze równe 0 lub 1, co jest logiczne), następnie pomnóż TYLKO część ułamkową uzyskanego wyniku ponownie przez 2, wynikową cyfrę wyniku zapisz PRZED przecinkiem (0 lub 1) i tak dalej, aż do ułamka część wyniku mnożenia staje się równa 0 lub do wymaganej liczby miejsc po przecinku (wymagana precyzja ) (równa liczbie mnożeń przez 2). Następnie należy zapisać powstałą sekwencję zapisanych zer i jedynek W KOLEJNOŚCI po przecinku oddzielającym część całkowitą i ułamkową liczby rzeczywistej (ułamkowej). Przykład 1. Przekonwertujmy liczbę 2,25 (2 przecinki 25 setnych) z systemu dziesiętnego na system binarny. W systemie binarnym ułamek będzie równy 10,01 . Jak to otrzymaliśmy? Liczba składa się z części całkowitej (do kropki) - to jest 2 i części ułamkowej - to jest 0,25. 1) Tłumaczenie całej części: 2/2 = 1 (reszta 0 ) Cała część będzie wynosić 10 . 2) Tłumaczenie części ułamkowej. 0,25 * 2 = 0,5 (0) 0,5 * 2 = 1,0 (1) Część ułamkowa w wyniku kolejnego mnożenia przez 2 stała się równa 0. Przestajemy mnożyć. Teraz „zbieramy” część ułamkową W PORZĄDKU - w systemie binarnym otrzymujemy 0,01 . 3) Dodaj liczbę całkowitą i części ułamkowe - otrzymamy, że ułamek dziesiętny 2,25 będzie równy ułamkowi binarnemu 10,01 . Przykład 2. Przekonwertujmy liczbę 0,116 z systemu dziesiętnego na system binarny. 0,116 * 2 = 0,232 (0) 0,232 * 2 = 0,464 (0) 0,464 * 2 = 0,928 (0) 0,928 * 2 = 1,856 (1) //odrzuć część całkowitą tego wyniku 0,856 * 2 = 1 ,712 (1 ) //odrzuć całą część tego wyniku 0,712 * 2 = 1 ,424 (1) //odrzuć całą część tego wyniku 0,424 * 2 = 0,848 (0) Jak widzimy, mnożenie trwa i trwa , część ułamkowa wyniku nie staje się równa 0. Wtedy decydujemy, że nasz ułamek dziesiętny zamienimy na binarny z dokładnością do 7 miejsc po przecinku (bitów) po przecinku (w części ułamkowej). Przypomnijmy sobie, czego uczyliśmy się o bitach nieistotnych - im bit (bit) jest dalej od całości, tym łatwiej jest nam go zaniedbać (wyjaśnienie w części 1 wykładu, kto zapomniał). Ułamek binarny 0,0001110 otrzymujemy z dokładnością do 7 bitów po kropce. 2.2 Konwersja z systemu binarnego na dziesiętny. 2.2.1 Liczby całkowite. Do przetłumaczenia całościliczbę z systemu binarnego na dziesiętny, należy tę liczbę podzielić na cyfry (bity) i każdą cyfrę (bit) pomnożyć przez liczbę 2 do pewnego stopnia dodatniego (stopień ten rozpoczyna liczenie od prawej do lewej od najmniej znaczącej (prawy bit) i zaczyna się od 0 ). Innymi słowy, potęga dwójki jest równa liczbie danego bitu (ale tę niepisaną zasadę można zastosować tylko w przypadku konwersji liczb całkowitych , gdyż dla liczb ułamkowych numeracja bitów zaczyna się od części ułamkowej, co jest tłumaczone w systemie dziesiętnym inaczej ). Następnie musisz dodać powstałe produkty. Przykład. Przekonwertujmy liczbę binarną 110011 na system dziesiętny. 110011₂ = 1*2⁵ + 1*2⁴ + 0*2³ + 0*2² + 1*2¹ + 1*2° = 32 +16 +0 + 0 + 2 + 1 = 51₁₀ W rezultacie otrzymujemy liczbę 51 w system binarny . Dla informacji poniżej znajduje się tabela pierwszych potęg liczby 2 . NIE CZYTAJ JESZCZE :))) Liczby rzeczywiste w pamięci komputera.  W BUDOWIE!!!  - 5 ! Należy pamiętać, że potęga zerowa liczby wynosi zawsze 1. 2.2.2 Liczby ułamkowe. Aby zamienić liczbę binarną ułamkową (rzeczywistą) na dziesiętną należy: a) zamienić jej część całkowitą na dziesiętną zgodnie z algorytmem z punktu 2.2.1 ; b) przetłumacz jego część ułamkową w następujący sposób. Część ułamkową należy przedstawić jako sumę iloczynów cyfr przez dwa podniesioną do pewnej potęgi ujemnej (potęga pierwszej cyfry po przecinku (po całej części ułamka) będzie równa -1, dla drugiej cyfry po przecinku będzie równa -2 itd.) Wynik tą kwotą będzie część ułamkowa liczby w systemie dziesiętnym. Przykład. Przekonwertujmy liczbę 10111.01 na system binarny. 10111,01₂ = (1*2⁴ + 0*2³ + 0*2² + 1*2¹ + 1*2°) . (0*2ˉ¹ + 1*2ˉ²) = (16 + 0 + 4 + 2 + 1) . (0 + 0,25) = 23,25₁₀ W rezultacie otrzymujemy liczbę 23,25 w systemie dziesiętnym. Tabela pierwszych ujemnych potęg liczby 2 znajduje się poniżej. NIE CZYTAJ JESZCZE :))) Liczby rzeczywiste w pamięci komputera.  W BUDOWIE!!!  - 7 2.2.3 Ogólny wzór na przeliczenie liczb z systemu binarnego na dziesiętny. Podajmy ogólny wzór na konwersję liczb z postaci binarnej na dziesiętną (zarówno części całkowite, jak i ułamkowe). NIE CZYTAJ JESZCZE :))) Liczby rzeczywiste w pamięci komputera.  W BUDOWIE!!!  - 4 gdzie A jest liczbą w systemie binarnym; Podstawą systemu liczbowego jest 2 (co oznacza, że ​​każdy bit jest mnożony przez 2 do potęgi); N— liczba cyfr całkowitych (bitów) ; m to liczba cyfr ułamkowych (bitów) liczby . Pierwszy bit części całkowitej od punktu podziału jest podświetlony na czerwono . Zawsze jest mnożona przez 2 do potęgi zerowej. Następny bit przed nim (po lewej) jest mnożony przez 2 do pierwszej potęgi itd. Pierwszy bit części ułamkowej od punktu podziału jest podświetlony na zielono . Zawsze jest mnożona przez 2 do pierwszej potęgi minus. Następny bit po prawej stronie jest mnożony przez 2 do potęgi minus drugiej itd. 3. Notacja naukowa: notacja znormalizowana w obu systemach. Mantysa, wykładnik, stopień wykładnika. 3.1 Wykładnicza forma zapisu liczby. Wcześniej badaliśmy szczegółowy schemat rejestrowania liczb pozycyjnych cyfrowo. Weźmy liczbę 0,0000000000000000000016 . Ma bardzo długi wpis w standardowej formie. A w formie wykładniczej będzie to wyglądać tak: 1,6 * 10ˉ²¹ Jaka jest zatem postać wykładnicza liczby i jak przedstawić liczbę w tej postaci? Notacja naukowa liczby to przedstawienie liczb rzeczywistych w postaci mantysy i wykładnika . Wygodny do reprezentowania bardzo dużych i bardzo małych liczb, a także do ujednolicenia ich zapisu. N = M * pⁿ gdzie N to liczba do zapisania, M to mantysa liczby, p to podstawa (równa podstawie systemu liczbowego danej liczby), n (liczba całkowita) to rząd (stopień) , może być dodatnia i ujemna), p do potęgi n to liczby charakterystyczne (wykładnik, czyli podstawa podniesiona do potęgi (rząd)). Ważny niuans. Jeśli część całkowita liczby dziesiętnej jest różna od 0 , to rząd (stopień) wykładnika będzie dodatni , jeśli część całkowita jest równa 0 , stopień wykładnika będzie ujemny . 3.2 Normalna i znormalizowana forma zapisywania liczb. Postać normalna liczby to postać, w której mantysa (bez uwzględnienia znaku) znajduje się w połowie przedziału [0,1], czyli 0 <= M < 1. Ta forma zapisu ma wada: niektóre liczby są zapisane niejednoznacznie (np. 0,0001 można zapisać jako 0,000001*10², 0,00001⋅10¹, 0,0001⋅10°, 0,001⋅10ˉ¹ i tak dalej). Dlatego rozpowszechniona jest (szczególnie w informatyce) inna forma zapisu - znormalizowana, w którym mantysa liczby dziesiętnej przyjmuje wartości od 1 (włącznie) do 10 (wyłącznie), czyli 1 <= M < 10 (podobnie mantysa liczby binarnej przyjmuje wartości od 1 do 2 ). Innymi słowy, mantysa w systemie dziesiętnym musi być liczbą ułamkową od 1,0 (włącznie) do 10 (wyłącznie) , tj. część całkowita mantysy musi zawierać jedną cyfrę, a część ułamkowa nie jest ograniczona matematycznie. Zaletą postaci znormalizowanej jest to, że każda liczba (z wyjątkiem 0) jest zapisywana w unikalny sposób. Wadą jest to, że nie można przedstawić 0 w tej postaci, dlatego reprezentacja liczb w informatyce przewiduje specjalny znak (bit) dla liczby 0. 3.3 Przykłady zapisu liczb dziesiętnych w znormalizowanej formie wykładniczej. Spójrzmy na przykłady. Przykład 1. Zapiszmy liczbę dziesiętną 1015000 (jeden milion piętnaście tysięcy) w znormalizowanej formie wykładniczej. System liczbowy tej liczby jest dziesiętny, więc podstawą będzie 10 . Wybierzmy mantysę . Aby to zrobić, wyobraź sobie liczbę jako ułamek, którego część ułamkowa będzie równa zero (ponieważ liczba jest liczbą całkowitą): 1000000,0. Jeśli część całkowita liczby jest większa od 0 , należy przesunąć punkt na lewo od jego pozycji początkowej (wewnątrz części całkowitej), aż w części całkowitej pozostanie tylko jedna cyfra . Po nim stawiamy kropkę. Odrzucamy nieistotne zera (na końcu liczby). Otrzymujemy mantysę liczby równej 1,015 . Określmy stopień (rząd) podstawy liczby. O ile pozycji w lewo przesunął się nasz punkt oddzielający część całkowitą od ułamkowej? Na sześć stanowisk. Oznacza to, że kolejność będzie wynosić 6 . W tym przypadku kolejność jest dodatnia (przesunęliśmy punkt w części całkowitej liczby różnej od 0). Ostatni wpis w postaci znormalizowanej: 1,015 * 10⁶ . Liczbę tę możemy zapisać w postaci: 1,015E6 (gdzie E6 jest wykładnikiem liczby dziesiętnej, czyli 10 do potęgi 6). Sprawdźmy się . Notacja wykładnicza liczby to nic innego jak iloczyn liczby (mantysa) i innej liczby (wykładnik). Co się stanie, jeśli pomnożysz 1,015 przez 10⁶? 1,015*10⁶ = 1,015*1000000 = 1015000 . Zgadza się. Takie podejście (znormalizowane) pomaga stworzyć jednoznaczny zapisliczby w postaci wykładniczej, jak wskazano powyżej. Przykład 2. Zapiszmy dziesiętną liczbę rzeczywistą 0,0098 w znormalizowanej formie. Podkreślmy podstawę liczby - jest ona równa 10 (system liczb dziesiętnych). Wybierzmy mantysę liczby - jest ona równa 9,8 (część całkowita liczby jest równa zero, co oznacza, że ​​przesuwamy punkt w prawo do pierwszej cyfry znaczącej (z zakresu od 1 do 9 włącznie) Ustalamy rząd liczby - przesunęliśmy punkt o trzy pozycje, czyli rząd wynosi 3. Dodatnia jest liczba ujemna czy ujemna? Ponieważ przesunęliśmy punkt w prawo (w części ułamkowej liczby), rząd (potęga) będzie ujemny . Ostateczny zapis liczby w postaci znormalizowanej to 9,8 * 10ˉ³ lub 9,8E-3 . Sprawdźmy jeszcze raz. Pomnóż 9,8 przez 10ˉ³. 9,8 * 10ˉ³ = 9,8 * 0,001 = 0,0098 . Zgadza się. Przykład 3. Zapiszmy dziesiętną liczbę rzeczywistą 3,56 w postaci znormalizowanej Wybierz podstawę liczby - jest ona równa 10 (w systemie dziesiętnym) Wybierz mantysę liczby - jest równa... 3,56 (liczba całkowita część liczby to jedna cyfra, nie równa 0. Oznacza to, że punktu nie trzeba nigdzie przesuwać, sama liczba będzie mantysą.) Podkreślmy kolejność podstawy: O jaką liczbę powinna być mantysa , równy samej liczbie, pomnożyć tak, aby się nie zmienił? Za sztukę. Oznacza to, że kolejność będzie wynosić zero. Ostateczny zapis liczby w postaci znormalizowanej to 3,56 * 10° lub 3,56E0. 4. Zapisywanie w pamięci komputera liczb rzeczywistych: float i double. 4.1 Typy float i double. Przejdźmy do kluczowej części naszego wykładu. Jak już wiemy, w Javie istnieją dwa typy liczb rzeczywistych: float i double . Typ float zajmuje 32 bity w pamięci komputera i może przyjmować wartości z zakresu [3.4E-38; 3.4E+38) (czyli w przedziale od 3,4*10ˉ³⁸ (włącznie) do 3,4*10³⁸ (bez)). Ważny niuans 1. Liczby zmiennoprzecinkowe mogą być dodatnie lub ujemne. Powyższy zakres ma na celu wskazanie modułów liczb wchodzących w skład zakresu float. Ważny niuans 2. 10³⁸ jest w przybliżeniu równe 2¹²⁷ , odpowiednio, 10 ˉ³⁸ jest w przybliżeniu równe 2ˉ¹²⁷ . Zatem przedział wartości bezwzględnych liczb zmiennoprzecinkowych można zapisać jako [3,4 * 2ˉ¹²⁷; 3,4 * 2¹²⁷). Typ podwójny zajmuje dwa razy więcej pamięci komputera -64 bity i może akceptować wartości dziesiętne z zakresu [-1,7E+308; odpowiednio 1,7E+308) . 4.2 Wykładnicza znormalizowana postać liczb binarnych. Wiemy, że liczby są przechowywane w pamięci komputera w postaci binarnej. Weźmy więc liczbę 1560.256 (typ zmiennoprzecinkowy) i przekonwertujmy ją na system binarny w postaci pozycyjnej: 11000011000.01000001100 . Można by pomyśleć, że w ten sposób będzie on przechowywany w pamięci komputera. Ale to nieprawda! W pamięci komputera typy float i double ( rzeczywiste typy zmiennoprzecinkowe ) są przechowywane w wykładniczej postaci znormalizowanej , ale podstawą potęgi jest 2, a nie 10. Wynika to z faktu, że jak stwierdzono powyżej, wszystkie dane w komputer jest reprezentowany w postaci binarnej (bity). Dla danej liczby przydzielana jest określona ilość pamięci komputera. Przedstawmy liczbę dodatnią 15,2 w znormalizowanej formie wykładniczej: 1,52*10¹ . Następnie przedstawmy jego binarny „bliźniak” 1111.00110011001 również w wykładniczej notacji znormalizowanej, używając tego samego algorytmu: 1) Podstawa będzie równa 2 2) Mantysa będzie równa 1,11100110011001 3) Stopień będzie dodatni i równy 3 (przecinek jest przesunięty o 3 bity w lewo) w systemie dziesiętnym. Przekonwertujmy to na system binarny: 11 . Zatem w binarnej wykładniczej znormalizowanej formie będzie to 1,11100110011001 * 2¹¹. 4.3 Przechowywanie wykładniczej znormalizowanej postaci binarnej liczby zmiennoprzecinkowej w pamięci komputera. Ustaliliśmy więc, że liczba rzeczywista będzie przechowywana w pamięci komputera w wykładniczej znormalizowanej formie binarnej . Jak to będzie wyglądać w pamięci? Weźmy typ float . Komputer przydziela 32 bity na każdą liczbę zmiennoprzecinkową . Są one dystrybuowane w następujący sposób . Ten rysunek schematycznie przedstawia przydzieloną pamięć dla 32-bitowej liczby zmiennoprzecinkowej w komputerze. NIE CZYTAJ JESZCZE :))) Liczby rzeczywiste w pamięci komputera.  W BUDOWIE!!!  - 5 Numeracja bitów jest oznaczona kolorem czerwonym . Kolor zielony oznacza część przydzielonej pamięci (1 bit) do przechowywania znaku liczby. Kolor żółty oznacza część przydzielonej pamięci do przechowywania przesuniętej potęgi (kolejności) wykładniczej postaci liczby (8 bitów). Niebieskioznacza część przydzielonej pamięci do przechowywania znormalizowanej mantysy liczby bez ukrytej jednostki (23 bity). Przyjrzyjmy się bliżej. 1) Bit znaku. Najbardziej znaczący (pierwszy od lewej) bit jest zawsze przydzielany do przechowywania znaku liczby (1, jeśli liczba jest ujemna i 0, jeśli liczba jest dodatnia). Wyjątkiem może być liczba zero – w programowaniu zero może być zarówno ujemne, jak i dodatnie . 2) Następnie następują bity stopnia (rządu) wykładnika o podstawie 2 . W tym celu przydzielonych jest 8 bitów. Jak wiemy, stopień wykładniczy liczb zmiennoprzecinkowych może być zarówno ujemny (dla liczb, których część całkowita wynosi 0, patrz akapit 3.3), jak i dodatni (dla liczb, których część całkowita jest różna od zera) i waha się od 2ˉ¹²⁷ do 2¹²⁷ . Teoretycznie powinniśmy przeznaczyć jeden bit na określenie znaku wykładnika, tak jak ma to miejsce w przypadku bitu znaku. Ale to nieprawda. Aby nie tracić czasu na ustalanie znaku wykładnika, liczby zmiennoprzecinkowe dodają przesunięcie do wykładnika o pół bajtu +127 (0111 1111). Zatem zamiast zakresu potęg od 2ˉ¹²⁷ do 2¹²⁷ komputer przechowuje zakres potęg od 0 do +254 - wszystkie wartości potęg są dodatnie , nie ma potrzeby marnowania dodatkowego bajtu na znak. Okazuje się, że wartość wykładnika jest przesunięta o połowę w stosunku do możliwej wartości. Oznacza to, że aby uzyskać rzeczywistą wartość wykładnika, należy odjąć to przesunięcie od wartości przechowywanej w pamięci. Jeśli wartość wykładnika przechowywana w pamięci jest mniejsza niż przesunięcie (+127), wówczas wykładnik jest ujemny: jest to logiczne. Przykład. Dokonajmy przesunięcia o stopień ujemny -18 . Dodajemy do tego przesunięcie +127, otrzymujemy wartość stopnia +108 (nie zapomnij o stopniu 0 w obliczeniach). Zamieńmy stopień na postać binarną: 1101100 Ale na stopień przydzielonych jest 8 bitów pamięci i tutaj otrzymujemy liczbę 7-bitową. W miejsce pustej, niezajętej wyższej cyfry (bitu) komputer dodaje 0. W rezultacie stopień ten zostanie zapisany w pamięci komputera jako 01101100 . Zobaczmy: +108 < +127, co oznacza, że ​​stopień jest w rzeczywistości ujemny. Rozważ następującą interesującą tabelę: Pokazuje wszystkie możliwe wartości potęg znormalizowanych form liczb zmiennoprzecinkowych w systemach binarnych i dziesiętnych. Jak widzimy, w systemie binarnym +127 to dokładnie połowa całego bajtu (8 bitów). 3) Pozostałe 23 bity są zarezerwowane dla mantysy NIE CZYTAJ JESZCZE :))) Liczby rzeczywiste w pamięci komputera.  W BUDOWIE!!!  - jedenaście. Ale w przypadku znormalizowanej mantysy binarnej najbardziej znaczący bit (inaczej część całkowita znormalizowanej mantysy) jest zawsze równy 1 (zwany jedynką ukrytą ), ponieważ liczba mantysy mieści się w zakresie 1<=M<2 (i przypomnę także paragraf 2.1.1 wykładu). Jedynym wyjątkiem jest liczba 0. Nie ma sensu zapisywać jednostki w przydzielonych 23 bitach i marnować pamięć, więc pozostała część mantysy (jej część ułamkowa) jest zapisywana w przydzielonych 23 bitach. Okazuje się, że zasadniczo znacząca część liczby zmiennoprzecinkowej ma długość 24, z czego przechowywany jest o jeden bit mniej. Ważny niuans. Pamiętajmy, że przy przeliczaniu liczb ułamkowych dziesiętnych na liczby binarne część ułamkowa w systemie binarnym często okazywała się ogromna. Mamy tylko 32 bity do przechowywania liczby zmiennoprzecinkowej. W takim przypadku najniższe, najmniej znaczące cyfry ułamka binarnego (pamiętaj o paragrafie 2.1.2 tego wykładu) nie zostaną uwzględnione w przydzielonej pamięci i komputer je zignoruje . Dokładność liczby zostanie utracona , ale, jak widać, jest minimalna. Innymi słowy, dokładność zmiennoprzecinkowych ułamków wynosi 6-7 miejsc po przecinku. 4.4 Przechowywanie wykładniczej znormalizowanej postaci binarnej liczby podwójnej w pamięci komputera. Liczby rzeczywiste typu double są przechowywane w pamięci komputera w taki sam sposób, jak liczby zmiennoprzecinkowe, z wyjątkiem pewnych cech. Liczba podwójna ma 64 bity w pamięci komputera. Są one rozmieszczone w następujący sposób (również w kolejności od lewej do prawej): 1) Bit znaku (patrz paragraf 4.3). Rozumiemy, że liczba tego bitu będzie wynosić 63 . 2) Stopień (kolejność). Liczbom podwójnym przydzielono 11 bitów do ich przechowywania . Przeprowadzane jest również przesunięcie stopnia , ale dla liczb podwójnych będzie ono równe +1023. 3) Mantysa (znacząca część). Liczbom podwójnym przydzielono 52 bity (cyfry) do ich przechowywania. Ponadto dokładna część całkowita mantysy ( ukryta jednostka ) nie jest przechowywana w pamięci . Warto również zauważyć, że dokładność ułamków podwójnych wynosi około 16 miejsc po przecinku . 4.5 Przykłady reprezentacji liczby rzeczywistej w systemie dziesiętnym w pamięci komputera. A ostatnim punktem naszego wykładu będzie przykład przekształcenia liczby ułamkowej systemu dziesiętnego na postać jej przechowywania w pamięci komputera w celu utrwalenia zrozumienia tematu. Przykład 1. Weź liczbę-4,25 typ pływakowy. Przedstawmy to w wykładniczej postaci znormalizowanej w systemie liczb binarnych, pamiętając o wszystkim, co omawialiśmy w tym wykładzie. 1) Zamień część całkowitą liczby na postać binarną: 4/2 = 2 (reszta z dzielenia 0 ) 2/2 = 1 (reszta z dzielenia 0 ) Część całkowita będzie równa 100 w systemie binarnym. 2) Zamień część ułamkową liczby na postać binarną. 0,25*2 = 0,5 ( 0 ) 0,5*2 = 1,0 ( 1 ) Część ułamkowa będzie równa 0,01 w systemie binarnym. 3) Zatem -4,25₁₀ = -100,01₂ . 4) Przekształćmy liczbę -100,01₂ do wykładniczej postaci znormalizowanej w systemie liczb binarnych (co oznacza, że ​​podstawą potęgi będzie 2). -100,01₂ = -1,0001 *2² Przekonwertujmy wartość stopnia z formatu dziesiętnego na binarny . 2/2= 1 (reszta 0 ) Stopień wynosi 10₂. Otrzymujemy, że liczba -4,25₁₀ w jej binarnej, wykładniczej znormalizowanej formie będzie równa -1,0001 * 2¹º . Zapiszmy, jak będzie wyglądać w pamięci komputera. Bit znaku będzie miał wartość 1 (liczba ujemna). Przesunięcie wykładnika jest równe 2+127 = 129₁₀ = 10000001₂ Usuwamy ukrytą jedynkę z mantysy , otrzymujemy 00010000000000000000000 ( wypełniamy zerami wolne bity niższego rzędu ). Konkluzja. 1 10000001 00010000000000000000000 - w ten sposób liczba -4,25 jest przechowywana w pamięci komputera. Przykład 2. Konwertuj liczbę zmiennoprzecinkową 0,75₁₀ na binarny format przechowywania w pamięci komputera. Wynik powinien wynosić 0 01111110 10000000000000000000000 . Dziękuję za uwagę.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION