Główna zawartość
Kurs: Podstawy informatyki - program rozszerzony > Rozdział 1
Lekcja 3: Ograniczenia w przechowywaniu liczbOgraniczenia liczbowe, przepełnienia i zaokrąglenia
Gdy programy komputerowe przechowują liczby w zmiennych, komputer musi znaleźć sposób na ich reprezentację w pamięci komputera. Komputery stosują różne strategie w zależności od tego, czy dana liczba jest liczbą całkowitą, czy też nie. Ze względu na ograniczenia pamięci komputerowej, programy napotykają czasem na problemy z zaokrąglaniem, przepełnianiem lub precyzją zmiennych liczbowych.
Reprezentacja liczb całkowitych
Liczba całkowita to dowolna liczba, którą można zapisać bez części ułamkowej. Ten sam termin jest używany zarówno w programowaniu, jak i w matematyce, więc miejmy nadzieję, że jest Ci znany.
Wszystkie te liczby to liczby całkowite: , , , .
Jak język programowania może reprezentować te liczby całkowite w pamięci komputera? Cóż, komputery reprezentują wszystkie dane za pomocą bitów, więc wiemy, że ostatecznie każda z tych liczb jest ciągiem zer i jedynek.
Na początek, wyobraźmy sobie komputer, który używa tylko 4 bitów do reprezentacji liczb całkowitych. Może on użyć pierwszego bitu do przedstawienia znaku liczby całkowitej, dodatniego lub ujemnego, a pozostałych 3 bitów do przedstawienia wartości bezwzględnej.
W tym systemie liczba 1 byłaby reprezentowana w ten sposób:
0 | 0 | 0 | 1 |
---|---|---|---|
+/- | |||
znak |
Jaka jest największa liczba, jaką może reprezentować ten system? Wypełnijmy wszystkie bity wartości za pomocą i zobaczmy:
0 | 1 | 1 | 1 |
---|---|---|---|
+/- | |||
sign |
Jest to liczba dodatnia , gdzie .
Przekroczenie zakresu
Co by się stało, gdybyśmy uruchomili taki program na 4-bitowym komputerze, gdzie największą dodatnią liczbą całkowitą jest 7?
var x = 7;
var y = x + 1;
Komputer może przechowywać zmienną
x
tak samo dobrze, ale y
jest o jedną większą od największej liczby całkowitej, jaką może reprezentować z 4 bitami. W takim przypadku, komputer może zgłosić "błąd przepełnienia" lub wyświetlić komunikat typu "liczba jest za duża". Może też obciąć tę liczbę (ograniczając wszystkie wyniki do 7) lub okrążyć ją (tak, że 8 stanie się 1). Nie chcemy znaleźć się w żadnej z tych sytuacji, więc ważne jest, abyśmy przy pisaniu programów znali ograniczenia naszego języka i środowiska.
Na szczęście, większość nowoczesnych komputerów wykorzystuje 64-bitowe architektury, które mogą przechowywać niewiarygodnie duże liczby całkowite. W języku JavaScript największą bezpieczną liczbą całkowitą jest 9 007 199 254 740 992, co odpowiada . W przypadku większych liczb znajdujemy się w strefie zagrożenia.
Reprezentacja zmiennoprzecinkowa
Widzieliśmy, że istnieją ograniczenia w przechowywaniu liczb całkowitych w komputerze. Liczby, które nie są liczbami całkowitymi, jak ułamki i liczby niewymierne, są jeszcze trudniejsze do przedstawienia w pamięci komputera.
Weźmy pod uwagę liczby takie jak ; ; , czy też słynne nigdy niekończące się .
Języki komputerowe zazwyczaj używają reprezentacji zmiennoprzecinkowej w przypadku liczb niebędących liczbami całkowitymi (a czasami także całkowitych). Jest podobna do "naukowej notacji", reprezentacji, którą możesz znać w innych opracowaniach.
W reprezentacji zmiennoprzecinkowej liczba jest mnożona przez podstawę podniesioną do wykładnika:
Ponieważ komputery używają systemu binarnego zamiast systemu dziesiętnego, podstawą dla liczb zmiennoprzecinkowych jest zamiast . Z tego powodu liczby, które są dokładnie potęgami , są najprostsze do przedstawienia:
Liczby między potęgami 2 wyglądają tak:
Co z liczbami niecałkowitymi? Ponownie, potęgi liczby są najprostsze do przedstawienia.
Liczby zmiennoprzecinkowe mogą również reprezentować ułamki między potęgami 2:
Gdy komputer określi reprezentację zmiennoprzecinkową dla danej liczby, przechowuje ją w bitach. Nowoczesne komputery używają 64-bitowego systemu, który używa pierwszego bitu do znaku, 11 bitów dla wykładnika i 52 bity dla liczby z przodu.
Tu w binarnej reprezentacji zmiennoprzecinkowej:
11 111 111 011 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
Dokładne tłumaczenie na bity jest bardziej skomplikowane, niż możemy to wyjaśnić tutaj, ale jest to świetny temat dla tych z Was, którzy chcą pogłębić wiedzę.
Błędy w zaokrąglaniu
Jednak reprezentacja zmiennoprzecinkowa nadal nie może w pełni reprezentować wszystkich liczb. Rozważ ułamek i jego zmiennoprzecinkową reprezentację:
W systemie binarnym, 3 to wciąż nieskończenie powtarzalna sekwencja:
101 010 101…
Nie możemy przechowywać nieskończonej sekwencji w komputerze! W pewnym momencie komputer musi jakoś zakończyć tę liczbę, albo ją uciąć, albo zaokrąglić do najbliższej liczby zmiennoprzecinkowej. Komputery muszą to robić dość często, ponieważ nawet ułamki takie jak (czyli krótkie dziesiętne) po konwersji na liczbę binarną, mają nieskończone rozwinięcie.
Często nie zauważamy niższej precyzji reprezentacji liczby, dopóki nie użyjemy jej w obliczeniach. Wtedy właśnie możemy doświadczyć błędu zaokrąglenia w wynikach.
✏️ Oto program, który próbuje dodać . W świecie niekomputerowym wiemy, że jest to . Ale w komputerze każda z wartości jest zapisywana jako zaokrąglony ułamek binarny, a gdy zostaną dodane razem, nie do końca odpowiadają one temu, czego oczekujemy...
Im więcej bitów będziemy mogli użyć, tym bardziej precyzyjne będą nasze liczby i obliczenia. Nowoczesne 64-bitowe systemy oferują wystarczająco wysoką precyzję przy mało ryzykownych obliczeniach.
Być może w pewnym momencie życia będziesz pisał programy, które obliczają wyniki głosowania, zasilają autonomiczny samochód, a nawet uruchomią rakietę. Kiedy stawka jest wysoka, liczy się precyzja.
🙋🏽🙋🏻♀️🙋🏿♂️Masz pytania związane z tym zagadnieniem? Możesz zadać swoje pytanie poniżej!
Chcesz dołączyć do dyskusji?
Na razie brak głosów w dyskusji