If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Ograniczenia 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: 120, 10, 0, 20.
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:
0001
+/-421
znak222120
0 w bicie ze znakiem reprezentuje liczbę dodatnią, a 1 w bicie najbardziej z prawej strony reprezentuje 20 (1) miejsce wartości.
Jaka jest największa liczba, jaką może reprezentować ten system? Wypełnijmy wszystkie bity wartości za pomocą 1 i zobaczmy:
0111
+/-421
sign222120
Jest to liczba dodatnia 7, gdzie 22+21+20=(4+2+1)=7.
Sprawdź swoją wiedzę
Rozważmy komputer, który używa 6 bitów do reprezentacji liczb całkowitych: 1 bit dla znaku i 5 bitów dla liczby całkowitej. Jaka jest największa dodatnia liczba całkowita, którą może reprezentować?
  • Prawidłowa odpowiedź to:
  • liczba całkowita, taka jak 6
  • właściwy uproszczony ułamek, taki jak 3/5
  • niewłaściwy uproszczony ułamek, taki jak 7/4
  • liczba mieszana, taka jak 1 3/4
  • dokładny ułamek dziesiętny, taki jak 0,75
  • wielokrotność pi, taka jak 12 pi lub 2/3 pi

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.
Sprawdź swoją wiedzę
Na komputerze, który używa 6 bitów do reprezentacji liczb całkowitych (z 1 bitem do reprezentacji znaku), które z tych operacji powodują przepełnienie?
Zaznacz wszystkie odpowiedzi, które pasują:

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 2531. W przypadku większych liczb znajdujemy się w strefie zagrożenia.
✏️ Pobaw się w strefie zagrożenia poniżej! JavaScript nie wyświetla błędów przepełnienia, ale robi kilka innych dziwnych rzeczy.
📝 Zobacz podobny kod w: App Lab | Snap | Python

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 2/5; 1,234; 9,999999, 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:
300=3×10podstawa2wykładnik
Ponieważ komputery używają systemu binarnego zamiast systemu dziesiętnego, podstawą dla liczb zmiennoprzecinkowych jest 2 zamiast 10. Z tego powodu liczby, które są dokładnie potęgami 2, są najprostsze do przedstawienia:
128=1×27256=1×28
Liczby między potęgami 2 wyglądają tak:
160=1,25×27192=1,50×27224=1,75×27
Co z liczbami niecałkowitymi? Ponownie, potęgi liczby 2 są najprostsze do przedstawienia.
0,50=1×210,25=1×22
Liczby zmiennoprzecinkowe mogą również reprezentować ułamki między potęgami 2:
0,750=1.5×210,375=1.5×22
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 0,375 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 1/3 i jego zmiennoprzecinkową reprezentację:
1/3=1,3×22
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 1/10 (czyli krótkie 0,1 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ć 0,1+0,1+0,1. W świecie niekomputerowym wiemy, że jest to 0,3. Ale w komputerze każda z wartości 0,1 jest zapisywana jako zaokrąglony ułamek binarny, a gdy zostaną dodane razem, nie do końca odpowiadają one temu, czego oczekujemy...
📝 Zobacz podobny kod w: App Lab | Snap | Python
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
Rozumiesz angielski? Kliknij tutaj, aby zobaczyć więcej dyskusji na angielskiej wersji strony Khan Academy.